summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/md/bcache/bcache.h1
-rw-r--r--drivers/md/bcache/chardev.c45
-rw-r--r--drivers/md/bcache/fs.c2
-rw-r--r--drivers/md/bcache/sysfs.c3
-rw-r--r--include/uapi/linux/bcache-ioctl.h6
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