diff options
-rw-r--r-- | fs/bcachefs/bcachefs_ioctl.h | 5 | ||||
-rw-r--r-- | fs/bcachefs/chardev.c | 18 |
2 files changed, 23 insertions, 0 deletions
diff --git a/fs/bcachefs/bcachefs_ioctl.h b/fs/bcachefs/bcachefs_ioctl.h index e02e7ebf7f66..a6f024f1d0f4 100644 --- a/fs/bcachefs/bcachefs_ioctl.h +++ b/fs/bcachefs/bcachefs_ioctl.h @@ -49,6 +49,7 @@ struct bch_ioctl_incremental { #define BCH_IOCTL_DATA _IOW(0xbc, 10, struct bch_ioctl_data) #define BCH_IOCTL_USAGE _IOWR(0xbc, 11, struct bch_ioctl_usage) #define BCH_IOCTL_READ_SUPER _IOW(0xbc, 12, struct bch_ioctl_read_super) +#define BCH_IOCTL_DISK_GET_IDX _IOW(0xbc, 13, struct bch_ioctl_disk_get_idx) struct bch_ioctl_query_uuid { uuid_le uuid; @@ -134,4 +135,8 @@ struct bch_ioctl_read_super { __u64 sb; }; +struct bch_ioctl_disk_get_idx { + __u64 dev; +}; + #endif /* _BCACHEFS_IOCTL_H */ diff --git a/fs/bcachefs/chardev.c b/fs/bcachefs/chardev.c index ccccd98f5a3e..bc011cb27521 100644 --- a/fs/bcachefs/chardev.c +++ b/fs/bcachefs/chardev.c @@ -403,6 +403,22 @@ err: return ret; } +static long bch2_ioctl_disk_get_idx(struct bch_fs *c, + struct bch_ioctl_disk_get_idx arg) +{ + dev_t dev = huge_decode_dev(arg.dev); + struct bch_dev *ca; + unsigned i; + + for_each_online_member(ca, c, i) + if (ca->disk_sb.bdev->bd_dev == dev) { + percpu_ref_put(&ca->io_ref); + return i; + } + + return -ENOENT; +} + #define BCH_IOCTL(_name, _argtype) \ do { \ _argtype i; \ @@ -446,6 +462,8 @@ long bch2_fs_ioctl(struct bch_fs *c, unsigned cmd, void __user *arg) BCH_IOCTL(disk_evacuate, struct bch_ioctl_disk); case BCH_IOCTL_READ_SUPER: BCH_IOCTL(read_super, struct bch_ioctl_read_super); + case BCH_IOCTL_DISK_GET_IDX: + BCH_IOCTL(disk_get_idx, struct bch_ioctl_disk_get_idx); default: return -ENOTTY; |