From 6bab4809f38fcd67330d1383657e84bdd33ab43c Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Tue, 21 Feb 2006 18:31:29 +0000 Subject: [PATCH] fix --- ChangeLog | 8 ++++++++ example/fusexmp_fh.c | 18 ++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/ChangeLog b/ChangeLog index ccf3db0..ddcf712 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2006-02-21 Miklos Szeredi + + * fusexmp_fh: implement flush() method and call close() on the + open file descriptor. This is needed if used on an NFS + filesystem, which buffers data until file is closed. Franco Broi + spotted the situation when 'cp -p' failed to set the modification + time because of this. + 2006-02-20 Miklos Szeredi * Released 2.6.0-pre1 diff --git a/example/fusexmp_fh.c b/example/fusexmp_fh.c index 3ff6c9d..89fe8ff 100644 --- a/example/fusexmp_fh.c +++ b/example/fusexmp_fh.c @@ -311,6 +311,23 @@ static int xmp_statfs(const char *path, struct statvfs *stbuf) return 0; } +static int xmp_flush(const char *path, struct fuse_file_info *fi) +{ + int res; + + (void) path; + /* This is called from every close on an open file, so call the + close on the underlying filesystem. But since flush may be + called multiple times for an open file, this must not really + close the file. This is important if used on a network + filesystem like NFS which flush the data/metadata on close() */ + res = close(dup(fi->fh)); + if (res == -1) + return -errno; + + return 0; +} + static int xmp_release(const char *path, struct fuse_file_info *fi) { (void) path; @@ -401,6 +418,7 @@ static struct fuse_operations xmp_oper = { .read = xmp_read, .write = xmp_write, .statfs = xmp_statfs, + .flush = xmp_flush, .release = xmp_release, .fsync = xmp_fsync, #ifdef HAVE_SETXATTR