[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