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);