From: Miklos S. <mi...@sz...> - 2013-02-06 16:31:52
|
On Fri, Dec 21, 2012 at 5:55 AM, <Sre...@de...> wrote: > Hi, > > Can you please add me also in the response... > > Best regards, > Sreenivas > > From: Bolla, Ratna > Sent: Thursday, December 20, 2012 10:08 PM > To: 'fus...@li...' > Subject: fs_racer on (fuse_2_9_bugfix) > > Hi, > > We hit the first assert in unlock_path() with 'fs_racer' tests with in minutes. > > Crash#1: fuse_lib_getattr() --> free_path() --> unlock_path --> > free_path_wrlock --> unlock_path --> assert(wnode->treelock == TREELOCK_WRITE); > > Crash#2 : fuse_lib_rename() --> free_path2 --> unlock_path --> (wnode->treelock == TREELOCK_WRITE); > > The following patch to the latest 'fuse_2_9_buffix' seems to be working. Please confirm/take it, if it is a valid fix. > > Thanks. > Ratna Manoj. > > > diff --git a/lib/fuse.c b/lib/fuse.c > index 599a587..1b6b7be 100644 > --- a/lib/fuse.c > +++ b/lib/fuse.c > @@ -1021,10 +1021,16 @@ 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); > + if (wnode) > + *qe->wnode1 = NULL; > + qe->first_locked = false; > } > if (qe->second_locked) { > wnode = qe->wnode2 ? *qe->wnode2 : NULL; > unlock_path(f, qe->nodeid2, wnode, NULL); > + if (wnode) > + *qe->wnode2 = NULL; > + qe->second_locked = false; > } > } > > @@ -1213,6 +1219,8 @@ static int try_get_path2(struct fuse *f, fuse_ino_t nodeid1, const char *name1, > struct node *wn1 = wnode1 ? *wnode1 : NULL; > > unlock_path(f, nodeid1, wn1, NULL); > + if (wn1) > + *wnode1 = NULL; > free(*path1); > } > } > Simplified patch committed to fuse_2_9_bugfix and master. Thanks, Millos |