summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-04-10 08:56:41 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2006-04-10 08:56:41 +0000
commitd7c3355242f7b5bc144934c97b17ce00835d9bc3 (patch)
treee2decb11dbae7007e627c9fef246dcbb5c04d3c8
parent181bac083d685cdda0312c64efb91b79875ab213 (diff)
downloadfuse_2_5_bugfix.tar.gz
-rw-r--r--ChangeLog18
-rw-r--r--configure.in2
-rw-r--r--kernel/configure.ac2
-rw-r--r--kernel/dir.c8
-rw-r--r--lib/Makefile.am2
-rw-r--r--lib/fuse.c3
6 files changed, 29 insertions, 6 deletions
diff --git a/ChangeLog b/ChangeLog
index b53bdb1..f70507d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+2006-04-10 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Released 2.5.3
+
+2006-04-01 Miklos Szeredi <miklos@szeredi.hu>
+
+ * lib: Add missing rwlock initialization. Patch by Ryan Bradetich
+
+2006-02-25 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix negative entry handling. There was a bug, that negative
+ lookups with timeouts (nodeid == 0) returned -EIO.
+
+2006-02-23 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix race between RELEASE and UNLINK, which might leave
+ .fuse_hidden* files around
+
2006-02-19 Miklos Szeredi <miklos@szeredi.hu>
* libfuse: fix use-after-free bug in interruptred reply_entry().
diff --git a/configure.in b/configure.in
index 7836640..c90322b 100644
--- a/configure.in
+++ b/configure.in
@@ -1,4 +1,4 @@
-AC_INIT(fuse, 2.5.2)
+AC_INIT(fuse, 2.5.3)
AC_CANONICAL_TARGET
AM_INIT_AUTOMAKE
AM_CONFIG_HEADER(include/config.h)
diff --git a/kernel/configure.ac b/kernel/configure.ac
index ba7a792..0f3a935 100644
--- a/kernel/configure.ac
+++ b/kernel/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(fuse-kernel, 2.5.2)
+AC_INIT(fuse-kernel, 2.5.3)
AC_CONFIG_HEADERS([config.h])
AC_PROG_INSTALL
diff --git a/kernel/dir.c b/kernel/dir.c
index 084946d..f8658be 100644
--- a/kernel/dir.c
+++ b/kernel/dir.c
@@ -129,6 +129,9 @@ static int fuse_dentry_revalidate(struct dentry *entry, struct nameidata *nd)
fuse_lookup_init(req, entry->d_parent->d_inode, entry, &outarg);
request_send(fc, req);
err = req->out.h.error;
+ /* Zero nodeid is same as -ENOENT */
+ if (!err && !outarg.nodeid)
+ err = -ENOENT;
if (!err) {
struct fuse_inode *fi = get_fuse_inode(inode);
if (outarg.nodeid != get_node_id(inode)) {
@@ -218,8 +221,9 @@ static struct dentry *fuse_lookup(struct inode *dir, struct dentry *entry,
fuse_lookup_init(req, dir, entry, &outarg);
request_send(fc, req);
err = req->out.h.error;
- if (!err && ((outarg.nodeid && invalid_nodeid(outarg.nodeid)) ||
- !valid_mode(outarg.attr.mode)))
+ /* Zero nodeid is same as -ENOENT, but with valid timeout */
+ if (!err && outarg.nodeid &&
+ (invalid_nodeid(outarg.nodeid) || !valid_mode(outarg.attr.mode)))
err = -EIO;
if (!err && outarg.nodeid) {
inode = fuse_iget(dir->i_sb, outarg.nodeid, outarg.generation,
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 81b1e7d..6d643e2 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -22,7 +22,7 @@ libfuse_la_SOURCES = \
helper.c \
$(mount_source)
-libfuse_la_LDFLAGS = -lpthread -version-number 2:5:2 \
+libfuse_la_LDFLAGS = -lpthread -version-number 2:5:3 \
-Wl,--version-script,fuse_versionscript
EXTRA_DIST = fuse_versionscript
diff --git a/lib/fuse.c b/lib/fuse.c
index cad77e4..faf1967 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -1225,6 +1225,7 @@ static void fuse_release(fuse_req_t req, fuse_ino_t ino,
struct node *node;
int unlink_hidden;
+ pthread_rwlock_rdlock(&f->tree_lock);
pthread_mutex_lock(&f->lock);
node = get_node(f, ino);
assert(node->open_count > 0);
@@ -1232,7 +1233,6 @@ static void fuse_release(fuse_req_t req, fuse_ino_t ino,
unlink_hidden = (node->is_hidden && !node->open_count);
pthread_mutex_unlock(&f->lock);
- pthread_rwlock_rdlock(&f->tree_lock);
path = get_path(f, ino);
if (f->conf.debug) {
printf("RELEASE[%llu] flags: 0x%x\n", (unsigned long long) fi->fh,
@@ -1937,6 +1937,7 @@ struct fuse *fuse_new_common(int fd, struct fuse_args *args,
}
mutex_init(&f->lock);
+ pthread_rwlock_init(&f->tree_lock, NULL);
memcpy(&f->op, op, op_size);
f->compat = compat;