summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2006-01-16 22:14:34 -0800
committerLinus Torvalds <torvalds@g5.osdl.org>2006-01-16 23:15:30 -0800
commit9ba7cbba100bdaca7316d71d6c6298e61191f8b2 (patch)
tree999e964132731388ff312df78623020600fe32e2
parentd77a1d5b611742c538364f041ff4610d27b14fe7 (diff)
downloadop-kernel-dev-9ba7cbba100bdaca7316d71d6c6298e61191f8b2.zip
op-kernel-dev-9ba7cbba100bdaca7316d71d6c6298e61191f8b2.tar.gz
[PATCH] fuse: extend semantics of connected flag
The ->connected flag for a fuse_conn object previously only indicated whether the device file for this connection is currently open or not. Change it's meaning so that it indicates whether the connection is active or not: now either umount or device release will clear the flag. The separate ->mounted flag is still needed for handling background requests. Signed-off-by: Miklos Szeredi <miklos@szeredi.hu> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--fs/fuse/dev.c6
-rw-r--r--fs/fuse/fuse_i.h3
-rw-r--r--fs/fuse/inode.c1
3 files changed, 6 insertions, 4 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 609875d..5cd43bf 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -26,7 +26,7 @@ static struct fuse_conn *fuse_get_conn(struct file *file)
struct fuse_conn *fc;
spin_lock(&fuse_lock);
fc = file->private_data;
- if (fc && !fc->mounted)
+ if (fc && !fc->connected)
fc = NULL;
spin_unlock(&fuse_lock);
return fc;
@@ -594,7 +594,7 @@ static void request_wait(struct fuse_conn *fc)
DECLARE_WAITQUEUE(wait, current);
add_wait_queue_exclusive(&fc->waitq, &wait);
- while (fc->mounted && list_empty(&fc->pending)) {
+ while (fc->connected && list_empty(&fc->pending)) {
set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current))
break;
@@ -634,7 +634,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov,
goto err_unlock;
request_wait(fc);
err = -ENODEV;
- if (!fc->mounted)
+ if (!fc->connected)
goto err_unlock;
err = -ERESTARTSYS;
if (list_empty(&fc->pending))
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 5742253..e824a09 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -249,7 +249,8 @@ struct fuse_conn {
/** Mount is active */
unsigned mounted : 1;
- /** Connection established */
+ /** Connection established, cleared on umount and device
+ release */
unsigned connected : 1;
/** Connection failed (version mismatch) */
diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
index d7aaffe..d6a09fd 100644
--- a/fs/fuse/inode.c
+++ b/fs/fuse/inode.c
@@ -200,6 +200,7 @@ static void fuse_put_super(struct super_block *sb)
spin_lock(&fuse_lock);
fc->mounted = 0;
+ fc->connected = 0;
/* Flush all readers on this fs */
wake_up_all(&fc->waitq);
up_write(&fc->sbput_sem);
OpenPOWER on IntegriCloud