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
--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html