fuse: duplicate ->connected in pqueue
authorMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:26:04 +0000 (16:26 +0200)
committerMiklos Szeredi <mszeredi@suse.cz>
Wed, 1 Jul 2015 14:26:04 +0000 (16:26 +0200)
This will allow checking ->connected just with the processing queue lock.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Reviewed-by: Ashish Samant <ashish.samant@oracle.com>
fs/fuse/dev.c
fs/fuse/fuse_i.h
fs/fuse/inode.c

index 0fae2a7ded77dce8bcbb5892909be6b9653c9ded..6321d761c3c373a3a00c981c0e81191c755871c8 100644 (file)
@@ -1303,7 +1303,7 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, struct file *file,
        fuse_copy_finish(cs);
        spin_lock(&fc->lock);
        clear_bit(FR_LOCKED, &req->flags);
-       if (!fc->connected) {
+       if (!fpq->connected) {
                request_end(fc, req);
                return -ENODEV;
        }
@@ -1891,7 +1891,7 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
 
        spin_lock(&fc->lock);
        err = -ENOENT;
-       if (!fc->connected)
+       if (!fpq->connected)
                goto err_unlock;
 
        req = request_find(fpq, oh.unique);
@@ -1928,7 +1928,7 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
 
        spin_lock(&fc->lock);
        clear_bit(FR_LOCKED, &req->flags);
-       if (!fc->connected)
+       if (!fpq->connected)
                err = -ENOENT;
        else if (err)
                req->out.h.error = -EIO;
@@ -2125,6 +2125,7 @@ void fuse_abort_conn(struct fuse_conn *fc)
                fc->connected = 0;
                fc->blocked = 0;
                fuse_set_initialized(fc);
+               fpq->connected = 0;
                list_for_each_entry_safe(req, next, &fpq->io, list) {
                        req->out.h.error = -ECONNABORTED;
                        spin_lock(&req->waitq.lock);
index 3620eec018a47d2061b9fbab0c7a498d5391f358..5897d89ea2baee2c202de8efc60c10852ffaf5e5 100644 (file)
@@ -402,6 +402,9 @@ struct fuse_iqueue {
 };
 
 struct fuse_pqueue {
+       /** Connection established */
+       unsigned connected;
+
        /** The list of requests being processed */
        struct list_head processing;
 
index 7b146bb68dd5b34136a9a1afa6f171cc83889ebf..88b9ca4016234cd4c25c3bb04fd476153f77ac87 100644 (file)
@@ -582,6 +582,7 @@ static void fuse_pqueue_init(struct fuse_pqueue *fpq)
        memset(fpq, 0, sizeof(struct fuse_pqueue));
        INIT_LIST_HEAD(&fpq->processing);
        INIT_LIST_HEAD(&fpq->io);
+       fpq->connected = 1;
 }
 
 void fuse_conn_init(struct fuse_conn *fc)