[glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64
Florian Weimer
fweimer@redhat.com
Thu Aug 18 08:57:00 GMT 2016
On 08/17/2016 10:57 PM, Jeff Layton wrote:
> On Wed, 2016-08-17 at 13:37 -0700, Mike Frysinger wrote:
>> 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>
>>
>
> Ok, I was being a little cavalier with my description. This is what
> really happens (from x86 struct flock definition):
>
> struct flock
> {
> short int l_type; /* Type of lock: F_RDLCK, F_WRLCK, or F_UNLCK. */
> short int l_whence; /* Where `l_start' is relative to (like `lseek'). */
> #ifndef __USE_FILE_OFFSET64
> __off_t l_start; /* Offset where the lock begins. */
> __off_t l_len; /* Size of the locked area; zero means until EOF. */
> #else
> __off64_t l_start; /* Offset where the lock begins. */
> __off64_t l_len; /* Size of the locked area; zero means until EOF. */
> #endif
> __pid_t l_pid; /* Process holding the lock. */
> };
>
> So, l_start and l_len get redefined into larger sizes when LFS is
> enabled. The F_GETLK/F_SETLK/F_SETLKW are also redefined to their *64
> equivalents in that case using the preprocessor.
Note that LFS and 64-bit off_t are separate. Only LFS
(_LARGEFILE_SOURCE, _LARGEFILE64_SOURCE) is implied by _GNU_SOURCE.
We do not really have a working fcntl for _LARGEFILE64_SOURCE and
_FILE_OFFSET_BITS == 32.
Florian
More information about the Libc-alpha
mailing list