From: Darrick J. Wong <djwong@xxxxxxxxxx> Enable syncfs calls in fuse2fs. Signed-off-by: "Darrick J. Wong" <djwong@xxxxxxxxxx> --- misc/fuse2fs.c | 36 ++++++++++++++++++++++++++++++++++++ misc/fuse4fs.c | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/misc/fuse2fs.c b/misc/fuse2fs.c index 80bd47549925bf..62aca0ab56ec07 100644 --- a/misc/fuse2fs.c +++ b/misc/fuse2fs.c @@ -5414,6 +5414,41 @@ static int op_fallocate(const char *path EXT2FS_ATTR((unused)), int mode, # endif /* SUPPORT_FALLOCATE */ #endif /* FUSE 29 */ +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 99) +static int op_syncfs(const char *path) +{ + struct fuse2fs *ff = fuse2fs_get(); + ext2_filsys fs; + errcode_t err; + int ret = 0; + + FUSE2FS_CHECK_CONTEXT(ff); + dbg_printf(ff, "%s: path=%s\n", __func__, path); + fs = fuse2fs_start(ff); + + if (ff->opstate == F2OP_WRITABLE) { + if (fs->super->s_error_count) + fs->super->s_state |= EXT2_ERROR_FS; + ext2fs_mark_super_dirty(fs); + err = ext2fs_set_gdt_csum(fs); + if (err) { + ret = translate_error(fs, 0, err); + goto out_unlock; + } + + err = ext2fs_flush2(fs, 0); + if (err) { + ret = translate_error(fs, 0, err); + goto out_unlock; + } + } + +out_unlock: + fuse2fs_finish(ff, ret); + return ret; +} +#endif + #ifdef HAVE_FUSE_IOMAP static void fuse2fs_iomap_hole(struct fuse2fs *ff, struct fuse_file_iomap *iomap, off_t pos, uint64_t count) @@ -6750,6 +6785,7 @@ static struct fuse_operations fs_ops = { #endif #if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 99) .getattr_iflags = op_getattr_iflags, + .syncfs = op_syncfs, #endif #ifdef HAVE_FUSE_IOMAP .iomap_begin = op_iomap_begin, diff --git a/misc/fuse4fs.c b/misc/fuse4fs.c index a06e963eab6afd..e01b83e271415c 100644 --- a/misc/fuse4fs.c +++ b/misc/fuse4fs.c @@ -1968,7 +1968,7 @@ static int fuse4fs_statx(struct fuse4fs *ff, ext2_ino_t ino, int statx_mask, static void op_statx(fuse_req_t req, fuse_ino_t fino, int flags, int mask, struct fuse_file_info *fi) { - struct statx stx; + struct statx stx = { }; struct fuse4fs *ff = fuse4fs_get(req); ext2_ino_t ino; int ret = 0; @@ -5708,6 +5708,40 @@ static void op_fallocate(fuse_req_t req, fuse_ino_t fino EXT2FS_ATTR((unused)), } #endif /* SUPPORT_FALLOCATE */ +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 99) +static void op_syncfs(fuse_req_t req, fuse_ino_t ino) +{ + struct fuse4fs *ff = fuse4fs_get(req); + ext2_filsys fs; + errcode_t err; + int ret = 0; + + FUSE4FS_CHECK_CONTEXT(req); + fs = fuse4fs_start(ff); + + if (ff->opstate == F4OP_WRITABLE) { + if (fs->super->s_error_count) + fs->super->s_state |= EXT2_ERROR_FS; + ext2fs_mark_super_dirty(fs); + err = ext2fs_set_gdt_csum(fs); + if (err) { + ret = translate_error(fs, 0, err); + goto out_unlock; + } + + err = ext2fs_flush2(fs, 0); + if (err) { + ret = translate_error(fs, 0, err); + goto out_unlock; + } + } + +out_unlock: + fuse4fs_finish(ff, ret); + fuse_reply_err(req, -ret); +} +#endif + #ifdef HAVE_FUSE_IOMAP static void fuse4fs_iomap_hole(struct fuse4fs *ff, struct fuse_file_iomap *iomap, off_t pos, uint64_t count) @@ -7034,6 +7068,9 @@ static struct fuse_lowlevel_ops fs_ops = { #if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 18) .statx = op_statx, #endif +#if FUSE_VERSION >= FUSE_MAKE_VERSION(3, 99) + .syncfs = op_syncfs, +#endif #ifdef HAVE_FUSE_IOMAP .iomap_begin = op_iomap_begin, .iomap_end = op_iomap_end,