summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 609875dbd212..5cd43bf917a4 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 5742253164d9..e824a09d3151 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 d7aaffe979dd..d6a09fdaa941 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);