From 8e086795b2443f795fdbc3e7e16eeec99d214abf Mon Sep 17 00:00:00 2001 From: Pascal Abresch Date: Fri, 25 Oct 2024 18:29:32 +0200 Subject: [PATCH] implement fdatasync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I2aefc1acebce93a2c53a6d3be5eef3b9e69480ec Reviewed-on: https://review.haiku-os.org/c/haiku/+/8507 Tested-by: Commit checker robot Reviewed-by: nephele nephele Reviewed-by: Jérôme Duval --- headers/build/private/kernel/syscalls.h | 2 +- headers/os/drivers/fs_interface.h | 2 +- headers/posix/unistd.h | 3 ++- headers/private/fs_shell/fssh_fs_interface.h | 2 +- headers/private/kernel/vfs.h | 2 +- headers/private/system/syscalls.h | 2 +- .../kernel/file_systems/bfs/kernel_interface.cpp | 2 +- .../file_systems/bindfs/kernel_interface.cpp | 4 ++-- .../file_systems/cdda/kernel_interface.cpp | 2 +- .../file_systems/ext2/kernel_interface.cpp | 2 +- .../kernel/file_systems/fat/kernel_interface.cpp | 2 +- .../attribute_overlay/attribute_overlay.cpp | 4 ++-- .../layers/log_overlay/log_overlay.cpp | 4 ++-- .../layers/write_overlay/write_overlay.cpp | 2 +- .../file_systems/nfs4/kernel_interface.cpp | 2 +- .../file_systems/ntfs/kernel_interface.cpp | 2 +- .../file_systems/ramfs/kernel_interface.cpp | 2 +- .../kernel_add_on/kernel_interface.cpp | 2 +- .../server/haiku/HaikuKernelVolume.cpp | 2 +- src/build/libbe/storage/Node.cpp | 2 +- src/build/libroot/fs.cpp | 2 +- src/kits/storage/Node.cpp | 2 +- src/system/kernel/device_manager/devfs.cpp | 2 +- src/system/kernel/fs/fifo.cpp | 2 +- src/system/kernel/fs/rootfs.cpp | 2 +- src/system/kernel/fs/vfs.cpp | 16 ++++++++-------- src/system/libroot/posix/unistd/sync.c | 9 ++++++++- src/tools/fs_shell/syscalls.h | 2 +- src/tools/fs_shell/vfs.cpp | 10 +++++----- 29 files changed, 51 insertions(+), 43 deletions(-) diff --git a/headers/build/private/kernel/syscalls.h b/headers/build/private/kernel/syscalls.h index c8d20ddb49..e42e00ccf0 100644 --- a/headers/build/private/kernel/syscalls.h +++ b/headers/build/private/kernel/syscalls.h @@ -62,7 +62,7 @@ extern int _kern_open_dir_entry_ref(dev_t device, ino_t inode, extern int _kern_open_dir(int fd, const char *path); extern int _kern_open_parent_dir(int fd, char *name, size_t nameLength); -extern status_t _kern_fsync(int fd); +extern status_t _kern_fsync(int fd, bool dataOnly); extern off_t _kern_seek(int fd, off_t pos, int seekType); extern status_t _kern_create_dir_entry_ref(dev_t device, ino_t inode, const char *name, int perms); diff --git a/headers/os/drivers/fs_interface.h b/headers/os/drivers/fs_interface.h index 1720d1e06f..96541ffde4 100644 --- a/headers/os/drivers/fs_interface.h +++ b/headers/os/drivers/fs_interface.h @@ -150,7 +150,7 @@ struct fs_vnode_ops { uint8 event, selectsync* sync); status_t (*deselect)(fs_volume* volume, fs_vnode* vnode, void* cookie, uint8 event, selectsync* sync); - status_t (*fsync)(fs_volume* volume, fs_vnode* vnode); + status_t (*fsync)(fs_volume* volume, fs_vnode* vnode, bool dataOnly); status_t (*read_symlink)(fs_volume* volume, fs_vnode* link, char* buffer, size_t* _bufferSize); diff --git a/headers/posix/unistd.h b/headers/posix/unistd.h index cef93f48e1..038dcebad3 100644 --- a/headers/posix/unistd.h +++ b/headers/posix/unistd.h @@ -72,7 +72,7 @@ #define _POSIX_SPAWN (200809L) #define _POSIX_SPIN_LOCKS (-1) #define _POSIX_SPORADIC_SERVER (-1) -#define _POSIX_SYNCHRONIZED_IO (-1) /* missing fdatasync() */ +#define _POSIX_SYNCHRONIZED_IO (200809L) #define _POSIX_THREAD_ATTR_STACKADDR (200809L) #define _POSIX_THREAD_ATTR_STACKSIZE (200809L) #define _POSIX_THREAD_CPUTIME (200809L) @@ -401,6 +401,7 @@ extern off_t lseek(int fd, off_t offset, int whence); extern void sync(void); extern int fsync(int fd); +extern int fdatasync(int fd); extern int chown(const char *path, uid_t owner, gid_t group); extern int fchown(int fd, uid_t owner, gid_t group); diff --git a/headers/private/fs_shell/fssh_fs_interface.h b/headers/private/fs_shell/fssh_fs_interface.h index b916d6966d..81e4ee3d27 100644 --- a/headers/private/fs_shell/fssh_fs_interface.h +++ b/headers/private/fs_shell/fssh_fs_interface.h @@ -165,7 +165,7 @@ struct fssh_fs_vnode_ops { fssh_fs_cookie cookie, uint8_t event, fssh_selectsync *sync); fssh_status_t (*deselect)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, fssh_fs_cookie cookie, uint8_t event, fssh_selectsync *sync); - fssh_status_t (*fsync)(fssh_fs_volume *volume, fssh_fs_vnode *vnode); + fssh_status_t (*fsync)(fssh_fs_volume *volume, fssh_fs_vnode *vnode, bool dataOnly); fssh_status_t (*read_symlink)(fssh_fs_volume *volume, fssh_fs_vnode *link, char *buffer, fssh_size_t *_bufferSize); diff --git a/headers/private/kernel/vfs.h b/headers/private/kernel/vfs.h index a07d265598..51fd1b5d29 100644 --- a/headers/private/kernel/vfs.h +++ b/headers/private/kernel/vfs.h @@ -185,7 +185,7 @@ int _user_open_dir_entry_ref(dev_t device, ino_t inode, int _user_open_dir(int fd, const char *path); int _user_open_parent_dir(int fd, char *name, size_t nameLength); status_t _user_fcntl(int fd, int op, size_t argument); -status_t _user_fsync(int fd); +status_t _user_fsync(int fd, bool dataOnly); status_t _user_flock(int fd, int op); status_t _user_read_stat(int fd, const char *path, bool traverseLink, struct stat *stat, size_t statSize); diff --git a/headers/private/system/syscalls.h b/headers/private/system/syscalls.h index 07988e6449..b98c48c94c 100644 --- a/headers/private/system/syscalls.h +++ b/headers/private/system/syscalls.h @@ -278,7 +278,7 @@ extern int _kern_open_dir(int fd, const char *path); extern int _kern_open_parent_dir(int fd, char *name, size_t nameLength); extern status_t _kern_fcntl(int fd, int op, size_t argument); -extern status_t _kern_fsync(int fd); +extern status_t _kern_fsync(int fd, bool dataOnly); extern status_t _kern_flock(int fd, int op); extern off_t _kern_seek(int fd, off_t pos, int seekType); extern status_t _kern_create_dir_entry_ref(dev_t device, ino_t inode, diff --git a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp index e11956e517..fa87df3938 100644 --- a/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bfs/kernel_interface.cpp @@ -849,7 +849,7 @@ bfs_set_flags(fs_volume* _volume, fs_vnode* _node, void* _cookie, int flags) static status_t -bfs_fsync(fs_volume* _volume, fs_vnode* _node) +bfs_fsync(fs_volume* _volume, fs_vnode* _node, bool dataOnly) { FUNCTION(); diff --git a/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp index 89a0f4cfad..d793aae639 100644 --- a/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/bindfs/kernel_interface.cpp @@ -422,7 +422,7 @@ bindfs_deselect(fs_volume* fsVolume, fs_vnode* fsNode, void* cookie, static status_t -bindfs_fsync(fs_volume* fsVolume, fs_vnode* fsNode) +bindfs_fsync(fs_volume* fsVolume, fs_vnode* fsNode, bool dataOnly) { Volume* volume = (Volume*)fsVolume->private_volume; Node* node = (Node*)fsNode->private_node; @@ -432,7 +432,7 @@ bindfs_fsync(fs_volume* fsVolume, fs_vnode* fsNode) FETCH_SOURCE_VOLUME_AND_NODE(volume, node->ID()); - return sourceNode->ops->fsync(sourceVolume, sourceNode); + return sourceNode->ops->fsync(sourceVolume, sourceNode, dataOnly); } diff --git a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp index a12c55ca3d..7e00236e67 100644 --- a/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/cdda/kernel_interface.cpp @@ -1675,7 +1675,7 @@ cdda_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie) static status_t -cdda_fsync(fs_volume* _volume, fs_vnode* _node) +cdda_fsync(fs_volume* _volume, fs_vnode* _node, bool dataOnly) { return B_OK; } diff --git a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp index 57819e933c..b2039cc3a3 100644 --- a/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ext2/kernel_interface.cpp @@ -576,7 +576,7 @@ ext2_set_flags(fs_volume* _volume, fs_vnode* _node, void* _cookie, int flags) static status_t -ext2_fsync(fs_volume* _volume, fs_vnode* _node) +ext2_fsync(fs_volume* _volume, fs_vnode* _node, bool dataOnly) { Inode* inode = (Inode*)_node->private_node; return inode->Sync(); diff --git a/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp b/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp index 14cded4bbd..76e05d46f4 100644 --- a/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/fat/kernel_interface.cpp @@ -1175,7 +1175,7 @@ dosfs_get_file_map(fs_volume* volume, fs_vnode* vnode, off_t position, size_t le static status_t -dosfs_fsync(fs_volume* volume, fs_vnode* vnode) +dosfs_fsync(fs_volume* volume, fs_vnode* vnode, bool dataOnly) { struct vnode* bsdNode = reinterpret_cast(vnode->private_node); diff --git a/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp b/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp index 5d6d0fcfc8..7c51ee8354 100644 --- a/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/attribute_overlay/attribute_overlay.cpp @@ -1262,13 +1262,13 @@ overlay_deselect(fs_volume *volume, fs_vnode *vnode, void *cookie, uint8 event, static status_t -overlay_fsync(fs_volume *volume, fs_vnode *vnode) +overlay_fsync(fs_volume *volume, fs_vnode *vnode, bool dataOnly) { OverlayInode *node = (OverlayInode *)vnode->private_node; fs_vnode *superVnode = node->SuperVnode(); if (superVnode->ops->fsync != NULL) - return superVnode->ops->fsync(volume->super_volume, superVnode); + return superVnode->ops->fsync(volume->super_volume, superVnode, dataOnly); return B_OK; } diff --git a/src/add-ons/kernel/file_systems/layers/log_overlay/log_overlay.cpp b/src/add-ons/kernel/file_systems/layers/log_overlay/log_overlay.cpp index d49500e50f..522971579d 100644 --- a/src/add-ons/kernel/file_systems/layers/log_overlay/log_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/log_overlay/log_overlay.cpp @@ -255,14 +255,14 @@ overlay_deselect(fs_volume *volume, fs_vnode *vnode, void *cookie, uint8 event, static status_t -overlay_fsync(fs_volume *volume, fs_vnode *vnode) +overlay_fsync(fs_volume *volume, fs_vnode *vnode, bool dataOnly) { DO_LOG("%s\n", "fsync"); status_t result = B_UNSUPPORTED; fs_vnode *superVnode = (fs_vnode *)vnode->private_node; if (superVnode->ops->fsync != NULL) - result = superVnode->ops->fsync(volume->super_volume, superVnode); + result = superVnode->ops->fsync(volume->super_volume, superVnode, dataOnly); DO_LOG("fsync result: %#" B_PRIx32 "\n", result); return result; diff --git a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp index 1835f67170..a837399f02 100644 --- a/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp +++ b/src/add-ons/kernel/file_systems/layers/write_overlay/write_overlay.cpp @@ -1770,7 +1770,7 @@ overlay_deselect(fs_volume *volume, fs_vnode *vnode, void *cookie, uint8 event, static status_t -overlay_fsync(fs_volume *volume, fs_vnode *vnode) +overlay_fsync(fs_volume *volume, fs_vnode *vnode, bool dataOnly) { return B_OK; } diff --git a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp index 31d810c352..43b3f1b2a1 100644 --- a/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/nfs4/kernel_interface.cpp @@ -492,7 +492,7 @@ nfs4_set_flags(fs_volume* volume, fs_vnode* vnode, void* _cookie, int flags) static status_t -nfs4_fsync(fs_volume* volume, fs_vnode* vnode) +nfs4_fsync(fs_volume* volume, fs_vnode* vnode, bool dataOnly) { VnodeToInode* vti = reinterpret_cast(vnode->private_node); TRACE("volume = %p, vnode = %" B_PRIi64 "\n", volume, vti->ID()); diff --git a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp index 5b2434c9e7..8137a31901 100644 --- a/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ntfs/kernel_interface.cpp @@ -942,7 +942,7 @@ fs_write(fs_volume* _volume, fs_vnode* _node, void* _cookie, off_t pos, static status_t -fs_fsync(fs_volume* _volume, fs_vnode* _node) +fs_fsync(fs_volume* _volume, fs_vnode* _node, bool dataOnly) { CALLED(); vnode* node = (vnode*)_node->private_node; diff --git a/src/add-ons/kernel/file_systems/ramfs/kernel_interface.cpp b/src/add-ons/kernel/file_systems/ramfs/kernel_interface.cpp index 29c85553c5..bb177fb955 100644 --- a/src/add-ons/kernel/file_systems/ramfs/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/ramfs/kernel_interface.cpp @@ -351,7 +351,7 @@ ramfs_set_flags(fs_volume* /*fs*/, fs_vnode* /*node*/, void* /*cookie*/, static status_t -ramfs_fsync(fs_volume* /*fs*/, fs_vnode* /*node*/) +ramfs_fsync(fs_volume* /*fs*/, fs_vnode* /*node*/, bool dataOnly) { FUNCTION_START(); return B_OK; diff --git a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/kernel_interface.cpp b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/kernel_interface.cpp index 9c39a811df..4f4394905d 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/kernel_interface.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/kernel_add_on/kernel_interface.cpp @@ -344,7 +344,7 @@ userlandfs_deselect(fs_volume* fsVolume, fs_vnode* fsNode, void* cookie, // userlandfs_fsync static status_t -userlandfs_fsync(fs_volume* fsVolume, fs_vnode* fsNode) +userlandfs_fsync(fs_volume* fsVolume, fs_vnode* fsNode, bool dataOnly) { Volume* volume = (Volume*)fsVolume->private_volume; PRINT(("userlandfs_fsync(%p, %p)\n", volume, fsNode->private_node)); diff --git a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelVolume.cpp b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelVolume.cpp index 6e5f8595cf..7ad2d4615f 100644 --- a/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelVolume.cpp +++ b/src/add-ons/kernel/file_systems/userlandfs/server/haiku/HaikuKernelVolume.cpp @@ -552,7 +552,7 @@ HaikuKernelVolume::FSync(void* _node) if (!node->ops->fsync) return B_BAD_VALUE; - return node->ops->fsync(&fVolume, node); + return node->ops->fsync(&fVolume, node, false); } // ReadSymlink diff --git a/src/build/libbe/storage/Node.cpp b/src/build/libbe/storage/Node.cpp index 14815e5d0f..dffff95813 100644 --- a/src/build/libbe/storage/Node.cpp +++ b/src/build/libbe/storage/Node.cpp @@ -229,7 +229,7 @@ BNode::Unlock() status_t BNode::Sync() { - return (fCStatus != B_OK) ? B_FILE_ERROR : _kern_fsync(fFd); + return (fCStatus != B_OK) ? B_FILE_ERROR : _kern_fsync(fFd, false); } diff --git a/src/build/libroot/fs.cpp b/src/build/libroot/fs.cpp index 92a7d202b2..6f570fc3e1 100644 --- a/src/build/libroot/fs.cpp +++ b/src/build/libroot/fs.cpp @@ -823,7 +823,7 @@ _kern_dup(int fd) // _kern_fsync status_t -_kern_fsync(int fd) +_kern_fsync(int fd, bool dataOnly) { // get the descriptor FileDescriptor *descriptor diff --git a/src/kits/storage/Node.cpp b/src/kits/storage/Node.cpp index 92cea8389a..1b15366ed8 100644 --- a/src/kits/storage/Node.cpp +++ b/src/kits/storage/Node.cpp @@ -239,7 +239,7 @@ BNode::Unlock() status_t BNode::Sync() { - return (fCStatus != B_OK) ? B_FILE_ERROR : _kern_fsync(fFd); + return (fCStatus != B_OK) ? B_FILE_ERROR : _kern_fsync(fFd, false); } diff --git a/src/system/kernel/device_manager/devfs.cpp b/src/system/kernel/device_manager/devfs.cpp index 3730488d48..34576cbf1e 100644 --- a/src/system/kernel/device_manager/devfs.cpp +++ b/src/system/kernel/device_manager/devfs.cpp @@ -1189,7 +1189,7 @@ devfs_free_cookie(fs_volume* _volume, fs_vnode* _vnode, void* _cookie) static status_t -devfs_fsync(fs_volume* _volume, fs_vnode* _v) +devfs_fsync(fs_volume* _volume, fs_vnode* _v, bool dataOnly) { return B_OK; } diff --git a/src/system/kernel/fs/fifo.cpp b/src/system/kernel/fs/fifo.cpp index 0260ea3bd3..33aa60da86 100644 --- a/src/system/kernel/fs/fifo.cpp +++ b/src/system/kernel/fs/fifo.cpp @@ -1113,7 +1113,7 @@ fifo_free_cookie(fs_volume* _volume, fs_vnode* _node, void* _cookie) static status_t -fifo_fsync(fs_volume* _volume, fs_vnode* _node) +fifo_fsync(fs_volume* _volume, fs_vnode* _node, bool dataOnly) { return B_BAD_VALUE; } diff --git a/src/system/kernel/fs/rootfs.cpp b/src/system/kernel/fs/rootfs.cpp index 7705fc15e8..4b7affe37a 100644 --- a/src/system/kernel/fs/rootfs.cpp +++ b/src/system/kernel/fs/rootfs.cpp @@ -631,7 +631,7 @@ rootfs_free_cookie(fs_volume* _volume, fs_vnode* _v, void* _cookie) static status_t -rootfs_fsync(fs_volume* _volume, fs_vnode* _v) +rootfs_fsync(fs_volume* _volume, fs_vnode* _v, bool dataOnly) { return B_OK; } diff --git a/src/system/kernel/fs/vfs.cpp b/src/system/kernel/fs/vfs.cpp index 4e5b2face1..c0d78e07a2 100644 --- a/src/system/kernel/fs/vfs.cpp +++ b/src/system/kernel/fs/vfs.cpp @@ -988,7 +988,7 @@ free_vnode(struct vnode* vnode, bool reenter) // will be discarded if (!vnode->IsRemoved() && HAS_FS_CALL(vnode, fsync)) - FS_CALL_NO_PARAMS(vnode, fsync); + FS_CALL(vnode, fsync, false); // Note: If this vnode has a cache attached, there will still be two // references to that cache at this point. The last one belongs to the vnode @@ -6416,9 +6416,9 @@ common_fcntl(int fd, int op, size_t argument, bool kernel) static status_t -common_sync(int fd, bool kernel) +common_sync(int fd, bool dataOnly, bool kernel) { - FUNCTION(("common_fsync: entry. fd %d kernel %d\n", fd, kernel)); + FUNCTION(("common_sync: entry. fd %d kernel %d, data only %d\n", fd, kernel, dataOnly)); struct vnode* vnode; FileDescriptorPutter descriptor(get_fd_and_vnode(fd, &vnode, kernel)); @@ -6427,7 +6427,7 @@ common_sync(int fd, bool kernel) status_t status; if (HAS_FS_CALL(vnode, fsync)) - status = FS_CALL_NO_PARAMS(vnode, fsync); + status = FS_CALL(vnode, fsync, dataOnly); else status = B_UNSUPPORTED; @@ -8439,9 +8439,9 @@ _kern_fcntl(int fd, int op, size_t argument) status_t -_kern_fsync(int fd) +_kern_fsync(int fd, bool dataOnly) { - return common_sync(fd, true); + return common_sync(fd, dataOnly, true); } @@ -9272,9 +9272,9 @@ _user_fcntl(int fd, int op, size_t argument) status_t -_user_fsync(int fd) +_user_fsync(int fd, bool dataOnly) { - return common_sync(fd, false); + return common_sync(fd, dataOnly, false); } diff --git a/src/system/libroot/posix/unistd/sync.c b/src/system/libroot/posix/unistd/sync.c index 844620fa3a..0c1e69c166 100644 --- a/src/system/libroot/posix/unistd/sync.c +++ b/src/system/libroot/posix/unistd/sync.c @@ -18,7 +18,14 @@ int fsync(int fd) { - RETURN_AND_SET_ERRNO_TEST_CANCEL(_kern_fsync(fd)); + RETURN_AND_SET_ERRNO_TEST_CANCEL(_kern_fsync(fd, false)); +} + + +int +fdatasync(int fd) +{ + RETURN_AND_SET_ERRNO_TEST_CANCEL(_kern_fsync(fd, true)); } diff --git a/src/tools/fs_shell/syscalls.h b/src/tools/fs_shell/syscalls.h index f48e3f99a4..df0d36394d 100644 --- a/src/tools/fs_shell/syscalls.h +++ b/src/tools/fs_shell/syscalls.h @@ -35,7 +35,7 @@ int _kern_open_dir_entry_ref(fssh_dev_t device, fssh_ino_t inode, const char *name); int _kern_open_dir(int fd, const char *path); fssh_status_t _kern_fcntl(int fd, int op, uint32_t argument); -fssh_status_t _kern_fsync(int fd); +fssh_status_t _kern_fsync(int fd, bool dataOnly); fssh_status_t _kern_lock_node(int fd); fssh_status_t _kern_unlock_node(int fd); fssh_status_t _kern_create_dir_entry_ref(fssh_dev_t device, fssh_ino_t inode, diff --git a/src/tools/fs_shell/vfs.cpp b/src/tools/fs_shell/vfs.cpp index 5bd529560c..388e976215 100644 --- a/src/tools/fs_shell/vfs.cpp +++ b/src/tools/fs_shell/vfs.cpp @@ -638,7 +638,7 @@ free_vnode(struct vnode *vnode, bool reenter) // will be discarded if (!vnode->remove && HAS_FS_CALL(vnode, fsync)) - FS_CALL_NO_PARAMS(vnode, fsync); + FS_CALL(vnode, fsync, false); if (!vnode->unpublished) { if (vnode->remove) @@ -3619,7 +3619,7 @@ common_fcntl(int fd, int op, uint32_t argument, bool kernel) static fssh_status_t -common_sync(int fd, bool kernel) +common_sync(int fd, bool dataOnly, bool kernel) { struct file_descriptor *descriptor; struct vnode *vnode; @@ -3632,7 +3632,7 @@ common_sync(int fd, bool kernel) return FSSH_B_FILE_ERROR; if (HAS_FS_CALL(vnode, fsync)) - status = FS_CALL_NO_PARAMS(vnode, fsync); + status = FS_CALL(vnode, fsync, dataOnly); else status = FSSH_EOPNOTSUPP; @@ -4904,7 +4904,7 @@ fs_sync(fssh_dev_t device) put_vnode(previousVnode); if (HAS_FS_CALL(vnode, fsync)) - FS_CALL_NO_PARAMS(vnode, fsync); + FS_CALL(vnode, fsync, false); // the next vnode might change until we lock the vnode list again, // but this vnode won't go away since we keep a reference to it. @@ -5245,7 +5245,7 @@ _kern_fcntl(int fd, int op, uint32_t argument) fssh_status_t _kern_fsync(int fd) { - return common_sync(fd, true); + return common_sync(fd, false, true); }