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
Attachment:
signature.asc
Description: Digital signature