Looks good; I've applied this to the tree.  Canyou review the below patch 
while we are looking at this code?

Thanks!
sage

>From 26d0d7b213d87db0ef46e885ae749c27395c11b1 Mon Sep 17 00:00:00 2001
From: Sage Weil <[email protected]>
Date: Thu, 8 Aug 2013 09:39:44 -0700
Subject: [PATCH] ceph: replace hold_mutex flag with goto

All of the early exit paths need to drop the mutex; it is only the normal
path through the function that does not.  Skip the unlock in that case
with a goto out_unlocked.

Signed-off-by: Sage Weil <[email protected]>
---
 fs/ceph/file.c | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/fs/ceph/file.c b/fs/ceph/file.c
index 7478d5d..a17ffe4 100644
--- a/fs/ceph/file.c
+++ b/fs/ceph/file.c
@@ -710,13 +710,11 @@ static ssize_t ceph_aio_write(struct kiocb *iocb, const 
struct iovec *iov,
                &ceph_sb_to_client(inode->i_sb)->client->osdc;
        ssize_t count, written = 0;
        int err, want, got;
-       bool hold_mutex;
 
        if (ceph_snap(inode) != CEPH_NOSNAP)
                return -EROFS;
 
        mutex_lock(&inode->i_mutex);
-       hold_mutex = true;
 
        err = generic_segment_checks(iov, &nr_segs, &count, VERIFY_READ);
        if (err)
@@ -772,7 +770,6 @@ retry_snap:
                                inode, ceph_vinop(inode),
                                pos, (unsigned)iov->iov_len);
                        mutex_lock(&inode->i_mutex);
-                       hold_mutex = true;
                        goto retry_snap;
                }
        } else {
@@ -781,7 +778,6 @@ retry_snap:
                                                      count, 0);
                mutex_unlock(&inode->i_mutex);
        }
-       hold_mutex = false;
 
        if (written >= 0) {
                int dirty;
@@ -805,11 +801,12 @@ retry_snap:
                        written = err;
        }
 
+       goto out_unlocked;
+
 out:
-       if (hold_mutex)
-               mutex_unlock(&inode->i_mutex);
+       mutex_unlock(&inode->i_mutex);
+out_unlocked:
        current->backing_dev_info = NULL;
-
        return written ? written : err;
 }
 
-- 
1.8.1.2




On Thu, 8 Aug 2013, majianpeng wrote:

> Only for ceph_sync_write, the osd can return EOLDSNAPC.so move the
> related codes after the call ceph_sync_write.
> 
> Signed-off-by: Jianpeng Ma <[email protected]>
> ---
>  fs/ceph/file.c | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/fs/ceph/file.c b/fs/ceph/file.c
> index 2ddf061..30e959f 100644
> --- a/fs/ceph/file.c
> +++ b/fs/ceph/file.c
> @@ -768,6 +768,15 @@ retry_snap:
>               mutex_unlock(&inode->i_mutex);
>               written = ceph_sync_write(file, iov->iov_base, count,
>                                         pos, &iocb->ki_pos);
> +             if (written == -EOLDSNAPC) {
> +                     dout("aio_write %p %llx.%llx %llu~%u"
> +                             "got EOLDSNAPC, retrying\n",
> +                             inode, ceph_vinop(inode),
> +                             pos, (unsigned)iov->iov_len);
> +                     mutex_lock(&inode->i_mutex);
> +                     hold_mutex = true;
> +                     goto retry_snap;
> +             }
>       } else {
>               written = generic_file_buffered_write(iocb, iov, nr_segs,
>                                                     pos, &iocb->ki_pos,
> @@ -797,14 +806,7 @@ retry_snap:
>               if (err < 0)
>                       written = err;
>       }
> -
> -     if (written == -EOLDSNAPC) {
> -             dout("aio_write %p %llx.%llx %llu~%u got EOLDSNAPC, retrying\n",
> -                  inode, ceph_vinop(inode), pos, (unsigned)iov->iov_len);
> -             mutex_lock(&inode->i_mutex);
> -             hold_mutex = true;
> -             goto retry_snap;
> -     }
> +
>  out:
>       if (hold_mutex)
>               mutex_unlock(&inode->i_mutex);
> -- 
> 1.8.3.rc1.44.gb387c77
> 
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to