提交 f63afdb2 编写于 作者: T Tao Ma

ocfs2: make __ocfs2_page_mkwrite handle file end properly.

__ocfs2_page_mkwrite now is broken in handling file end.
1. the last page should be the page contains i_size - 1.
2. the len in the last page is also calculated wrong.
So change them accordingly.
Acked-by: NMark Fasheh <mfasheh@suse.com>
Signed-off-by: NTao Ma <tao.ma@oracle.com>
上级 f5ce5a08
...@@ -74,9 +74,11 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh, ...@@ -74,9 +74,11 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
/* /*
* Another node might have truncated while we were waiting on * Another node might have truncated while we were waiting on
* cluster locks. * cluster locks.
* We don't check size == 0 before the shift. This is borrowed
* from do_generic_file_read.
*/ */
last_index = size >> PAGE_CACHE_SHIFT; last_index = (size - 1) >> PAGE_CACHE_SHIFT;
if (page->index > last_index) { if (unlikely(!size || page->index > last_index)) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
...@@ -107,7 +109,7 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh, ...@@ -107,7 +109,7 @@ static int __ocfs2_page_mkwrite(struct inode *inode, struct buffer_head *di_bh,
* because the "write" would invalidate their data. * because the "write" would invalidate their data.
*/ */
if (page->index == last_index) if (page->index == last_index)
len = size & ~PAGE_CACHE_MASK; len = ((size - 1) & ~PAGE_CACHE_MASK) + 1;
ret = ocfs2_write_begin_nolock(mapping, pos, len, 0, &locked_page, ret = ocfs2_write_begin_nolock(mapping, pos, len, 0, &locked_page,
&fsdata, di_bh, page); &fsdata, di_bh, page);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册