[glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64
Mike Frysinger
vapier@gentoo.org
Wed Aug 17 20:37:00 GMT 2016
On 17 Aug 2016 16:05, Jeff Layton wrote:
> The way it works now is that when you define _FILE_OFFSET_BITS=64 and
> call fcntl(fd, F_SETLK, fl) glibc swaps in a struct flock64 for your
> struct flock, and F_SETLK64 for the F_SETLK.
does it ? doesn't seem like it does to me. here's glibc's fcntl.c:
io/fcntl.c - generic stub that sets ENOSYS
sysdeps/unix/sysv/linux/fcntl.c - just calls syscall(fcntl)
sysdeps/unix/sysv/linux/generic/wordsize-32/fcntl.c - just calls syscall(fcntl64)
sysdeps/unix/sysv/linux/i386/fcntl.c - same as above
<all the other 32-bit arches include the i386 file>
the kernel is where it gets interesting:
fs/compat.c:
COMPAT_SYSCALL_DEFINE3(fcntl):
rejects all 64-bit commands w/EINVAL
passes all other calls to compat_sys_fcntl64
COMPAT_SYSCALL_DEFINE3(fcntl64):
rewrites 32-bit flock struct to 64-bit flock struct
passes args to sys_fcntl
fs/fcntl.c:
SYSCALL_DEFINE3(fcntl):
passes all args to do_fcntl
SYSCALL_DEFINE3(fcntl64):
handles 64-bit flock commands
passes all others commands to do_fcntl
do_fcntl:
handles all commands using native sized flock struct
so for a 32-bit system (e.g. i386), you must match LFS & command usage.
if LFS is turned on, then using 32-bit commands w/struct flock fails.
if LFS is turned off, then using 64-bit commands w/struct flock fails.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20160817/d93b245d/attachment.sig>
More information about the Libc-alpha
mailing list