Backport from ml:

commit 46c34a348b0ac74fc9646de8ef0c5b8b29f09da9
Author: Miklos Szeredi <[email protected]>
Date:   Wed Jul 1 16:26:07 2015 +0200

    fuse: no fc->lock for pqueue parts

    Remove fc->lock protection from processing queue members, now protected by
    fpq->lock.

    Signed-off-by: Miklos Szeredi <[email protected]>
    Reviewed-by: Ashish Samant <[email protected]>

Signed-off-by: Maxim Patlasov <[email protected]>
---
 fs/fuse/dev.c |   16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 3733cea..16e2be9 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1243,7 +1243,6 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, 
struct file *file,
        list_del_init(&req->list);
        spin_unlock(&fiq->waitq.lock);
 
-       spin_lock(&fc->lock);
        in = &req->in;
        reqsize = in->h.len;
        /* If request is too large, reply with an error and restart the read */
@@ -1252,21 +1251,18 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, 
struct file *file,
                /* SETXATTR is special, since it may contain too large data */
                if (in->h.opcode == FUSE_SETXATTR)
                        req->out.h.error = -E2BIG;
-               spin_unlock(&fc->lock);
                request_end(fc, req);
                goto restart;
        }
        spin_lock(&fpq->lock);
        list_add(&req->list, &fpq->io);
        spin_unlock(&fpq->lock);
-       spin_unlock(&fc->lock);
        cs->req = req;
        err = fuse_copy_one(cs, &in->h, sizeof(in->h));
        if (!err)
                err = fuse_copy_args(cs, in->numargs, in->argpages, in->argbvec,
                                     (struct fuse_arg *) in->args, 0);
        fuse_copy_finish(cs);
-       spin_lock(&fc->lock);
        spin_lock(&fpq->lock);
        clear_bit(FR_LOCKED, &req->flags);
        if (!fpq->connected) {
@@ -1288,7 +1284,6 @@ static ssize_t fuse_dev_do_read(struct fuse_conn *fc, 
struct file *file,
        smp_mb__after_atomic();
        if (test_bit(FR_INTERRUPTED, &req->flags))
                queue_interrupt(fiq, req);
-       spin_unlock(&fc->lock);
 
        return reqsize;
 
@@ -1296,7 +1291,6 @@ out_end:
        if (!test_bit(FR_PRIVATE, &req->flags))
                list_del_init(&req->list);
        spin_unlock(&fpq->lock);
-       spin_unlock(&fc->lock);
        request_end(fc, req);
        return err;
 
@@ -1896,7 +1890,6 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
        if (oh.error <= -1000 || oh.error > 0)
                goto err_finish;
 
-       spin_lock(&fc->lock);
        spin_lock(&fpq->lock);
        err = -ENOENT;
        if (!fpq->connected)
@@ -1912,14 +1905,13 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
 
                err = -EINVAL;
                if (nbytes != sizeof(struct fuse_out_header))
-                       goto err_unlock;
+                       goto err_finish;
 
                if (oh.error == -ENOSYS)
                        fc->no_interrupt = 1;
                else if (oh.error == -EAGAIN)
                        queue_interrupt(&fc->iq, req);
 
-               spin_unlock(&fc->lock);
                fuse_copy_finish(cs);
                return nbytes;
        }
@@ -1932,12 +1924,10 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
        cs->req = req;
        if (!req->out.page_replace)
                cs->move_pages = 0;
-       spin_unlock(&fc->lock);
 
        err = copy_out_args(cs, &req->out, nbytes);
        fuse_copy_finish(cs);
 
-       spin_lock(&fc->lock);
        spin_lock(&fpq->lock);
        clear_bit(FR_LOCKED, &req->flags);
        if (!fpq->connected)
@@ -1947,15 +1937,13 @@ static ssize_t fuse_dev_do_write(struct fuse_conn *fc,
        if (!test_bit(FR_PRIVATE, &req->flags))
                list_del_init(&req->list);
        spin_unlock(&fpq->lock);
-       spin_unlock(&fc->lock);
+
        request_end(fc, req);
 
        return err ? err : nbytes;
 
  err_unlock_pq:
        spin_unlock(&fpq->lock);
- err_unlock:
-       spin_unlock(&fc->lock);
  err_finish:
        fuse_copy_finish(cs);
        return err;

_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to