diff options
author | Miklos Szeredi <mszeredi@suse.cz> | 2015-07-01 16:26:01 +0200 |
---|---|---|
committer | Miklos Szeredi <mszeredi@suse.cz> | 2015-07-01 16:26:01 +0200 |
commit | e16714d8756dc1237a66994e139b61feebcf707a (patch) | |
tree | 149f1106ae65abfb03e892a295f15d3a17477672 /fs/fuse/dev.c | |
parent | f88996a93324483ff3ec027312bbacacf97a555b (diff) |
fuse: duplicate ->connected in iqueue
This will allow checking ->connected just with the input queue lock.
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Reviewed-by: Ashish Samant <ashish.samant@oracle.com>
Diffstat (limited to 'fs/fuse/dev.c')
-rw-r--r-- | fs/fuse/dev.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c index 24407e21fb82..a24ead993650 100644 --- a/fs/fuse/dev.c +++ b/fs/fuse/dev.c @@ -341,7 +341,7 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, forget->forget_one.nlookup = nlookup; spin_lock(&fc->lock); - if (fc->connected) { + if (fiq->connected) { fiq->forget_list_tail->next = forget; fiq->forget_list_tail = forget; wake_up(&fiq->waitq); @@ -471,14 +471,14 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) static void __fuse_request_send(struct fuse_conn *fc, struct fuse_req *req) { + struct fuse_iqueue *fiq = &fc->iq; + BUG_ON(test_bit(FR_BACKGROUND, &req->flags)); spin_lock(&fc->lock); - if (!fc->connected) { + if (!fiq->connected) { spin_unlock(&fc->lock); req->out.h.error = -ENOTCONN; } else { - struct fuse_iqueue *fiq = &fc->iq; - req->in.h.unique = fuse_get_unique(fiq); queue_request(fiq, req); /* acquire extra reference, since request is still needed @@ -619,7 +619,7 @@ static int fuse_request_send_notify_reply(struct fuse_conn *fc, __clear_bit(FR_ISREPLY, &req->flags); req->in.h.unique = unique; spin_lock(&fc->lock); - if (fc->connected) { + if (fiq->connected) { queue_request(fiq, req); err = 0; } @@ -1071,7 +1071,7 @@ __acquires(fc->lock) DECLARE_WAITQUEUE(wait, current); add_wait_queue_exclusive(&fiq->waitq, &wait); - while (fc->connected && !request_pending(fiq)) { + while (fiq->connected && !request_pending(fiq)) { set_current_state(TASK_INTERRUPTIBLE); if (signal_pending(current)) break; @@ -1261,13 +1261,13 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file, restart: spin_lock(&fc->lock); err = -EAGAIN; - if ((file->f_flags & O_NONBLOCK) && fc->connected && + if ((file->f_flags & O_NONBLOCK) && fiq->connected && !request_pending(fiq)) goto err_unlock; request_wait(fc); err = -ENODEV; - if (!fc->connected) + if (!fiq->connected) goto err_unlock; err = -ERESTARTSYS; if (!request_pending(fiq)) @@ -2054,7 +2054,7 @@ static unsigned fuse_dev_poll(struct file *file, poll_table *wait) poll_wait(file, &fiq->waitq, wait); spin_lock(&fc->lock); - if (!fc->connected) + if (!fiq->connected) mask = POLLERR; else if (request_pending(fiq)) mask |= POLLIN | POLLRDNORM; @@ -2127,6 +2127,7 @@ void fuse_abort_conn(struct fuse_conn *fc) LIST_HEAD(to_end2); fc->connected = 0; + fiq->connected = 0; fc->blocked = 0; fuse_set_initialized(fc); list_for_each_entry_safe(req, next, &fc->io, list) { |