X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=ioctl.h;h=709e996f401c32fc625106fc15f105ba1fe7f835;hb=90a16b10b328d63ea90b3f4a04fd52a0bc0b689f;hp=a7235c00c1a0f112c6ba0b49cbc7aebd9a6c120e;hpb=64b195d34feb8f7ad57344c994d62026714b1ba1;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/ioctl.h b/ioctl.h index a7235c0..709e996 100644 --- a/ioctl.h +++ b/ioctl.h @@ -25,11 +25,17 @@ extern "C" { #include #include +#include #ifndef __user #define __user #endif +/* We don't want to include entire kerncompat.h */ +#ifndef BUILD_ASSERT +#define BUILD_ASSERT(x) +#endif + #define BTRFS_IOCTL_MAGIC 0x94 #define BTRFS_VOL_NAME_MAX 255 @@ -570,6 +576,38 @@ struct btrfs_ioctl_received_subvol_args { BUILD_ASSERT(sizeof(struct btrfs_ioctl_received_subvol_args) == 200); /* + * If we have a 32-bit userspace and 64-bit kernel, then the UAPI + * structures are incorrect, as the timespec structure from userspace + * is 4 bytes too small. We define these alternatives here for backward + * compatibility, the kernel understands both values. + */ + +/* + * Structure size is different on 32bit and 64bit, has some padding if the + * structure is embedded. Packing makes sure the size is same on both, but will + * be misaligned on 64bit. + * + * NOTE: do not use in your code, this is for testing only + */ +struct btrfs_ioctl_timespec_32 { + __u64 sec; + __u32 nsec; +} __attribute__ ((__packed__)); + +struct btrfs_ioctl_received_subvol_args_32 { + char uuid[BTRFS_UUID_SIZE]; /* in */ + __u64 stransid; /* in */ + __u64 rtransid; /* out */ + struct btrfs_ioctl_timespec_32 stime; /* in */ + struct btrfs_ioctl_timespec_32 rtime; /* out */ + __u64 flags; /* in */ + __u64 reserved[16]; /* in */ +} __attribute__ ((__packed__)); +BUILD_ASSERT(sizeof(struct btrfs_ioctl_received_subvol_args_32) == 192); + +#define BTRFS_IOC_SET_RECEIVED_SUBVOL_32_COMPAT_DEFINED 1 + +/* * Caller doesn't want file data in the send stream, even if the * search of clone sources doesn't find an extent. UPDATE_EXTENT * commands will be sent instead of WRITE commands. @@ -603,8 +641,8 @@ struct btrfs_ioctl_send_args { __u64 reserved[4]; /* in */ }; /* - * Size of structure depends on pointer width, was not caught. Kernel handles - * pointer width differences transparently + * Size of structure depends on pointer width, was not caught in the early + * days. Kernel handles pointer width differences transparently. */ BUILD_ASSERT(sizeof(__u64 *) == 8 ? sizeof(struct btrfs_ioctl_send_args) == 72 @@ -612,6 +650,28 @@ BUILD_ASSERT(sizeof(__u64 *) == 8 ? sizeof(struct btrfs_ioctl_send_args) == 68 : 0)); +/* + * Different pointer width leads to structure size change. Kernel should accept + * both ioctl values (derived from the structures) for backward compatibility. + * Size of this structure is same on 32bit and 64bit though. + * + * NOTE: do not use in your code, this is for testing only + */ +struct btrfs_ioctl_send_args_64 { + __s64 send_fd; /* in */ + __u64 clone_sources_count; /* in */ + union { + __u64 __user *clone_sources; /* in */ + __u64 __clone_sources_alignment; + }; + __u64 parent_root; /* in */ + __u64 flags; /* in */ + __u64 reserved[4]; /* in */ +} __attribute__((packed)); +BUILD_ASSERT(sizeof(struct btrfs_ioctl_send_args_64) == 72); + +#define BTRFS_IOC_SEND_64_COMPAT_DEFINED 1 + /* Error codes as returned by the kernel */ enum btrfs_err_code { notused, @@ -723,6 +783,17 @@ static inline char *btrfs_err_str(enum btrfs_err_code err_code) struct btrfs_ioctl_logical_ino_args) #define BTRFS_IOC_SET_RECEIVED_SUBVOL _IOWR(BTRFS_IOCTL_MAGIC, 37, \ struct btrfs_ioctl_received_subvol_args) + +#ifdef BTRFS_IOC_SET_RECEIVED_SUBVOL_32_COMPAT_DEFINED +#define BTRFS_IOC_SET_RECEIVED_SUBVOL_32 _IOWR(BTRFS_IOCTL_MAGIC, 37, \ + struct btrfs_ioctl_received_subvol_args_32) +#endif + +#ifdef BTRFS_IOC_SEND_64_COMPAT_DEFINED +#define BTRFS_IOC_SEND_64 _IOW(BTRFS_IOCTL_MAGIC, 38, \ + struct btrfs_ioctl_send_args_64) +#endif + #define BTRFS_IOC_SEND _IOW(BTRFS_IOCTL_MAGIC, 38, struct btrfs_ioctl_send_args) #define BTRFS_IOC_DEVICES_READY _IOR(BTRFS_IOCTL_MAGIC, 39, \ struct btrfs_ioctl_vol_args)