提交 2a754b51 编写于 作者: N Nick Piggin 提交者: David Woodhouse

[JFFS2] Fix return value from jffs2_write_end()

jffs2_write_end() is sometimes passing back a "written" length greater 
than the length we passed into it, leading to a BUG at mm/filemap.c:1749 
when used with unionfs.

It happens because we actually write more than was requested, to reduce 
log fragmentation. These "longer" writes are fine, but they shouldn't 
get propagated back to the vm/vfs.
Signed-off-by: NNick Piggin <npiggin@suse.de>
Signed-off-by: NDavid Woodhouse <dwmw2@infradead.org>
上级 c21f900c
...@@ -255,7 +255,7 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping, ...@@ -255,7 +255,7 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping,
_whole_ page. This helps to reduce the number of _whole_ page. This helps to reduce the number of
nodes in files which have many short writes, like nodes in files which have many short writes, like
syslog files. */ syslog files. */
start = aligned_start = 0; aligned_start = 0;
} }
ri = jffs2_alloc_raw_inode(); ri = jffs2_alloc_raw_inode();
...@@ -291,14 +291,11 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping, ...@@ -291,14 +291,11 @@ static int jffs2_write_end(struct file *filp, struct address_space *mapping,
} }
/* Adjust writtenlen for the padding we did, so we don't confuse our caller */ /* Adjust writtenlen for the padding we did, so we don't confuse our caller */
if (writtenlen < (start&3)) writtenlen -= min(writtenlen, (start - aligned_start));
writtenlen = 0;
else
writtenlen -= (start&3);
if (writtenlen) { if (writtenlen) {
if (inode->i_size < (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen) { if (inode->i_size < pos + writtenlen) {
inode->i_size = (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen; inode->i_size = pos + writtenlen;
inode->i_blocks = (inode->i_size + 511) >> 9; inode->i_blocks = (inode->i_size + 511) >> 9;
inode->i_ctime = inode->i_mtime = ITIME(je32_to_cpu(ri->ctime)); inode->i_ctime = inode->i_mtime = ITIME(je32_to_cpu(ri->ctime));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册