mirror of
https://github.com/torvalds/linux.git
synced 2025-01-01 07:42:07 +00:00
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>
This commit is contained in:
parent
f88996a933
commit
e16714d875
@ -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,
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
__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)
|
|||||||
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,
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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);
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user