[Ocfs2-devel] [PATCH] ocfs2-1.4: fix sendfile locking
Mark Fasheh
mfasheh at suse.com
Fri Dec 4 14:08:57 PST 2009
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>
Index: linux/fs/ocfs2/file.c
===================================================================
--- linux.orig/fs/ocfs2/file.c
+++ linux/fs/ocfs2/file.c
@@ -2511,15 +2511,14 @@ static ssize_t ocfs2_file_sendfile(struc
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;
More information about the Ocfs2-devel
mailing list