Commit 0effef77 authored by Mark Fasheh's avatar Mark Fasheh

ocfs2: fix page zeroing during simple extends

The page zeroing code was missing the region between old i_size and new
i_size for those extends that didn't actually require a change in space
allocation.
Signed-off-by: default avatarMark Fasheh <mark.fasheh@oracle.com>
parent 711a40fc
...@@ -728,10 +728,9 @@ static int ocfs2_extend_file(struct inode *inode, ...@@ -728,10 +728,9 @@ static int ocfs2_extend_file(struct inode *inode,
clusters_to_add = ocfs2_clusters_for_bytes(inode->i_sb, new_i_size) - clusters_to_add = ocfs2_clusters_for_bytes(inode->i_sb, new_i_size) -
OCFS2_I(inode)->ip_clusters; OCFS2_I(inode)->ip_clusters;
if (clusters_to_add) {
/* /*
* protect the pages that ocfs2_zero_extend is going to * protect the pages that ocfs2_zero_extend is going to be
* be pulling into the page cache.. we do this before the * pulling into the page cache.. we do this before the
* metadata extend so that we don't get into the situation * metadata extend so that we don't get into the situation
* where we've extended the metadata but can't get the data * where we've extended the metadata but can't get the data
* lock to zero. * lock to zero.
...@@ -742,18 +741,24 @@ static int ocfs2_extend_file(struct inode *inode, ...@@ -742,18 +741,24 @@ static int ocfs2_extend_file(struct inode *inode,
goto out; goto out;
} }
if (clusters_to_add) {
ret = ocfs2_extend_allocation(inode, clusters_to_add); ret = ocfs2_extend_allocation(inode, clusters_to_add);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
goto out_unlock; goto out_unlock;
} }
}
/*
* Call this even if we don't add any clusters to the tree. We
* still need to zero the area between the old i_size and the
* new i_size.
*/
ret = ocfs2_zero_extend(inode, (u64)new_i_size - tail_to_skip); ret = ocfs2_zero_extend(inode, (u64)new_i_size - tail_to_skip);
if (ret < 0) { if (ret < 0) {
mlog_errno(ret); mlog_errno(ret);
goto out_unlock; goto out_unlock;
} }
}
if (!tail_to_skip) { if (!tail_to_skip) {
/* We're being called from ocfs2_setattr() which wants /* We're being called from ocfs2_setattr() which wants
...@@ -764,7 +769,6 @@ static int ocfs2_extend_file(struct inode *inode, ...@@ -764,7 +769,6 @@ static int ocfs2_extend_file(struct inode *inode,
} }
out_unlock: out_unlock:
if (clusters_to_add) /* this is the only case in which we lock */
ocfs2_data_unlock(inode, 1); ocfs2_data_unlock(inode, 1);
out: out:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment