Commit c071fcfd authored by Chris Mason's avatar Chris Mason

Btrfs: fix ioctl arg size (userland incompatible change!)

The structure used to send device in btrfs ioctl calls was not
properly aligned, and so 32 bit ioctls would not work properly on
64 bit kernels.

We could fix this with compat ioctls, but we're just one byte away
and it doesn't make sense at this stage to carry about the compat ioctls
forever at this stage in the project.

This patch brings the ioctl arg up to an evenly aligned 4k.
Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent 1d9e2ae9
...@@ -22,13 +22,20 @@ ...@@ -22,13 +22,20 @@
#define BTRFS_IOCTL_MAGIC 0x94 #define BTRFS_IOCTL_MAGIC 0x94
#define BTRFS_VOL_NAME_MAX 255 #define BTRFS_VOL_NAME_MAX 255
#define BTRFS_PATH_NAME_MAX 3072 #define BTRFS_PATH_NAME_MAX 4087
/* this should be 4k */
struct btrfs_ioctl_vol_args { struct btrfs_ioctl_vol_args {
__s64 fd; __s64 fd;
char name[BTRFS_PATH_NAME_MAX + 1]; char name[BTRFS_PATH_NAME_MAX + 1];
}; };
struct btrfs_ioctl_clone_range_args {
__s64 src_fd;
__u64 src_offset, src_length;
__u64 dest_offset;
};
#define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \ #define BTRFS_IOC_SNAP_CREATE _IOW(BTRFS_IOCTL_MAGIC, 1, \
struct btrfs_ioctl_vol_args) struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \ #define BTRFS_IOC_DEFRAG _IOW(BTRFS_IOCTL_MAGIC, 2, \
...@@ -52,11 +59,6 @@ struct btrfs_ioctl_vol_args { ...@@ -52,11 +59,6 @@ struct btrfs_ioctl_vol_args {
struct btrfs_ioctl_vol_args) struct btrfs_ioctl_vol_args)
#define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \ #define BTRFS_IOC_BALANCE _IOW(BTRFS_IOCTL_MAGIC, 12, \
struct btrfs_ioctl_vol_args) struct btrfs_ioctl_vol_args)
struct btrfs_ioctl_clone_range_args {
__s64 src_fd;
__u64 src_offset, src_length;
__u64 dest_offset;
};
#define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \ #define BTRFS_IOC_CLONE_RANGE _IOW(BTRFS_IOCTL_MAGIC, 13, \
struct btrfs_ioctl_clone_range_args) struct btrfs_ioctl_clone_range_args)
......
...@@ -582,7 +582,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, ...@@ -582,7 +582,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
{ {
struct btrfs_ioctl_vol_args *vol; struct btrfs_ioctl_vol_args *vol;
struct btrfs_fs_devices *fs_devices; struct btrfs_fs_devices *fs_devices;
int ret = 0; int ret = -ENOTTY;
int len; int len;
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_ADMIN))
...@@ -594,6 +594,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd, ...@@ -594,6 +594,7 @@ static long btrfs_control_ioctl(struct file *file, unsigned int cmd,
goto out; goto out;
} }
len = strnlen(vol->name, BTRFS_PATH_NAME_MAX); len = strnlen(vol->name, BTRFS_PATH_NAME_MAX);
switch (cmd) { switch (cmd) {
case BTRFS_IOC_SCAN_DEV: case BTRFS_IOC_SCAN_DEV:
ret = btrfs_scan_one_device(vol->name, FMODE_READ, ret = btrfs_scan_one_device(vol->name, FMODE_READ,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment