From 0f6f33b1b4084426a78035788e5e8502a3dc5af0 Mon Sep 17 00:00:00 2001 From: Rian Hunter Date: Wed, 1 Jun 2016 22:30:44 -0700 Subject: Implement support for "fsync@openssh.com" OpenSSH implements fsync() via the extension "fsync@openssh.com". This change uses that extension when receiving a FUSE fsync request. --- sshfs.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/sshfs.c b/sshfs.c index ce30a0f..9fb68af 100644 --- a/sshfs.c +++ b/sshfs.c @@ -118,6 +118,7 @@ #define SFTP_EXT_POSIX_RENAME "posix-rename@openssh.com" #define SFTP_EXT_STATVFS "statvfs@openssh.com" #define SFTP_EXT_HARDLINK "hardlink@openssh.com" +#define SFTP_EXT_FSYNC "fsync@openssh.com" #define PROTO_VERSION 3 @@ -273,6 +274,7 @@ struct sshfs { int ext_posix_rename; int ext_statvfs; int ext_hardlink; + int ext_fsync; mode_t mnt_mode; struct fuse_operations *op; @@ -1548,6 +1550,9 @@ static int sftp_init_reply_ok(struct buffer *buf, uint32_t *version) if (strcmp(ext, SFTP_EXT_HARDLINK) == 0 && strcmp(extdata, "1") == 0) sshfs.ext_hardlink = 1; + if (strcmp(ext, SFTP_EXT_FSYNC) == 0 && + strcmp(extdata, "1") == 0) + sshfs.ext_fsync = 1; } while (buf2.len < buf2.size); buf_free(&buf2); } @@ -2632,8 +2637,25 @@ static int sshfs_flush(const char *path, struct fuse_file_info *fi) static int sshfs_fsync(const char *path, int isdatasync, struct fuse_file_info *fi) { + int err; (void) isdatasync; - return sshfs_flush(path, fi); + + if (err = sshfs_flush(path, fi)) + return err; + + if (!sshfs.ext_fsync) + return err; + + { + struct buffer buf; + struct sshfs_file *sf = get_sshfs_file(fi); + buf_init(&buf, 0); + buf_add_string(&buf, SFTP_EXT_FSYNC); + buf_add_buf(&buf, &sf->handle); + err = sftp_request(SSH_FXP_EXTENDED, &buf, SSH_FXP_STATUS, NULL); + buf_free(&buf); + return err; + } } static void sshfs_file_put(struct sshfs_file *sf) -- cgit v1.2.3 From 74bfa3850a2568f96dd1d090a9386534c9bb4629 Mon Sep 17 00:00:00 2001 From: Rian Hunter Date: Wed, 1 Jun 2016 23:21:46 -0700 Subject: Support the lack of paths when cache is off Before FUSE 2.9, FUSE had to emulate unlink() if a file was still open via renaming to a hidden file. This was due to the requirement that a valid "path" argument must be submitted for many FUSE operations. FUSE 2.9 introduced the flag_nullpath_ok and flag_nopath flags that allow a FUSE file system to signal to FUSE that the "path" argument may be NULL in certain operations. sshfs doesn't require paths if the cache isn't used so communicate that information to the FUSE layer. --- cache.c | 8 ++++++++ sshfs.c | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/cache.c b/cache.c index aeb14ec..34a87ca 100644 --- a/cache.c +++ b/cache.c @@ -523,6 +523,10 @@ static void cache_unity_fill(struct fuse_cache_operations *oper, cache_oper->ftruncate = oper->oper.ftruncate; cache_oper->fgetattr = oper->oper.fgetattr; #endif +#if FUSE_VERSION >= 29 + cache_oper->flag_nullpath_ok = oper->oper.flag_nullpath_ok; + cache_oper->flag_nopath = oper->oper.flag_nopath; +#endif } static void cache_fill(struct fuse_cache_operations *oper, @@ -548,6 +552,10 @@ static void cache_fill(struct fuse_cache_operations *oper, cache_oper->ftruncate = oper->oper.ftruncate ? cache_ftruncate : NULL; cache_oper->fgetattr = oper->oper.fgetattr ? cache_fgetattr : NULL; #endif +#if FUSE_VERSION >= 29 + cache_oper->flag_nullpath_ok = 0; + cache_oper->flag_nopath = 0; +#endif } diff --git a/sshfs.c b/sshfs.c index 9fb68af..f41d987 100644 --- a/sshfs.c +++ b/sshfs.c @@ -3372,6 +3372,10 @@ static struct fuse_cache_operations sshfs_oper = { .create = sshfs_create, .ftruncate = sshfs_ftruncate, .fgetattr = sshfs_fgetattr, +#endif +#if FUSE_VERSION >= 29 + .flag_nullpath_ok = 1, + .flag_nopath = 1, #endif }, .cache_getdir = sshfs_getdir, -- cgit v1.2.3 From 504e26f9382f0d5e96e4d6474d5d3f5cd33fa99a Mon Sep 17 00:00:00 2001 From: Nikolaus Rath Date: Sun, 5 Jun 2016 14:15:36 -0400 Subject: Added ChangeLog entry for fsync extension --- ChangeLog | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ChangeLog b/ChangeLog index f7661b8..2b8f1cd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Unreleased Changes +------------------ + +* Added support for the "fsync" extension. + Release 2.6 (2015-03-01) ------------------------ -- cgit v1.2.3