aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fuse/fuse_i.h
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-04-26 10:48:55 +0200
committerMiklos Szeredi <miklos@szeredi.hu>2006-04-26 10:48:55 +0200
commit5a5fb1ea74d8b82ca1461b885a1334fb21e037be (patch)
treef6e823d4a8e09ce0780d891f8f38f033ccbd7da2 /fs/fuse/fuse_i.h
parent4d5c34ec7b007cfb0771a36996b009f194acbb2f (diff)
downloadkernel_samsung_smdk4412-5a5fb1ea74d8b82ca1461b885a1334fb21e037be.tar.gz
kernel_samsung_smdk4412-5a5fb1ea74d8b82ca1461b885a1334fb21e037be.tar.bz2
kernel_samsung_smdk4412-5a5fb1ea74d8b82ca1461b885a1334fb21e037be.zip
Revert "[fuse] fix deadlock between fuse_put_super() and request_end()"
This reverts 73ce8355c243a434524a34c05cc417dd0467996e commit. It was wrong, because it didn't take into account the requirement, that iput() for background requests must be performed synchronously with ->put_super(), otherwise active inodes may remain after unmount. The right solution is to keep the sbput_sem and perform iput() within the locked region, but move fput() outside sbput_sem. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r--fs/fuse/fuse_i.h12
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 59661c481d9..0474202cb5d 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -258,9 +258,15 @@ struct fuse_conn {
/** waitq for blocked connection */
wait_queue_head_t blocked_waitq;
+ /** RW semaphore for exclusion with fuse_put_super() */
+ struct rw_semaphore sbput_sem;
+
/** The next unique request id */
u64 reqctr;
+ /** Mount is active */
+ unsigned mounted;
+
/** Connection established, cleared on umount, connection
abort and device release */
unsigned connected;
@@ -471,11 +477,11 @@ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req);
void request_send_background(struct fuse_conn *fc, struct fuse_req *req);
/**
- * Remove request from the the background list
+ * Release inodes and file associated with background request
*/
-void fuse_remove_background(struct fuse_conn *fc, struct fuse_req *req);
+void fuse_release_background(struct fuse_conn *fc, struct fuse_req *req);
-/** Abort all requests */
+/* Abort all requests */
void fuse_abort_conn(struct fuse_conn *fc);
/**