mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 12:11:40 +00:00
[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: Nick Piggin <npiggin@suse.de> Signed-off-by: David Woodhouse <dwmw2@infradead.org>
This commit is contained in:
parent
c21f900cb8
commit
2a754b51aa
@ -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
|
||||
nodes in files which have many short writes, like
|
||||
syslog files. */
|
||||
start = aligned_start = 0;
|
||||
aligned_start = 0;
|
||||
}
|
||||
|
||||
ri = jffs2_alloc_raw_inode();
|
||||
@ -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 */
|
||||
if (writtenlen < (start&3))
|
||||
writtenlen = 0;
|
||||
else
|
||||
writtenlen -= (start&3);
|
||||
writtenlen -= min(writtenlen, (start - aligned_start));
|
||||
|
||||
if (writtenlen) {
|
||||
if (inode->i_size < (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen) {
|
||||
inode->i_size = (pg->index << PAGE_CACHE_SHIFT) + start + writtenlen;
|
||||
if (inode->i_size < pos + writtenlen) {
|
||||
inode->i_size = pos + writtenlen;
|
||||
inode->i_blocks = (inode->i_size + 511) >> 9;
|
||||
|
||||
inode->i_ctime = inode->i_mtime = ITIME(je32_to_cpu(ri->ctime));
|
||||
|
Loading…
Reference in New Issue
Block a user