Remove sync_file_range()

After hearing horror stories from a trusted colleague, I don't think
this is the kind of API we want to be supporting. Also SQLite wisdom
regarding fdatasync() has been added to the documentation.
This commit is contained in:
Justine Tunney 2023-11-15 23:21:22 -08:00
parent 8318d67503
commit 8f5e516b39
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
14 changed files with 8 additions and 65 deletions

View file

@ -201,7 +201,6 @@ int setresuid(unsigned, unsigned, unsigned);
int getresgid(unsigned *, unsigned *, unsigned *);
int getresuid(unsigned *, unsigned *, unsigned *);
char *get_current_dir_name(void) __wur;
int sync_file_range(int, int64_t, int64_t, unsigned);
ssize_t splice(int, int64_t *, int, int64_t *, size_t, unsigned);
int memfd_create(const char *, unsigned int);
int execvpe(const char *, char *const[], char *const[]);

View file

@ -29,6 +29,11 @@
/**
* Blocks until kernel flushes non-metadata buffers for fd to disk.
*
* NOTE: For `IsXnu()` it's recommended that `fcntl(F_FULLFSYNC)` be
* favored instead of this function, and if that fails, the fallback
* path should call `fsync()` see the SQLite codebase. In the future
* Cosmopolitan might do this automatically.
*
* @return 0 on success, or -1 w/ errno
* @raise ECANCELED if thread was cancelled in masked mode
* @raise EROFS if `fd` is on a read-only filesystem e.g. /zip
@ -37,8 +42,8 @@
* @raise EBADF if `fd` isn't an open file
* @raise EINTR if signal was delivered
* @raise EIO if an i/o error happened
* @see sync(), fsync(), sync_file_range()
* @see __nosync to secretly disable
* @see sync(), fsync()
* @cancelationpoint
* @asyncsignalsafe
*/

View file

@ -37,8 +37,8 @@
* @raise EBADF if `fd` isn't an open file
* @raise EINTR if signal was delivered
* @raise EIO if an i/o error happened
* @see fdatasync(), sync_file_range()
* @see __nosync to secretly disable
* @see fdatasync()
* @cancelationpoint
* @asyncsignalsafe
*/

View file

@ -1,44 +0,0 @@
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
vi: set net ft=c ts=2 sts=2 sw=2 fenc=utf-8 :vi
Copyright 2020 Justine Alexandra Roberts Tunney
Permission to use, copy, modify, and/or distribute this software for
any purpose with or without fee is hereby granted, provided that the
above copyright notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
*/
#include "libc/calls/calls.h"
#include "libc/calls/syscall-sysv.internal.h"
#include "libc/errno.h"
/**
* Flushes subset of file to disk.
*
* @param offset is page rounded
* @param bytes is page rounded; 0 means until EOF
* @param flags can have SYNC_FILE_RANGE_{WAIT_BEFORE,WRITE,WAIT_AFTER}
* @note Linux documentation says this call is "dangerous"; for highest
* assurance of data recovery after crash, consider fsync() on both
* file and directory
* @see fsync(), fdatasync()
*/
int sync_file_range(int fd, int64_t offset, int64_t bytes, unsigned flags) {
int rc, olderr;
olderr = errno;
if ((rc = sys_sync_file_range(fd, offset, bytes, flags)) != -1 ||
errno != ENOSYS) {
return rc;
} else {
errno = olderr;
return fdatasync(fd);
}
}

View file

@ -108,7 +108,6 @@ i32 sys_sigaction(i32, const void *, void *, i64, i64);
i32 sys_sigaltstack(const void *, void *);
i32 sys_symlinkat(const char *, i32, const char *);
i32 sys_sync(void);
i32 sys_sync_file_range(i32, i64, i64, u32);
i32 sys_syncfs(i32);
i32 sys_syslog(i32, char *, i32);
i32 sys_tgkill(i32, i32, i32);

View file

@ -35,6 +35,7 @@
#include "libc/errno.h"
#include "libc/fmt/itoa.h"
#include "libc/intrin/bits.h"
#include "libc/intrin/kprintf.h"
#include "libc/intrin/strace.internal.h"
#include "libc/limits.h"
#include "libc/nt/dll.h"

View file

@ -1,2 +0,0 @@
#include "libc/sysv/macros.internal.h"
.scall sys_sync_file_range,0xfffffffffffff115,84,4095,globl,hidden

View file

@ -1461,10 +1461,6 @@ syscon misc EFD_CLOEXEC 0x080000 0x080000 0 0 0 0 0 0
syscon misc EFD_NONBLOCK 0x0800 0x0800 0 0 0 0 0 0
syscon misc EFD_SEMAPHORE 1 1 0 0 0 0 0 0
syscon misc SYNC_FILE_RANGE_WAIT_AFTER 4 4 0 0 0 0 0 0
syscon misc SYNC_FILE_RANGE_WAIT_BEFORE 1 1 0 0 0 0 0 0
syscon misc SYNC_FILE_RANGE_WRITE 2 2 0 0 0 0 0 0
syscon misc TEST_UNIT_READY 0 0 0 0 0 0 0 0
syscon misc TFD_CLOEXEC 0x080000 0x080000 0 0 0 0 0 0
syscon misc TFD_NONBLOCK 0x0800 0x0800 0 0 0 0 0 0
@ -1807,7 +1803,6 @@ syscon nr __NR_faccessat 0x010d 0x0030 0x20001d2 0x01d2 0x01e9 0x013
syscon nr __NR_unshare 0x0110 0x0061 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_splice 0x0113 0x004c 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_tee 0x0114 0x004d 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_sync_file_range 0x0115 0x0054 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_vmsplice 0x0116 0x004b 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_migrate_pages 0x0100 0x00ee 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff
syscon nr __NR_move_pages 0x0117 0x00ef 0xfff 0xfff 0xfff 0xfff 0xfff 0xfff

View file

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,SYNC_FILE_RANGE_WAIT_AFTER,4,4,0,0,0,0,0,0

View file

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,SYNC_FILE_RANGE_WAIT_BEFORE,1,1,0,0,0,0,0,0

View file

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon misc,SYNC_FILE_RANGE_WRITE,2,2,0,0,0,0,0,0

View file

@ -1,2 +0,0 @@
#include "libc/sysv/consts/syscon.internal.h"
.syscon nr,__NR_sync_file_range,0x0115,0x0054,0xfff,0xfff,0xfff,0xfff,0xfff,0xfff

View file

@ -269,7 +269,6 @@ extern const int __NR_faccessat;
extern const int __NR_unshare;
extern const int __NR_splice;
extern const int __NR_tee;
extern const int __NR_sync_file_range;
extern const int __NR_vmsplice;
extern const int __NR_migrate_pages;
extern const int __NR_move_pages;

View file

@ -289,7 +289,6 @@ scall sys_faccessat 0x1ce1391e921d210d 0x030 globl hidden
scall sys_unshare 0xfffffffffffff110 0x061 globl # no wrapper
scall sys_splice 0xfffffffffffff113 0x04c globl hidden # Linux 2.6.17+ (c. 2007)
scall sys_tee 0xfffffffffffff114 0x04d globl # Linux 2.6.17+; no wrapper
scall sys_sync_file_range 0xfffffffffffff115 0x054 globl hidden # Linux 2.6.17+
scall sys_vmsplice 0xfffffffffffff116 0x04b globl hidden
scall sys_migrate_pages 0xfffffffffffff100 0x0ee globl # no wrapper; numa numa yay
scall sys_move_pages 0xfffffffffffff117 0x0ef globl # no wrapper; NOTE: We view Red Hat versions as "epochs" for all distros.