mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-10 16:58:47 +03:00
scan: setup bcache for commands using lvmetad
Commands using lvmetad will not begin with a proper label_scan which initializes bcache, but may later decide they need to scan a set of devs, in which case they'll need bcache set up at that point.
This commit is contained in:
parent
6e580465b5
commit
7bce66c5e8
@ -570,6 +570,38 @@ static int _scan_list(struct dm_list *devs, int *failed)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int _setup_bcache(int cache_blocks)
|
||||||
|
{
|
||||||
|
struct io_engine *ioe;
|
||||||
|
|
||||||
|
/* No devices can happen, just create bcache with any small number. */
|
||||||
|
if (!cache_blocks)
|
||||||
|
cache_blocks = 8;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 100 is arbitrary, it's the max number of concurrent aio's
|
||||||
|
* possible, i.e, the number of devices that can be read at
|
||||||
|
* once. Should this be configurable?
|
||||||
|
*/
|
||||||
|
if (!(ioe = create_async_io_engine(100))) {
|
||||||
|
log_error("Failed to create bcache io engine.");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure one cache block for each device on the system.
|
||||||
|
* We won't generally need to cache that many because some
|
||||||
|
* of the devs will not be lvm devices, and we don't need
|
||||||
|
* an entry for those. We might want to change this.
|
||||||
|
*/
|
||||||
|
if (!(scan_bcache = bcache_create(BCACHE_BLOCK_SIZE_IN_SECTORS, cache_blocks, ioe))) {
|
||||||
|
log_error("Failed to create bcache with %d cache blocks.", cache_blocks);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan and cache lvm data from all devices on the system.
|
* Scan and cache lvm data from all devices on the system.
|
||||||
* The cache should be empty/reset before calling this.
|
* The cache should be empty/reset before calling this.
|
||||||
@ -581,8 +613,6 @@ int label_scan(struct cmd_context *cmd)
|
|||||||
struct dev_iter *iter;
|
struct dev_iter *iter;
|
||||||
struct device_list *devl;
|
struct device_list *devl;
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
struct io_engine *ioe;
|
|
||||||
int cache_blocks;
|
|
||||||
|
|
||||||
log_debug_devs("Finding devices to scan");
|
log_debug_devs("Finding devices to scan");
|
||||||
|
|
||||||
@ -621,25 +651,11 @@ int label_scan(struct cmd_context *cmd)
|
|||||||
dev_iter_destroy(iter);
|
dev_iter_destroy(iter);
|
||||||
|
|
||||||
if (!scan_bcache) {
|
if (!scan_bcache) {
|
||||||
/* No devices can happen, just create bcache with any small number. */
|
|
||||||
if (!(cache_blocks = dm_list_size(&all_devs)))
|
|
||||||
cache_blocks = 8;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 100 is arbitrary, it's the max number of concurrent aio's
|
* FIXME: there should probably be some max number of
|
||||||
* possible, i.e, the number of devices that can be read at
|
* cache blocks we use when setting up bcache.
|
||||||
* once. Should this be configurable?
|
|
||||||
*/
|
*/
|
||||||
if (!(ioe = create_async_io_engine(100)))
|
if (!_setup_bcache(dm_list_size(&all_devs)))
|
||||||
return 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Configure one cache block for each device on the system.
|
|
||||||
* We won't generally need to cache that many because some
|
|
||||||
* of the devs will not be lvm devices, and we don't need
|
|
||||||
* an entry for those. We might want to change this.
|
|
||||||
*/
|
|
||||||
if (!(scan_bcache = bcache_create(BCACHE_BLOCK_SIZE_IN_SECTORS, cache_blocks, ioe)))
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -660,6 +676,18 @@ int label_scan_devs(struct cmd_context *cmd, struct dm_list *devs)
|
|||||||
{
|
{
|
||||||
struct device_list *devl;
|
struct device_list *devl;
|
||||||
|
|
||||||
|
if (!scan_bcache) {
|
||||||
|
/*
|
||||||
|
* This is only needed when commands are using lvmetad, in
|
||||||
|
* which case they don't do an initial label_scan, but may
|
||||||
|
* later need to rescan certain devs from disk and call this
|
||||||
|
* function.
|
||||||
|
* FIXME: is there some better number to choose here?
|
||||||
|
*/
|
||||||
|
if (!_setup_bcache(32))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
dm_list_iterate_items(devl, devs) {
|
dm_list_iterate_items(devl, devs) {
|
||||||
if (_in_bcache(devl->dev)) {
|
if (_in_bcache(devl->dev)) {
|
||||||
bcache_invalidate_fd(scan_bcache, devl->dev->bcache_fd);
|
bcache_invalidate_fd(scan_bcache, devl->dev->bcache_fd);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user