diff options
-rw-r--r-- | drivers/md/bcache/bcache.h | 1 | ||||
-rw-r--r-- | drivers/md/bcache/chardev.c | 45 | ||||
-rw-r--r-- | drivers/md/bcache/fs.c | 2 | ||||
-rw-r--r-- | drivers/md/bcache/sysfs.c | 3 | ||||
-rw-r--r-- | include/uapi/linux/bcache-ioctl.h | 6 |
5 files changed, 48 insertions, 9 deletions
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h index 3b65a408ceaa..eb29c1e2792f 100644 --- a/drivers/md/bcache/bcache.h +++ b/drivers/md/bcache/bcache.h @@ -816,6 +816,7 @@ static inline unsigned block_bytes(struct cache_set *c) /* Forward declarations */ +long bch_cache_set_ioctl(struct cache_set *, unsigned, void __user *); long bch_chardev_ioctl(struct file *, unsigned, unsigned long); void bch_debug_exit(void); diff --git a/drivers/md/bcache/chardev.c b/drivers/md/bcache/chardev.c index 447c55db4a90..f1874211e94b 100644 --- a/drivers/md/bcache/chardev.c +++ b/drivers/md/bcache/chardev.c @@ -94,6 +94,18 @@ static long bch_ioctl_incremental(struct bch_ioctl_incremental __user *user_arg) return 0; } +static long bch_global_ioctl(unsigned cmd, void __user *arg) +{ + switch (cmd) { + case BCH_IOCTL_ASSEMBLE: + return bch_ioctl_assemble(arg); + case BCH_IOCTL_INCREMENTAL: + return bch_ioctl_incremental(arg); + default: + return -ENOTTY; + } +} + static long bch_ioctl_stop(struct cache_set *c) { bch_cache_set_stop(c); @@ -247,20 +259,27 @@ static long bch_ioctl_disk_fail_by_uuid(struct cache_set *c, return ret; } -long bch_chardev_ioctl(struct file *filp, unsigned cmd, unsigned long v) +static long bch_ioctl_query_uuid(struct cache_set *c, + struct bch_ioctl_query_uuid __user *user_arg) { - struct cache_set *c = filp->private_data; - void __user *arg = (void __user *) v; + return copy_to_user(&user_arg->uuid, + &c->disk_sb.user_uuid, + sizeof(c->disk_sb.user_uuid)); +} + +long bch_cache_set_ioctl(struct cache_set *c, unsigned cmd, void __user *arg) +{ + /* ioctls that don't require admin cap: */ + switch (cmd) { + case BCH_IOCTL_QUERY_UUID: + return bch_ioctl_query_uuid(c, arg); + } if (!capable(CAP_SYS_ADMIN)) return -EPERM; + /* ioctls that do require admin cap: */ switch (cmd) { - case BCH_IOCTL_ASSEMBLE: - return bch_ioctl_assemble(arg); - case BCH_IOCTL_INCREMENTAL: - return bch_ioctl_incremental(arg); - case BCH_IOCTL_RUN: return -ENOTTY; case BCH_IOCTL_STOP: @@ -282,3 +301,13 @@ long bch_chardev_ioctl(struct file *filp, unsigned cmd, unsigned long v) return -ENOTTY; } } + +long bch_chardev_ioctl(struct file *filp, unsigned cmd, unsigned long v) +{ + struct cache_set *c = filp->private_data; + void __user *arg = (void __user *) v; + + return c + ? bch_cache_set_ioctl(c, cmd, arg) + : bch_global_ioctl(cmd, arg); +} diff --git a/drivers/md/bcache/fs.c b/drivers/md/bcache/fs.c index 5f7680f68aed..41b0464ae5e2 100644 --- a/drivers/md/bcache/fs.c +++ b/drivers/md/bcache/fs.c @@ -1801,7 +1801,7 @@ setflags_out: return 0; default: - return -ENOTTY; + return bch_cache_set_ioctl(c, cmd, (void __user *) arg); } } diff --git a/drivers/md/bcache/sysfs.c b/drivers/md/bcache/sysfs.c index 61b68e03a6e8..278d431b6fe6 100644 --- a/drivers/md/bcache/sysfs.c +++ b/drivers/md/bcache/sysfs.c @@ -60,6 +60,7 @@ write_attribute(blockdev_volume_create); write_attribute(add_device); read_attribute(uuid); +read_attribute(minor); read_attribute(bucket_size); read_attribute(bucket_size_bytes); read_attribute(block_size); @@ -647,6 +648,8 @@ SHOW(bch_cache_set) { struct cache_set *c = container_of(kobj, struct cache_set, kobj); + sysfs_print(minor, c->minor); + sysfs_print(journal_delay_ms, c->journal.delay_ms); sysfs_hprint(block_size, block_bytes(c)); diff --git a/include/uapi/linux/bcache-ioctl.h b/include/uapi/linux/bcache-ioctl.h index ab0aba824a85..8ca2fdbe209b 100644 --- a/include/uapi/linux/bcache-ioctl.h +++ b/include/uapi/linux/bcache-ioctl.h @@ -30,6 +30,8 @@ extern "C" { #define BCH_IOCTL_DISK_FAIL_BY_UUID \ _IOW('r', 6, struct bch_ioctl_disk_fail_by_uuid) +#define BCH_IOCTL_QUERY_UUID _IOR('r', 6, struct bch_ioctl_query_uuid) + struct bch_ioctl_assemble { __u32 flags; __u32 nr_devs; @@ -73,6 +75,10 @@ struct bch_ioctl_disk_fail_by_uuid { uuid_le dev; }; +struct bch_ioctl_query_uuid { + uuid_le uuid; +}; + #ifdef __cplusplus } #endif |