Le 13/01/2020 à 21:34, Aleksandar Markovic a écrit :
> From: Aleksandar Markovic <amarkovic@wavecomp.com>
>
> Both FS_IOC_FSGETXATTR and FS_IOC_FSSETXATTR accept a pointer to
> the structure
>
> struct file_clone_range {
> __s64 src_fd;
> __u64 src_offset;
> __u64 src_length;
> __u64 dest_offset;
> };
>
> as their third argument.
There is a mismatch somewhere: they take 'struct fsxattr'.
'struct file_clone_range' is used by FICLONERANGE.
>
> These ioctls were relatively recently introduced, so the "#ifdef"
> guards are used in this implementation.
>
> Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
> ---
> linux-user/ioctls.h | 7 +++++++
> linux-user/syscall_defs.h | 2 ++
> 2 files changed, 9 insertions(+)
>
> diff --git a/linux-user/ioctls.h b/linux-user/ioctls.h
> index 3affd88..e1b89a7 100644
> --- a/linux-user/ioctls.h
> +++ b/linux-user/ioctls.h
> @@ -144,6 +144,13 @@
> IOCTL(FS_IOC32_SETFLAGS, IOC_W, MK_PTR(TYPE_INT))
> IOCTL(FS_IOC32_GETVERSION, IOC_R, MK_PTR(TYPE_INT))
> IOCTL(FS_IOC32_SETVERSION, IOC_W, MK_PTR(TYPE_INT))
> +#ifdef FS_IOC_FSGETXATTR
> + IOCTL(FS_IOC_FSGETXATTR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_fsxattr)))
> +#endif
> +#ifdef FS_IOC_FSSETXATTR
> + IOCTL(FS_IOC_FSSETXATTR, IOC_W, MK_PTR(MK_STRUCT(STRUCT_fsxattr)))
> +#endif
> +
>
> #ifdef CONFIG_USBFS
> /* USB ioctls */
> diff --git a/linux-user/syscall_defs.h b/linux-user/syscall_defs.h
> index a73cc3d..12cd3de 100644
> --- a/linux-user/syscall_defs.h
> +++ b/linux-user/syscall_defs.h
> @@ -924,6 +924,8 @@ struct target_pollfd {
> #define TARGET_FS_IOC32_SETFLAGS TARGET_IOW('f', 2, int)
> #define TARGET_FS_IOC32_GETVERSION TARGET_IOR('v', 1, int)
> #define TARGET_FS_IOC32_SETVERSION TARGET_IOW('v', 2, int)
> +#define TARGET_FS_IOC_FSGETXATTR TARGET_IOR('X', 31, struct file_clone_range)
> +#define TARGET_FS_IOC_FSSETXATTR TARGET_IOR('X', 32, struct file_clone_range)
Do you need also a "#if" around this?
Because I think the structure is only defined if the IOCTL is defined.
>
> /* usb ioctls */
> #define TARGET_USBDEVFS_CONTROL TARGET_IOWRU('U', 0)
>
Thanks,
Laurent