Commit 9ba7cbba authored by Miklos Szeredi's avatar Miklos Szeredi Committed by Linus Torvalds

[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: default avatarMiklos Szeredi <miklos@szeredi.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d77a1d5b
...@@ -26,7 +26,7 @@ static struct fuse_conn *fuse_get_conn(struct file *file) ...@@ -26,7 +26,7 @@ static struct fuse_conn *fuse_get_conn(struct file *file)
struct fuse_conn *fc; struct fuse_conn *fc;
spin_lock(&fuse_lock); spin_lock(&fuse_lock);
fc = file->private_data; fc = file->private_data;
if (fc && !fc->mounted) if (fc && !fc->connected)
fc = NULL; fc = NULL;
spin_unlock(&fuse_lock); spin_unlock(&fuse_lock);
return fc; return fc;
...@@ -594,7 +594,7 @@ static void request_wait(struct fuse_conn *fc) ...@@ -594,7 +594,7 @@ static void request_wait(struct fuse_conn *fc)
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
add_wait_queue_exclusive(&fc->waitq, &wait); 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); set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current)) if (signal_pending(current))
break; break;
...@@ -634,7 +634,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov, ...@@ -634,7 +634,7 @@ static ssize_t fuse_dev_readv(struct file *file, const struct iovec *iov,
goto err_unlock; goto err_unlock;
request_wait(fc); request_wait(fc);
err = -ENODEV; err = -ENODEV;
if (!fc->mounted) if (!fc->connected)
goto err_unlock; goto err_unlock;
err = -ERESTARTSYS; err = -ERESTARTSYS;
if (list_empty(&fc->pending)) if (list_empty(&fc->pending))
......
...@@ -249,7 +249,8 @@ struct fuse_conn { ...@@ -249,7 +249,8 @@ struct fuse_conn {
/** Mount is active */ /** Mount is active */
unsigned mounted : 1; unsigned mounted : 1;
/** Connection established */ /** Connection established, cleared on umount and device
release */
unsigned connected : 1; unsigned connected : 1;
/** Connection failed (version mismatch) */ /** Connection failed (version mismatch) */
......
...@@ -200,6 +200,7 @@ static void fuse_put_super(struct super_block *sb) ...@@ -200,6 +200,7 @@ static void fuse_put_super(struct super_block *sb)
spin_lock(&fuse_lock); spin_lock(&fuse_lock);
fc->mounted = 0; fc->mounted = 0;
fc->connected = 0;
/* Flush all readers on this fs */ /* Flush all readers on this fs */
wake_up_all(&fc->waitq); wake_up_all(&fc->waitq);
up_write(&fc->sbput_sem); up_write(&fc->sbput_sem);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment