|
|
Subscribe / Log in / New account

Argument type for FS_IOC_GETFLAGS/FS_IOC_SETFLAGS ioctls

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



to post comments


Copyright © 2013, Eklektix, Inc.
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds