new version origin/fuse_2_5_bugfix fuse_2_5_3
authorMiklos Szeredi <miklos@szeredi.hu>
Mon, 10 Apr 2006 08:56:41 +0000 (08:56 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Mon, 10 Apr 2006 08:56:41 +0000 (08:56 +0000)
ChangeLog
configure.in
kernel/configure.ac
kernel/dir.c
lib/Makefile.am
lib/fuse.c

index b53bdb164746d3b3bcf3952c16ef8306c0ea3f10..f70507dfa4295b62bf54075dafea71fcbc193761 100644 (file)
--- 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().
index 7836640cf008799b1deb28443eaa7f4ff961251a..c90322bed804f26dc0d3e859c880bab5eb6752e5 100644 (file)
@@ -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)
index ba7a792e5406f227696d52483ac0ac74e3a539ee..0f3a9357b239f490a118a0ebe2f15b7d94ad080a 100644 (file)
@@ -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
index 084946d2bb5853e1557dd2b650668e0c3e0068c8..f8658bec64255e2fa6496f49ec52fd23355e3afa 100644 (file)
@@ -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,
index 81b1e7dc30390878c3383cf058a7749b3b82951e..6d643e26c073ef1be621f2913919c6e13884c777 100644 (file)
@@ -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
index cad77e4b556885bd495d8864b810629db746b39f..faf196780609c49bc8fe99eba4f7a779f336562b 100644 (file)
@@ -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;