aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2014-05-07 11:37:51 -0400
committerChris Mason <clm@fb.com>2014-06-09 20:20:26 -0400
commit7d824b6f9cf28917d8a05891ef423fb0e4e34c69 (patch)
treea362fbac437c6d997c9d389c9c934537d36fdb98 /fs/btrfs/volumes.c
parentfc19c5e73645f95d3eca12b4e91e7b56faf1e4a4 (diff)
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>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r--fs/btrfs/volumes.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 49d7fab73360..3b761a456acd 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2922,6 +2922,16 @@ static int should_balance_chunk(struct btrfs_root *root,
2922 return 0; 2922 return 0;
2923 } 2923 }
2924 2924
2925 /*
2926 * limited by count, must be the last filter
2927 */
2928 if ((bargs->flags & BTRFS_BALANCE_ARGS_LIMIT)) {
2929 if (bargs->limit == 0)
2930 return 0;
2931 else
2932 bargs->limit--;
2933 }
2934
2925 return 1; 2935 return 1;
2926} 2936}
2927 2937
@@ -2944,6 +2954,9 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
2944 int ret; 2954 int ret;
2945 int enospc_errors = 0; 2955 int enospc_errors = 0;
2946 bool counting = true; 2956 bool counting = true;
2957 u64 limit_data = bctl->data.limit;
2958 u64 limit_meta = bctl->meta.limit;
2959 u64 limit_sys = bctl->sys.limit;
2947 2960
2948 /* step one make some room on all the devices */ 2961 /* step one make some room on all the devices */
2949 devices = &fs_info->fs_devices->devices; 2962 devices = &fs_info->fs_devices->devices;
@@ -2982,6 +2995,11 @@ static int __btrfs_balance(struct btrfs_fs_info *fs_info)
2982 memset(&bctl->stat, 0, sizeof(bctl->stat)); 2995 memset(&bctl->stat, 0, sizeof(bctl->stat));
2983 spin_unlock(&fs_info->balance_lock); 2996 spin_unlock(&fs_info->balance_lock);
2984again: 2997again:
2998 if (!counting) {
2999 bctl->data.limit = limit_data;
3000 bctl->meta.limit = limit_meta;
3001 bctl->sys.limit = limit_sys;
3002 }
2985 key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID; 3003 key.objectid = BTRFS_FIRST_CHUNK_TREE_OBJECTID;
2986 key.offset = (u64)-1; 3004 key.offset = (u64)-1;
2987 key.type = BTRFS_CHUNK_ITEM_KEY; 3005 key.type = BTRFS_CHUNK_ITEM_KEY;