Skip to content

Commit 37a8d89

Browse files
josephhztorvalds
authored andcommitted
ocfs2: take inode lock when get clusters
We need take inode lock when calling ocfs2_get_clusters. And use GFP_NOFS instead of GFP_KERNEL. Signed-off-by: Joseph Qi <[email protected]> Cc: Mark Fasheh <[email protected]> Cc: Joel Becker <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 7e9b195 commit 37a8d89

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

fs/ocfs2/aops.c

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,20 +772,29 @@ static ssize_t ocfs2_direct_IO_write(struct kiocb *iocb,
772772
u32 p_cpos = 0;
773773
u32 v_cpos = ocfs2_bytes_to_clusters(osb->sb, offset);
774774

775+
ret = ocfs2_inode_lock(inode, NULL, 0);
776+
if (ret < 0) {
777+
mlog_errno(ret);
778+
goto clean_orphan;
779+
}
780+
775781
ret = ocfs2_get_clusters(inode, v_cpos, &p_cpos,
776782
&num_clusters, &ext_flags);
777783
if (ret < 0) {
778784
mlog_errno(ret);
785+
ocfs2_inode_unlock(inode, 0);
779786
goto clean_orphan;
780787
}
781788

782789
BUG_ON(!p_cpos || (ext_flags & OCFS2_EXT_UNWRITTEN));
783790

784791
ret = blkdev_issue_zeroout(osb->sb->s_bdev,
785792
p_cpos << (osb->s_clustersize_bits - 9),
786-
zero_len >> 9, GFP_KERNEL, false);
793+
zero_len >> 9, GFP_NOFS, false);
787794
if (ret < 0)
788795
mlog_errno(ret);
796+
797+
ocfs2_inode_unlock(inode, 0);
789798
}
790799

791800
clean_orphan:

0 commit comments

Comments
 (0)