From 4dc7e675bb17c7a126c78de75004877646d7605f Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Fri, 9 Dec 2011 16:07:55 +0100 Subject: Don't unhash name in FORGET This resulted in ENOENT being returned for unlinked but still open files if the kernel sent a FORGET request for the parent directory. Discovered with fs_racer in LTP. --- ChangeLog | 4 ++++ lib/fuse.c | 3 +-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index ba1f5e2..3f9ba39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ * Fix hang in wait_on_path(). Reported by Ville Silventoinen + * Don't unhash name in FORGET. This resulted in ENOENT being + returned for unlinked but still open files if the kernel sent a + FORGET request for the parent directory. + 2011-12-08 Miklos Szeredi * Fix build if FUSE_NODE_SLAB is not defined. Patch by Emmanuel diff --git a/lib/fuse.c b/lib/fuse.c index 9073daf..e01f450 100644 --- a/lib/fuse.c +++ b/lib/fuse.c @@ -775,7 +775,7 @@ static void delete_node(struct fuse *f, struct node *node) (unsigned long long) node->nodeid); assert(node->treelock == 0); - assert(!node->name); + unhash_name(f, node); if (lru_enabled(f)) remove_node_lru(node); unhash_id(f, node); @@ -1258,7 +1258,6 @@ static void forget_node(struct fuse *f, fuse_ino_t nodeid, uint64_t nlookup) assert(node->nlookup >= nlookup); node->nlookup -= nlookup; if (!node->nlookup) { - unhash_name(f, node); unref_node(f, node); } else if (lru_enabled(f) && node->nlookup == 1) { set_forget_time(f, node); -- cgit v1.2.1