Commit e16714d8 authored by Miklos Szeredi's avatar Miklos Szeredi

fuse: duplicate ->connected in iqueue

This will allow checking ->connected just with the input queue lock.
Signed-off-by: default avatarMiklos Szeredi <mszeredi@suse.cz>
Reviewed-by: default avatarAshish Samant <ashish.samant@oracle.com>
parent f88996a9
...@@ -502,7 +502,6 @@ static int cuse_channel_open(struct inode *inode, struct file *file) ...@@ -502,7 +502,6 @@ static int cuse_channel_open(struct inode *inode, struct file *file)
INIT_LIST_HEAD(&cc->list); INIT_LIST_HEAD(&cc->list);
cc->fc.release = cuse_fc_release; cc->fc.release = cuse_fc_release;
cc->fc.connected = 1;
cc->fc.initialized = 1; cc->fc.initialized = 1;
rc = cuse_send_init(cc); rc = cuse_send_init(cc);
if (rc) { if (rc) {
......
...@@ -341,7 +341,7 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget, ...@@ -341,7 +341,7 @@ void fuse_queue_forget(struct fuse_conn *fc, struct fuse_forget_link *forget,
forget->forget_one.nlookup = nlookup; forget->forget_one.nlookup = nlookup;
spin_lock(&fc->lock); spin_lock(&fc->lock);
if (fc->connected) { if (fiq->connected) {
fiq->forget_list_tail->next = forget; fiq->forget_list_tail->next = forget;
fiq->forget_list_tail = forget; fiq->forget_list_tail = forget;
wake_up(&fiq->waitq); wake_up(&fiq->waitq);
...@@ -471,14 +471,14 @@ static void request_wait_answer(struct fuse_conn *fc, struct fuse_req *req) ...@@ -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) 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)); BUG_ON(test_bit(FR_BACKGROUND, &req->flags));
spin_lock(&fc->lock); spin_lock(&fc->lock);
if (!fc->connected) { if (!fiq->connected) {
spin_unlock(&fc->lock); spin_unlock(&fc->lock);
req->out.h.error = -ENOTCONN; req->out.h.error = -ENOTCONN;
} else { } else {
struct fuse_iqueue *fiq = &fc->iq;
req->in.h.unique = fuse_get_unique(fiq); req->in.h.unique = fuse_get_unique(fiq);
queue_request(fiq, req); queue_request(fiq, req);
/* acquire extra reference, since request is still needed /* acquire extra reference, since request is still needed
...@@ -619,7 +619,7 @@ static int fuse_request_send_notify_reply(struct fuse_conn *fc, ...@@ -619,7 +619,7 @@ static int fuse_request_send_notify_reply(struct fuse_conn *fc,
__clear_bit(FR_ISREPLY, &req->flags); __clear_bit(FR_ISREPLY, &req->flags);
req->in.h.unique = unique; req->in.h.unique = unique;
spin_lock(&fc->lock); spin_lock(&fc->lock);
if (fc->connected) { if (fiq->connected) {
queue_request(fiq, req); queue_request(fiq, req);
err = 0; err = 0;
} }
...@@ -1071,7 +1071,7 @@ __acquires(fc->lock) ...@@ -1071,7 +1071,7 @@ __acquires(fc->lock)
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
add_wait_queue_exclusive(&fiq->waitq, &wait); add_wait_queue_exclusive(&fiq->waitq, &wait);
while (fc->connected && !request_pending(fiq)) { while (fiq->connected && !request_pending(fiq)) {
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (signal_pending(current)) if (signal_pending(current))
break; break;
...@@ -1261,13 +1261,13 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file, ...@@ -1261,13 +1261,13 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file,
restart: restart:
spin_lock(&fc->lock); spin_lock(&fc->lock);
err = -EAGAIN; err = -EAGAIN;
if ((file->f_flags & O_NONBLOCK) && fc->connected && if ((file->f_flags & O_NONBLOCK) && fiq->connected &&
!request_pending(fiq)) !request_pending(fiq))
goto err_unlock; goto err_unlock;
request_wait(fc); request_wait(fc);
err = -ENODEV; err = -ENODEV;
if (!fc->connected) if (!fiq->connected)
goto err_unlock; goto err_unlock;
err = -ERESTARTSYS; err = -ERESTARTSYS;
if (!request_pending(fiq)) if (!request_pending(fiq))
...@@ -2054,7 +2054,7 @@ static unsigned fuse_dev_poll(struct file *file, poll_table *wait) ...@@ -2054,7 +2054,7 @@ static unsigned fuse_dev_poll(struct file *file, poll_table *wait)
poll_wait(file, &fiq->waitq, wait); poll_wait(file, &fiq->waitq, wait);
spin_lock(&fc->lock); spin_lock(&fc->lock);
if (!fc->connected) if (!fiq->connected)
mask = POLLERR; mask = POLLERR;
else if (request_pending(fiq)) else if (request_pending(fiq))
mask |= POLLIN | POLLRDNORM; mask |= POLLIN | POLLRDNORM;
...@@ -2127,6 +2127,7 @@ void fuse_abort_conn(struct fuse_conn *fc) ...@@ -2127,6 +2127,7 @@ void fuse_abort_conn(struct fuse_conn *fc)
LIST_HEAD(to_end2); LIST_HEAD(to_end2);
fc->connected = 0; fc->connected = 0;
fiq->connected = 0;
fc->blocked = 0; fc->blocked = 0;
fuse_set_initialized(fc); fuse_set_initialized(fc);
list_for_each_entry_safe(req, next, &fc->io, list) { list_for_each_entry_safe(req, next, &fc->io, list) {
......
...@@ -375,6 +375,9 @@ struct fuse_req { ...@@ -375,6 +375,9 @@ struct fuse_req {
}; };
struct fuse_iqueue { struct fuse_iqueue {
/** Connection established */
unsigned connected;
/** Readers of the connection are waiting on this */ /** Readers of the connection are waiting on this */
wait_queue_head_t waitq; wait_queue_head_t waitq;
......
...@@ -574,6 +574,7 @@ static void fuse_iqueue_init(struct fuse_iqueue *fiq) ...@@ -574,6 +574,7 @@ static void fuse_iqueue_init(struct fuse_iqueue *fiq)
INIT_LIST_HEAD(&fiq->pending); INIT_LIST_HEAD(&fiq->pending);
INIT_LIST_HEAD(&fiq->interrupts); INIT_LIST_HEAD(&fiq->interrupts);
fiq->forget_list_tail = &fiq->forget_list_head; fiq->forget_list_tail = &fiq->forget_list_head;
fiq->connected = 1;
} }
void fuse_conn_init(struct fuse_conn *fc) void fuse_conn_init(struct fuse_conn *fc)
...@@ -596,6 +597,7 @@ void fuse_conn_init(struct fuse_conn *fc) ...@@ -596,6 +597,7 @@ void fuse_conn_init(struct fuse_conn *fc)
fc->polled_files = RB_ROOT; fc->polled_files = RB_ROOT;
fc->blocked = 0; fc->blocked = 0;
fc->initialized = 0; fc->initialized = 0;
fc->connected = 1;
fc->attr_version = 1; fc->attr_version = 1;
get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key)); get_random_bytes(&fc->scramble_key, sizeof(fc->scramble_key));
} }
...@@ -1084,7 +1086,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent) ...@@ -1084,7 +1086,6 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
list_add_tail(&fc->entry, &fuse_conn_list); list_add_tail(&fc->entry, &fuse_conn_list);
sb->s_root = root_dentry; sb->s_root = root_dentry;
fc->connected = 1;
file->private_data = fuse_conn_get(fc); file->private_data = fuse_conn_get(fc);
mutex_unlock(&fuse_mutex); mutex_unlock(&fuse_mutex);
/* /*
......
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