exofs: simple_write_end does not mark_inode_dirty
exofs uses simple_write_end() for it's .write_end handler. But it is not enough because simple_write_end() does not call mark_inode_dirty() when it extends i_size. So even if we do call mark_inode_dirty at beginning of write out, with a very long IO and a saturated system we might get the .write_inode() called while still extend-writing to file and miss out on the last i_size updates. So override .write_end, call simple_write_end(), and afterwords if i_size was changed call mark_inode_dirty(). It stands to logic that since simple_write_end() was the one extending i_size it should also call mark_inode_dirty(). But it looks like all users of simple_write_end() are memory-bound pseudo filesystems, who could careless about mark_inode_dirty(). I might submit a warning-comment patch to simple_write_end() in future. CC: Stable <stable@kernel.org> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
This commit is contained in:
parent
89be503021
commit
efd124b999
|
@ -738,13 +738,28 @@ static int exofs_write_begin_export(struct file *file,
|
||||||
fsdata);
|
fsdata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int exofs_write_end(struct file *file, struct address_space *mapping,
|
||||||
|
loff_t pos, unsigned len, unsigned copied,
|
||||||
|
struct page *page, void *fsdata)
|
||||||
|
{
|
||||||
|
struct inode *inode = mapping->host;
|
||||||
|
/* According to comment in simple_write_end i_mutex is held */
|
||||||
|
loff_t i_size = inode->i_size;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = simple_write_end(file, mapping,pos, len, copied, page, fsdata);
|
||||||
|
if (i_size != inode->i_size)
|
||||||
|
mark_inode_dirty(inode);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
const struct address_space_operations exofs_aops = {
|
const struct address_space_operations exofs_aops = {
|
||||||
.readpage = exofs_readpage,
|
.readpage = exofs_readpage,
|
||||||
.readpages = exofs_readpages,
|
.readpages = exofs_readpages,
|
||||||
.writepage = exofs_writepage,
|
.writepage = exofs_writepage,
|
||||||
.writepages = exofs_writepages,
|
.writepages = exofs_writepages,
|
||||||
.write_begin = exofs_write_begin_export,
|
.write_begin = exofs_write_begin_export,
|
||||||
.write_end = simple_write_end,
|
.write_end = exofs_write_end,
|
||||||
};
|
};
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
|
Loading…
Reference in New Issue