diff options
author | David Sterba <dsterba@suse.cz> | 2012-06-22 08:30:39 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2012-07-23 15:41:40 -0400 |
commit | b27f7c0c150f74564b5d4c6c24a03c5226bf6327 (patch) | |
tree | d26d8b2929a883783666836b9ec6808bdcb0f3fd /fs/btrfs | |
parent | a43a21113365e5a9b59efc411da715d910cca87c (diff) |
btrfs: join DEV_STATS ioctls to one
Commit c11d2c236cc260b36 (Btrfs: add ioctl to get and reset the device
stats) introduced two ioctls doing almost the same thing distinguished
by just the ioctl number which encodes "do reset after read". I have
suggested
http://www.mail-archive.com/linux-btrfs@vger.kernel.org/msg16604.html
to implement it via the ioctl args. This hasn't happen, and I think we
should use a more clean way to pass flags and should not waste ioctl
numbers.
CC: Stefan Behrens <sbehrens@giantdisaster.de>
Signed-off-by: David Sterba <dsterba@suse.cz>
Diffstat (limited to 'fs/btrfs')
-rw-r--r-- | fs/btrfs/ioctl.c | 16 | ||||
-rw-r--r-- | fs/btrfs/ioctl.h | 6 | ||||
-rw-r--r-- | fs/btrfs/volumes.c | 5 | ||||
-rw-r--r-- | fs/btrfs/volumes.h | 3 |
4 files changed, 15 insertions, 15 deletions
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c index 9ec23b93e019..3a3f916d7c02 100644 --- a/fs/btrfs/ioctl.c +++ b/fs/btrfs/ioctl.c | |||
@@ -3065,19 +3065,21 @@ static long btrfs_ioctl_scrub_progress(struct btrfs_root *root, | |||
3065 | } | 3065 | } |
3066 | 3066 | ||
3067 | static long btrfs_ioctl_get_dev_stats(struct btrfs_root *root, | 3067 | static long btrfs_ioctl_get_dev_stats(struct btrfs_root *root, |
3068 | void __user *arg, int reset_after_read) | 3068 | void __user *arg) |
3069 | { | 3069 | { |
3070 | struct btrfs_ioctl_get_dev_stats *sa; | 3070 | struct btrfs_ioctl_get_dev_stats *sa; |
3071 | int ret; | 3071 | int ret; |
3072 | 3072 | ||
3073 | if (reset_after_read && !capable(CAP_SYS_ADMIN)) | ||
3074 | return -EPERM; | ||
3075 | |||
3076 | sa = memdup_user(arg, sizeof(*sa)); | 3073 | sa = memdup_user(arg, sizeof(*sa)); |
3077 | if (IS_ERR(sa)) | 3074 | if (IS_ERR(sa)) |
3078 | return PTR_ERR(sa); | 3075 | return PTR_ERR(sa); |
3079 | 3076 | ||
3080 | ret = btrfs_get_dev_stats(root, sa, reset_after_read); | 3077 | if ((sa->flags & BTRFS_DEV_STATS_RESET) && !capable(CAP_SYS_ADMIN)) { |
3078 | kfree(sa); | ||
3079 | return -EPERM; | ||
3080 | } | ||
3081 | |||
3082 | ret = btrfs_get_dev_stats(root, sa); | ||
3081 | 3083 | ||
3082 | if (copy_to_user(arg, sa, sizeof(*sa))) | 3084 | if (copy_to_user(arg, sa, sizeof(*sa))) |
3083 | ret = -EFAULT; | 3085 | ret = -EFAULT; |
@@ -3475,9 +3477,7 @@ long btrfs_ioctl(struct file *file, unsigned int | |||
3475 | case BTRFS_IOC_BALANCE_PROGRESS: | 3477 | case BTRFS_IOC_BALANCE_PROGRESS: |
3476 | return btrfs_ioctl_balance_progress(root, argp); | 3478 | return btrfs_ioctl_balance_progress(root, argp); |
3477 | case BTRFS_IOC_GET_DEV_STATS: | 3479 | case BTRFS_IOC_GET_DEV_STATS: |
3478 | return btrfs_ioctl_get_dev_stats(root, argp, 0); | 3480 | return btrfs_ioctl_get_dev_stats(root, argp); |
3479 | case BTRFS_IOC_GET_AND_RESET_DEV_STATS: | ||
3480 | return btrfs_ioctl_get_dev_stats(root, argp, 1); | ||
3481 | } | 3481 | } |
3482 | 3482 | ||
3483 | return -ENOTTY; | 3483 | return -ENOTTY; |
diff --git a/fs/btrfs/ioctl.h b/fs/btrfs/ioctl.h index e440aa653c30..021c55ed8aed 100644 --- a/fs/btrfs/ioctl.h +++ b/fs/btrfs/ioctl.h | |||
@@ -285,9 +285,13 @@ enum btrfs_dev_stat_values { | |||
285 | BTRFS_DEV_STAT_VALUES_MAX | 285 | BTRFS_DEV_STAT_VALUES_MAX |
286 | }; | 286 | }; |
287 | 287 | ||
288 | /* Reset statistics after reading; needs SYS_ADMIN capability */ | ||
289 | #define BTRFS_DEV_STATS_RESET (1ULL << 0) | ||
290 | |||
288 | struct btrfs_ioctl_get_dev_stats { | 291 | struct btrfs_ioctl_get_dev_stats { |
289 | __u64 devid; /* in */ | 292 | __u64 devid; /* in */ |
290 | __u64 nr_items; /* in/out */ | 293 | __u64 nr_items; /* in/out */ |
294 | __u64 flags; /* in/out */ | ||
291 | 295 | ||
292 | /* out values: */ | 296 | /* out values: */ |
293 | __u64 values[BTRFS_DEV_STAT_VALUES_MAX]; | 297 | __u64 values[BTRFS_DEV_STAT_VALUES_MAX]; |
@@ -361,7 +365,5 @@ struct btrfs_ioctl_get_dev_stats { | |||
361 | struct btrfs_ioctl_ino_path_args) | 365 | struct btrfs_ioctl_ino_path_args) |
362 | #define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ | 366 | #define BTRFS_IOC_GET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 52, \ |
363 | struct btrfs_ioctl_get_dev_stats) | 367 | struct btrfs_ioctl_get_dev_stats) |
364 | #define BTRFS_IOC_GET_AND_RESET_DEV_STATS _IOWR(BTRFS_IOCTL_MAGIC, 53, \ | ||
365 | struct btrfs_ioctl_get_dev_stats) | ||
366 | 368 | ||
367 | #endif | 369 | #endif |
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index ecaad40e7ef4..957bf393ab46 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c | |||
@@ -4890,8 +4890,7 @@ static void btrfs_dev_stat_print_on_load(struct btrfs_device *dev) | |||
4890 | } | 4890 | } |
4891 | 4891 | ||
4892 | int btrfs_get_dev_stats(struct btrfs_root *root, | 4892 | int btrfs_get_dev_stats(struct btrfs_root *root, |
4893 | struct btrfs_ioctl_get_dev_stats *stats, | 4893 | struct btrfs_ioctl_get_dev_stats *stats) |
4894 | int reset_after_read) | ||
4895 | { | 4894 | { |
4896 | struct btrfs_device *dev; | 4895 | struct btrfs_device *dev; |
4897 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; | 4896 | struct btrfs_fs_devices *fs_devices = root->fs_info->fs_devices; |
@@ -4909,7 +4908,7 @@ int btrfs_get_dev_stats(struct btrfs_root *root, | |||
4909 | printk(KERN_WARNING | 4908 | printk(KERN_WARNING |
4910 | "btrfs: get dev_stats failed, not yet valid\n"); | 4909 | "btrfs: get dev_stats failed, not yet valid\n"); |
4911 | return -ENODEV; | 4910 | return -ENODEV; |
4912 | } else if (reset_after_read) { | 4911 | } else if (stats->flags & BTRFS_DEV_STATS_RESET) { |
4913 | for (i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++) { | 4912 | for (i = 0; i < BTRFS_DEV_STAT_VALUES_MAX; i++) { |
4914 | if (stats->nr_items > i) | 4913 | if (stats->nr_items > i) |
4915 | stats->values[i] = | 4914 | stats->values[i] = |
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index 95f6637614db..e404414a95a9 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h | |||
@@ -293,8 +293,7 @@ struct btrfs_device *btrfs_find_device_for_logical(struct btrfs_root *root, | |||
293 | void btrfs_dev_stat_print_on_error(struct btrfs_device *device); | 293 | void btrfs_dev_stat_print_on_error(struct btrfs_device *device); |
294 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); | 294 | void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); |
295 | int btrfs_get_dev_stats(struct btrfs_root *root, | 295 | int btrfs_get_dev_stats(struct btrfs_root *root, |
296 | struct btrfs_ioctl_get_dev_stats *stats, | 296 | struct btrfs_ioctl_get_dev_stats *stats); |
297 | int reset_after_read); | ||
298 | int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info); | 297 | int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info); |
299 | int btrfs_run_dev_stats(struct btrfs_trans_handle *trans, | 298 | int btrfs_run_dev_stats(struct btrfs_trans_handle *trans, |
300 | struct btrfs_fs_info *fs_info); | 299 | struct btrfs_fs_info *fs_info); |