Argument type for FS_IOC_GETFLAGS/FS_IOC_SETFLAGS ioctls
[Posted December 10, 2013 by jake]
| From: |
| Aurelien Jarno <aurelien-AT-aurel32.net> |
| To: |
| Alexander Viro <viro-AT-zeniv.linux.org.uk> |
| Subject: |
| Argument type for FS_IOC_GETFLAGS/FS_IOC_SETFLAGS ioctls |
| Date: |
| Tue, 26 Nov 2013 21:05:59 +0100 |
| Message-ID: |
| <20131126200559.GH20559@hall.aurel32.net> |
| Cc: |
| linux-fsdevel-AT-vger.kernel.org, Robert Edmonds <edmonds-AT-debian.org>, Rob Browning <rlb-AT-defaultvalue.org> |
| Archive‑link: | |
Article |
Hi,
If I understand correctly how ioctl declarations works, FS_IOC_GETFLAGS
and FS_IOC_SETFLAGS ioctls take a pointer to a long argument, at least
according to include/uapi/linux/fs.h:
| #define FS_IOC_GETFLAGS _IOR('f', 1, long)
| #define FS_IOC_SETFLAGS _IOW('f', 2, long)
Not also the 32-bit compat versions of the ioctls takes an int:
| #define FS_IOC32_GETFLAGS _IOR('f', 1, int)
| #define FS_IOC32_SETFLAGS _IOW('f', 2, int)
However on the kernel side, all the filesystem interpret these values as
an int. For example in fs/ext4/ioctl.c:
| unsigned int flags;
| ...
| return put_user(flags, (int __user *) arg);
| ...
| if (get_user(flags, (int __user *) arg))
| ...
Most of the userland code seems to pass an int to this ioctl, but a few
others (e.g.: bup, libexplain) passes a long. While it doesn't make a
difference on little endian machines, it does make a difference on
64-bit big endian machines.
Could you please tell me if I am wrong in my analysis or if there is a
actually real problem?
Thanks,
Aurelien
--
Aurelien Jarno GPG: 1024D/F1BCDB73
aurelien@aurel32.net http://www.aurel32.net