From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx1.redhat.com ([209.132.183.28]:57848 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751041AbcHRI5Y (ORCPT ); Thu, 18 Aug 2016 04:57:24 -0400 Subject: Re: [glibc PATCH] fcntl: put F_OFD_* constants under #ifdef __USE_FILE_OFFSET64 To: Jeff Layton , Mike Frysinger References: <1471445251-2450-1-git-send-email-jlayton@redhat.com> <20160817184333.GC21655@vapier.lan> <1471461304.3196.101.camel@redhat.com> <1471464343.3196.125.camel@redhat.com> <20160817203746.GF21655@vapier.lan> <1471467478.3196.143.camel@redhat.com> Cc: "Michael Kerrisk (man-pages)" , libc-alpha@sourceware.org, linux-fsdevel@vger.kernel.org, "Carlos O'Donell" , Yuriy Kolerov From: Florian Weimer Message-ID: <54f026b6-3d37-04b9-66db-4d885061fdf8@redhat.com> Date: Thu, 18 Aug 2016 10:57:21 +0200 MIME-Version: 1.0 In-Reply-To: <1471467478.3196.143.camel@redhat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Sender: linux-fsdevel-owner@vger.kernel.org List-ID: 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 >> >> > > 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