btrfs: balance filter: add limit of processed chunks
This started as debugging helper, to watch the effects of converting between raid levels on multiple devices, but could be useful standalone. In my case the usage filter was not finegrained enough and led to converting too many chunks at once. Another example use is in connection with drange+devid or vrange filters that allow to work with a specific chunk or even with a chunk on a given device. The limit filter applies last, the value of 0 means no limiting. CC: Ilya Dryomov <idryomov@gmail.com> CC: Hugo Mills <hugo@carfax.org.uk> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com>
This commit is contained in:

committed by
Chris Mason

parent
fc19c5e736
commit
7d824b6f9c
@@ -2922,6 +2922,16 @@ static int should_balance_chunk(struct btrfs_root *root,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* limited by count, must be the last filter
|
||||
*/
|
||||
if ((bargs->flags & BTRFS_BALANCE_ARGS_LIMIT)) {
|
||||
if (bargs->limit == 0)
|
||||
return 0;
|
||||
else
|
||||
bargs->limit--;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2944,6 +2954,9 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
|
||||
int ret;
|
||||
int enospc_errors = 0;
|
||||
bool counting = true;
|
||||
u64 limit_data = bctl->data.limit;
|
||||
u64 limit_meta = bctl->meta.limit;
|
||||
u64 limit_sys = bctl->sys.limit;
|
||||
|
||||
/* step one make some room on all the devices */
|
||||
devices = &fs_info->fs_devices->devices;
|
||||
@@ -2982,6 +2995,11 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
|
||||
memset(&bctl->stat, 0, sizeof(bctl->stat));
|
||||
spin_unlock(&fs_info->balance_lock);
|
||||
again:
|
||||
if (!counting) {
|
||||
bctl->data.limit = limit_data;
|
||||
bctl->meta.limit = limit_meta;
|
||||
bctl->sys.limit = limit_sys;
|
||||
}
|
||||
key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
|
||||
key.offset = (u64)-1;
|
||||
key.type = BTRFS_CHUNK_ITEM_KEY;
|
||||
|
Reference in New Issue
Block a user