diff options
author | Sage Weil <sage@newdream.net> | 2012-01-03 10:09:07 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2012-01-10 08:57:02 -0800 |
commit | 2ff179e650e95c2b21841b21dc46dc2edefd04cd (patch) | |
tree | 9b15ba73039053111d73da96227e1589b3f11ff2 /fs/ceph | |
parent | ee6b1baf67591b6d7ce1a6a07544343433d5ec9e (diff) | |
download | lwn-2ff179e650e95c2b21841b21dc46dc2edefd04cd.tar.gz lwn-2ff179e650e95c2b21841b21dc46dc2edefd04cd.zip |
ceph: avoid iput() while holding spinlock in ceph_dir_fsync
ceph_mdsc_put_request() can call iput(), which can sleep. Don't do that.
Fixes: #1812
Signed-off-by: Sage Weil <sage@newdream.net>
Diffstat (limited to 'fs/ceph')
-rw-r--r-- | fs/ceph/dir.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/fs/ceph/dir.c b/fs/ceph/dir.c index a421555b229d..974ef1e4d268 100644 --- a/fs/ceph/dir.c +++ b/fs/ceph/dir.c @@ -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, |