[Ocfs2-devel] [PATCH 1/3] ocfs2: fix sendfile locking
Sunil Mushran
sunil.mushran at oracle.com
Fri Dec 4 17:54:04 PST 2009
From: Mark Fasheh <mfasheh at suse.com>
ocfs2_sendfile() was duplicating locking which happens later on in
ocfs2_readpage(). The double locking would sometimes cause a lockup in nfsd,
which uses ->sendfile() for fast read support. An easy way to see this is to
mount an exported ocfs2 fs on a client and initiate two parallel read/write
dd commands to the same file when there is low memory on the server.
Fix ocfs2_sendfile() so that it only takes and immediately drops the cluster
lock. This is consistent with the locking in ocfs2_file_splice_read().
Signed-off-by: Mark Fasheh <mfasheh at suse.com>
Acked-by: Sunil Mushran <sunil.mushran at oracle.com>
---
fs/ocfs2/file.c | 11 +++++------
1 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index daba3a6..3a2ba66 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -2284,15 +2284,14 @@ static ssize_t ocfs2_file_sendfile(struct file *in_file,
mlog_errno(ret);
goto bail;
}
+ ocfs2_inode_unlock(inode, 0);
- down_read(&OCFS2_I(inode)->ip_alloc_sem);
-
+ /*
+ * This uses ->readpage, so we don't want to hold any cluster
+ * locks before the call.
+ */
ret = generic_file_sendfile(in_file, ppos, count, actor, target);
- up_read(&OCFS2_I(inode)->ip_alloc_sem);
-
- ocfs2_inode_unlock(inode, 0);
-
bail:
mlog_exit(ret);
return ret;
--
1.6.3.3
More information about the Ocfs2-devel
mailing list