diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | cache.c | 8 | ||||
-rw-r--r-- | sshfs.c | 28 |
3 files changed, 40 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Unreleased Changes +------------------ + +* Added support for the "fsync" extension. + Release 2.6 (2015-03-01) ------------------------ @@ -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 } @@ -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) @@ -3351,6 +3373,10 @@ static struct fuse_cache_operations sshfs_oper = { .ftruncate = sshfs_ftruncate, .fgetattr = sshfs_fgetattr, #endif +#if FUSE_VERSION >= 29 + .flag_nullpath_ok = 1, + .flag_nopath = 1, +#endif }, .cache_getdir = sshfs_getdir, }; |