aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikolaus Rath <Nikolaus@rath.org>2016-06-05 14:15:52 -0400
committerNikolaus Rath <Nikolaus@rath.org>2016-06-05 14:15:52 -0400
commita2dda962c424949c5876e148d2ae116dc0585127 (patch)
tree006613c5a1a9fe2593c1280d727709e6c3eaa9da
parenta9a1cc004675f35df34c68f3e134c2194311943f (diff)
parent504e26f9382f0d5e96e4d6474d5d3f5cd33fa99a (diff)
downloadsshfs-a2dda962c424949c5876e148d2ae116dc0585127.tar
sshfs-a2dda962c424949c5876e148d2ae116dc0585127.tar.gz
sshfs-a2dda962c424949c5876e148d2ae116dc0585127.tar.bz2
sshfs-a2dda962c424949c5876e148d2ae116dc0585127.zip
Merge branch 'rianhunter-master'
-rw-r--r--ChangeLog5
-rw-r--r--cache.c8
-rw-r--r--sshfs.c28
3 files changed, 40 insertions, 1 deletions
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)
------------------------
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 ce30a0f..f41d987 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)
@@ -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,
};