aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2011-12-09 16:07:55 +0100
committerMiklos Szeredi <mszeredi@suse.cz>2011-12-09 16:07:55 +0100
commit4dc7e675bb17c7a126c78de75004877646d7605f (patch)
treee0f680526a9823d509431bbc1a9d096fb672541c
parentbfc49cefc4e03dee3888f2a04480c20f56a3fbfa (diff)
downloadandroid_external_fuse-4dc7e675bb17c7a126c78de75004877646d7605f.tar.gz
android_external_fuse-4dc7e675bb17c7a126c78de75004877646d7605f.tar.bz2
android_external_fuse-4dc7e675bb17c7a126c78de75004877646d7605f.zip
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.
-rw-r--r--ChangeLog4
-rw-r--r--lib/fuse.c3
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 <miklos@szeredi.hu>
* 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);