libfuse: fix crash in unlock_path()
authorRatna_Bolla@dell.com <Ratna_Bolla@dell.com>
Mon, 4 Feb 2013 17:30:14 +0000 (18:30 +0100)
committerMiklos Szeredi <mszeredi@suse.cz>
Mon, 4 Feb 2013 17:30:14 +0000 (18:30 +0100)
Patch by Ratna Manoj.

queue_element_unlock() should set ->first_locked and ->second_locked to false.

Discovered with 'fs_racer'.  The assert(wnode->treelock == TREELOCK_WRITE) in
unlock_path() was hit within minutes.

Miklos: simplified patch

ChangeLog
lib/fuse.c

index dbd10e85ebf8f06fd4389a77297cbce1a0619d34..076bcaf54490bf7f85930dbc796cff0e7f15d559 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-02-04  Miklos Szeredi <miklos@szeredi.hu>
+
+       * libfuse: fix crash in unlock_path().  Patch by Ratna Manoj
+
 2012-10-01  Miklos Szeredi <miklos@szeredi.hu>
 
        * Released 2.9.2
index 599a587fbe60dfb766a5fa47918f4207a0959bde..1917346c759d4cca13c513372f6b68b02fa3402f 100644 (file)
@@ -1021,10 +1021,12 @@ static void queue_element_unlock(struct fuse *f, struct lock_queue_element *qe)
        if (qe->first_locked) {
                wnode = qe->wnode1 ? *qe->wnode1 : NULL;
                unlock_path(f, qe->nodeid1, wnode, NULL);
+               qe->first_locked = false;
        }
        if (qe->second_locked) {
                wnode = qe->wnode2 ? *qe->wnode2 : NULL;
                unlock_path(f, qe->nodeid2, wnode, NULL);
+               qe->second_locked = false;
        }
 }