aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2001-11-21 12:21:19 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2001-11-21 12:21:19 +0000
commit96249989efe40367841a579c41ec5025c715afb5 (patch)
tree3843dfca5d2795eada5c1123a36369c88fdf801c /kernel
parentcc8c975f7757ce89d15aad31df6c8b7086169653 (diff)
downloadlibfuse-96249989efe40367841a579c41ec5025c715afb5.tar.gz
better exit handling
Diffstat (limited to 'kernel')
-rw-r--r--kernel/dev.c9
-rw-r--r--kernel/inode.c2
2 files changed, 6 insertions, 5 deletions
diff --git a/kernel/dev.c b/kernel/dev.c
index 1bff1eb..7036153 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -173,7 +173,7 @@ static void request_wait(struct fuse_conn *fc)
DECLARE_WAITQUEUE(wait, current);
add_wait_queue_exclusive(&fc->waitq, &wait);
- while(list_empty(&fc->pending)) {
+ while(fc->sb != NULL && list_empty(&fc->pending)) {
set_current_state(TASK_INTERRUPTIBLE);
if(signal_pending(current))
break;
@@ -230,17 +230,16 @@ static ssize_t fuse_dev_read(struct file *file, char *buf, size_t nbytes,
struct fuse_conn *fc = DEV_FC(file);
struct fuse_req *req = NULL;
- if(fc->sb == NULL)
- return -EPERM;
-
spin_lock(&fuse_lock);
request_wait(fc);
- if(!list_empty(&fc->pending)) {
+ if(fc->sb != NULL && !list_empty(&fc->pending)) {
req = list_entry(fc->pending.next, struct fuse_req, list);
list_del_init(&req->list);
req->locked = 1;
}
spin_unlock(&fuse_lock);
+ if(fc->sb == NULL)
+ return -ENODEV;
if(req == NULL)
return -ERESTARTSYS;
diff --git a/kernel/inode.c b/kernel/inode.c
index df402ba..0f5fc8c 100644
--- a/kernel/inode.c
+++ b/kernel/inode.c
@@ -64,6 +64,8 @@ static void fuse_put_super(struct super_block *sb)
fc->flags = 0;
fuse_release_conn(fc);
sb->u.generic_sbp = NULL;
+ /* Flush all readers on this fs */
+ wake_up_all(&fc->waitq);
spin_unlock(&fuse_lock);
}