ceph: avoid iput() while holding spinlock in ceph_dir_fsync
authorSage Weil <sage@newdream.net>
Tue, 3 Jan 2012 18:09:07 +0000 (10:09 -0800)
committerSage Weil <sage@newdream.net>
Tue, 10 Jan 2012 16:57:02 +0000 (08:57 -0800)
ceph_mdsc_put_request() can call iput(), which can sleep.  Don't do that.

Fixes: #1812
Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/dir.c

index a421555b229db40d47c2fee3168f5e408afc6a9e..974ef1e4d268b46f6e3d7eebd9468c03e71bc627 100644 (file)
@@ -1218,6 +1218,7 @@ static int ceph_dir_fsync(struct file *file, loff_t start, loff_t end,
        do {
                ceph_mdsc_get_request(req);
                spin_unlock(&ci->i_unsafe_lock);
+
                dout("dir_fsync %p wait on tid %llu (until %llu)\n",
                     inode, req->r_tid, last_tid);
                if (req->r_timeout) {
@@ -1230,9 +1231,9 @@ static int ceph_dir_fsync(struct file *file, loff_t start, loff_t end,
                } else {
                        wait_for_completion(&req->r_safe_completion);
                }
-               spin_lock(&ci->i_unsafe_lock);
                ceph_mdsc_put_request(req);
 
+               spin_lock(&ci->i_unsafe_lock);
                if (ret || list_empty(head))
                        break;
                req = list_entry(head->next,