various flush related fixes in hi-lib
authorCsaba Henk <csaba.henk@creo.hu>
Thu, 10 May 2007 22:56:46 +0000 (22:56 +0000)
committerCsaba Henk <csaba.henk@creo.hu>
Thu, 10 May 2007 22:56:46 +0000 (22:56 +0000)
ChangeLog
lib/fuse.c

index 5c536e73ed843a47c7e35eab42094eb15b49c5ac..c2baf3712458c9c7f44fbcd19746d2f1248e791f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,7 +1,9 @@
 2007-05-11  Csaba Henk <csaba.henk@creo.hu>
 
-       * Fix return value of fuse_loop()/fuse_loop_mt().
-       Error reported by Csaba Henk, fix by Miklos Szeredi.
+       * libfuse: fix return value of fuse_loop()/fuse_loop_mt().
+       Error reported by Csaba Henk, fix by Miklos Szeredi
+
+       * libfuse: various flush related fixes
  
 2007-05-03  Miklos Szeredi <miklos@szeredi.hu>
 
index ce5d9af26e8bc085da986b8bdfd01cf507d0de7c..817b16f6b3a53236fe7acbb0900d6cf832ae16c1 100644 (file)
@@ -2025,37 +2025,6 @@ static void fuse_lib_write(fuse_req_t req, fuse_ino_t ino, const char *buf,
         reply_err(req, res);
 }
 
-static void fuse_lib_release(fuse_req_t req, fuse_ino_t ino,
-                             struct fuse_file_info *fi)
-{
-    struct fuse *f = req_fuse_prepare(req);
-    struct fuse_intr_data d;
-    char *path;
-    int err = 0;
-
-    pthread_rwlock_rdlock(&f->tree_lock);
-    path = get_path(f, ino);
-    if (f->conf.debug) {
-        printf("RELEASE%s[%llu] flags: 0x%x\n", fi->flush ? "+FLUSH" : "", 
-               (unsigned long long) fi->fh, fi->flags);
-        fflush(stdout);
-    }
-    fuse_prepare_interrupt(f, req, &d);
-    if (fi->flush && path) {
-        err = fuse_fs_flush(f->fs, path, fi);
-        if (err == -ENOSYS)
-            err = 0;
-    }
-    fuse_do_release(f, ino, path, fi);
-    fuse_finish_interrupt(f, req, &d);
-
-    if (path)
-        free(path);
-    pthread_rwlock_unlock(&f->tree_lock);
-
-    reply_err(req, err);
-}
-
 static void fuse_lib_fsync(fuse_req_t req, fuse_ino_t ino, int datasync,
                        struct fuse_file_info *fi)
 {
@@ -2610,6 +2579,63 @@ static void lock_to_flock(struct lock *lock, struct flock *flock)
     flock->l_pid = lock->pid;
 }
 
+static void fuse_flush_common(struct fuse_fs *fs, const char *path,
+                              struct fuse_file_info *fi,
+                              struct flock *lock, int *err, int *errlock)
+{
+    *err = fuse_fs_flush(fs, path, fi);
+
+    memset(lock, 0, sizeof(*lock));
+    lock->l_type = F_UNLCK;
+    lock->l_whence = SEEK_SET;
+    *errlock = fuse_fs_lock(fs, path, fi, F_SETLK, lock);
+}
+
+static void fuse_lib_release(fuse_req_t req, fuse_ino_t ino,
+                             struct fuse_file_info *fi)
+{
+    struct fuse *f = req_fuse_prepare(req);
+    struct fuse_intr_data d;
+    struct flock lock;
+    struct lock l;
+    char *path;
+    int err = 0;
+    int errlock = -ENOSYS;
+
+    pthread_rwlock_rdlock(&f->tree_lock);
+    path = get_path(f, ino);
+    if (!path)
+        path = "-";
+    if (f->conf.debug) {
+        printf("RELEASE%s[%llu] flags: 0x%x\n", fi->flush ? "+FLUSH" : "", 
+               (unsigned long long) fi->fh, fi->flags);
+        fflush(stdout);
+    }
+    fuse_prepare_interrupt(f, req, &d);
+    if (fi->flush) {
+        fuse_flush_common(f->fs, path, fi, &lock, &err, &errlock);
+        if (err == -ENOSYS && errlock == -ENOSYS)
+            err = 0;
+        else if (err == -ENOSYS || !err)
+            err = errlock;
+    }
+    fuse_do_release(f, ino, path, fi);
+    fuse_finish_interrupt(f, req, &d);
+    if (errlock != -ENOSYS) {
+        flock_to_lock(&lock, &l);
+        l.owner = fi->lock_owner;
+        pthread_mutex_lock(&f->lock);
+        locks_insert(get_node(f, ino), &l);
+        pthread_mutex_unlock(&f->lock);
+    }
+
+    if (path)
+        free(path);
+    pthread_rwlock_unlock(&f->tree_lock);
+
+    reply_err(req, err);
+}
+
 static void fuse_lib_flush(fuse_req_t req, fuse_ino_t ino,
                        struct fuse_file_info *fi)
 {
@@ -2629,15 +2655,9 @@ static void fuse_lib_flush(fuse_req_t req, fuse_ino_t ino,
         fflush(stdout);
     }
     fuse_prepare_interrupt(f, req, &d);
-    if (path)
-        err = fuse_fs_flush(f->fs, path, fi);
-
-    memset(&lock, 0, sizeof(lock));
-    lock.l_type = F_UNLCK;
-    lock.l_whence = SEEK_SET;
-    errlock = fuse_fs_lock(f->fs, path, fi, F_SETLK, &lock);
+    fuse_flush_common(f->fs, path ? path : "-" , fi, &lock, &err, &errlock);
     fuse_finish_interrupt(f, req, &d);
-    if (errlock != ENOSYS) {
+    if (errlock != -ENOSYS) {
         flock_to_lock(&lock, &l);
         l.owner = fi->lock_owner;
         pthread_mutex_lock(&f->lock);