[PATCH] Bionic lacks transparent LFS migrations; provide a workaround
Matt Whitlock
busybox at mattwhitlock.name
Sat Apr 25 20:06:23 UTC 2015
On Saturday, 25 April 2015, at 11:38 am, Rich Felker wrote:
> On Sat, Apr 25, 2015 at 04:53:33AM -0400, Matt Whitlock wrote:
> > This solves some of the problems arising from Bionic's off_t being
> > 32 bits wide despite _FILE_OFFSET_BITS==64. See BusyBox bug #6908.
> >
> > Note that this doesn't solve all such problems since Bionic lacks
> > 64-bit variants of many standard I/O functions: open, creat, lockf,
> > posix_fadvise, posix_fallocate, truncate, sendfile, getrlimit,
> > setrlimit, fopen, freopen, fseeko, ftello, fgetpos, fsetpos,
> > mkstemp.
>
> As long as that's the case, I think this approach of trying to fake
> 64-bit off_t on Bionic is dangerous and probably best omitted. IMO we
> should either be pushing for Bionic to fix these things or sticking
> with 32-bit off_t on Bionic and treating that as a limitation of the
> platform.
Don't throw the baby out with the bathwater. Bionic *does* support large files. In fact, it's mandatory in some cases: there are no 32-bit versions of stat(), lstat(), fstat(), fstatat(), statfs(), fstatfs(), or getdents(); and struct stat, struct statfs, and struct dirent are equivalent to struct stat64, struct statfs64, and struct dirent64 from Glibc, respectively.
Furthermore, while Bionic does support 32-bit lseek(), pread(), pwrite(), and ftruncate() with 32-bit off_t, it does also have lseek64(), pread64(), pwrite64(), and ftruncate64() with off64_t.
In short, Bionic has most of the syscall-level support introduced by _LARGEFILE64_SOURCE in Glibc, but they did not implement the transparent migration introduced by _FILE_OFFSET_BITS==64. This is easy to implement atop Bionic, however, as it is simply a matter of mapping the relevant 32-bit types and functions to their 64-bit equivalents. (See feature_test_macros(7).)
Bionic does *not* implement the 64-bit stdio functions, but those use a different type (fpos_t instead of off_t) and so are not affected by this patch.
Would you be more willing to apply this patch if I were to produce a unit test suite demonstrating that 64-bit file syscalls work with off_t while stdio functions remain 32-bit with fpos_t?
More information about the busybox
mailing list