From eca100fa62c500ee667e175947e8a2a202e532c0 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Thu, 2 Feb 2006 12:07:34 +0000 Subject: [PATCH] fix --- ChangeLog | 5 +++++ configure.in | 2 +- kernel/configure.ac | 2 +- kernel/dev.c | 41 ++++++++++++++++++++++++++--------------- lib/Makefile.am | 2 +- 5 files changed, 34 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index bae6d95..ae22689 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2006-02-02 Miklos Szeredi + + * Fix even bigger bug introduced in fix for request_end() on + 2006-01-14. Reported by Gal Rosen + 2006-01-21 Miklos Szeredi * Released 2.5.1 diff --git a/configure.in b/configure.in index aa627ca..7836640 100644 --- a/configure.in +++ b/configure.in @@ -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) diff --git a/kernel/configure.ac b/kernel/configure.ac index 570f8ce..ba7a792 100644 --- a/kernel/configure.ac +++ b/kernel/configure.ac @@ -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 diff --git a/kernel/dev.c b/kernel/dev.c index 3880f13..e54a5c9 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -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); } /* diff --git a/lib/Makefile.am b/lib/Makefile.am index fb52a0b..81b1e7d 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:1 \ +libfuse_la_LDFLAGS = -lpthread -version-number 2:5:2 \ -Wl,--version-script,fuse_versionscript EXTRA_DIST = fuse_versionscript -- 2.30.2