aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs
diff options
context:
space:
mode:
authorDavid Sterba <dsterba@suse.cz>2012-06-22 08:30:39 -0400
committerChris Mason <chris.mason@fusionio.com>2012-07-23 15:41:40 -0400
commitb27f7c0c150f74564b5d4c6c24a03c5226bf6327 (patch)
treed26d8b2929a883783666836b9ec6808bdcb0f3fd /fs/btrfs
parenta43a21113365e5a9b59efc411da715d910cca87c (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.c16
-rw-r--r--fs/btrfs/ioctl.h6
-rw-r--r--fs/btrfs/volumes.c5
-rw-r--r--fs/btrfs/volumes.h3
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
3067static long btrfs_ioctl_get_dev_stats(struct btrfs_root *root, 3067static 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
288struct btrfs_ioctl_get_dev_stats { 291struct 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
4892int btrfs_get_dev_stats(struct btrfs_root *root, 4892int 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,
293void btrfs_dev_stat_print_on_error(struct btrfs_device *device); 293void btrfs_dev_stat_print_on_error(struct btrfs_device *device);
294void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index); 294void btrfs_dev_stat_inc_and_print(struct btrfs_device *dev, int index);
295int btrfs_get_dev_stats(struct btrfs_root *root, 295int 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);
298int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info); 297int btrfs_init_dev_stats(struct btrfs_fs_info *fs_info);
299int btrfs_run_dev_stats(struct btrfs_trans_handle *trans, 298int btrfs_run_dev_stats(struct btrfs_trans_handle *trans,
300 struct btrfs_fs_info *fs_info); 299 struct btrfs_fs_info *fs_info);