fix
authorMiklos Szeredi <miklos@szeredi.hu>
Thu, 2 Feb 2006 12:07:34 +0000 (12:07 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Thu, 2 Feb 2006 12:07:34 +0000 (12:07 +0000)
ChangeLog
configure.in
kernel/configure.ac
kernel/dev.c
lib/Makefile.am

index bae6d953657379eb4aea01491bd63a3a43ae1cd8..ae226892d836101321138a6a66d6d632f857015d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2006-02-02  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Fix even bigger bug introduced in fix for request_end() on
+       2006-01-14.  Reported by Gal Rosen
+
 2006-01-21  Miklos Szeredi <miklos@szeredi.hu>
 
        * Released 2.5.1
index aa627ca68f7f461ff15240f76b726bc77f9d1637..7836640cf008799b1deb28443eaa7f4ff961251a 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT(fuse, 2.5.1)
+AC_INIT(fuse, 2.5.2)
 AC_CANONICAL_TARGET
 AM_INIT_AUTOMAKE
 AM_CONFIG_HEADER(include/config.h)
index 570f8ce601f07fdbe70c56db481e2ad266224b3c..ba7a792e5406f227696d52483ac0ac74e3a539ee 100644 (file)
@@ -1,4 +1,4 @@
-AC_INIT(fuse-kernel, 2.5.1)
+AC_INIT(fuse-kernel, 2.5.2)
 AC_CONFIG_HEADERS([config.h])
 
 AC_PROG_INSTALL
index 3880f130a7d16801e1e62167301d271438c831bc..e54a5c927642e8cc8f5adc5839458b624f7669e3 100644 (file)
@@ -157,7 +157,6 @@ struct fuse_req *fuse_get_request(struct fuse_conn *fc)
 
 static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req)
 {
-       spin_lock(&fuse_lock);
        if (req->preallocated)
                list_add(&req->list, &fc->unused_list);
        else
@@ -168,10 +167,18 @@ static void fuse_putback_request(struct fuse_conn *fc, struct fuse_req *req)
                fc->outstanding_debt--;
        else
                up(&fc->outstanding_sem);
-       spin_unlock(&fuse_lock);
 }
 
 void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req)
+{
+       if (atomic_dec_and_test(&req->count)) {
+               spin_lock(&fuse_lock);
+               fuse_putback_request(fc, req);
+               spin_unlock(&fuse_lock);
+       }
+}
+
+void fuse_put_request_locked(struct fuse_conn *fc, struct fuse_req *req)
 {
        if (atomic_dec_and_test(&req->count))
                fuse_putback_request(fc, req);
@@ -222,24 +229,28 @@ static void process_init_reply(struct fuse_conn *fc, struct fuse_req *req)
 static void request_end(struct fuse_conn *fc, struct fuse_req *req)
 {
        req->finished = 1;
-       spin_unlock(&fuse_lock);
-       if (req->background) {
+       if (!req->background) {
+               wake_up(&req->waitq);
+               fuse_put_request_locked(fc, req);
+               spin_unlock(&fuse_lock);
+       } else {
+               spin_unlock(&fuse_lock);
                down_read(&fc->sbput_sem);
                if (fc->mounted)
                        fuse_release_background(req);
                up_read(&fc->sbput_sem);
+               if (req->in.h.opcode == FUSE_INIT)
+                       process_init_reply(fc, req);
+               else if (req->in.h.opcode == FUSE_RELEASE &&
+                        req->inode == NULL) {
+                       /* Special case for failed iget in CREATE */
+                       u64 nodeid = req->in.h.nodeid;
+                       fuse_reset_request(req);
+                       fuse_send_forget(fc, req, nodeid, 1);
+                       return;
+               }
+               fuse_put_request(fc, req);
        }
-       wake_up(&req->waitq);
-       if (req->in.h.opcode == FUSE_INIT)
-               process_init_reply(fc, req);
-       else if (req->in.h.opcode == FUSE_RELEASE && req->inode == NULL) {
-               /* Special case for failed iget in CREATE */
-               u64 nodeid = req->in.h.nodeid;
-               fuse_reset_request(req);
-               fuse_send_forget(fc, req, nodeid, 1);
-               return;
-       }
-       fuse_put_request(fc, req);
 }
 
 /*
index fb52a0b409de668b16f55c684727b25a3356b99a..81b1e7dc30390878c3383cf058a7749b3b82951e 100644 (file)
@@ -22,7 +22,7 @@ libfuse_la_SOURCES =          \
        helper.c                \
        $(mount_source)
 
-libfuse_la_LDFLAGS = -lpthread -version-number 2:5:1 \
+libfuse_la_LDFLAGS = -lpthread -version-number 2:5:2 \
        -Wl,--version-script,fuse_versionscript
 
 EXTRA_DIST = fuse_versionscript