diff options
author | Joern Engel <joern@logfs.org> | 2010-03-27 09:56:58 +0100 |
---|---|---|
committer | Joern Engel <joern@logfs.org> | 2010-03-28 12:40:42 +0200 |
commit | 193219172691e29813821dc8433317768c6ed1a3 (patch) | |
tree | 9df87e5fa573deddd1d7b89da3005567308a2ab3 /fs/logfs/readwrite.c | |
parent | Use deactivate_locked_super (diff) | |
download | linux-193219172691e29813821dc8433317768c6ed1a3.tar.xz linux-193219172691e29813821dc8433317768c6ed1a3.zip |
Prevent data corruption in logfs_rewrite_block()
The comment was correct, so make the code match the comment. As the
new comment indicates, we might be able to do a little less work. But
for the current -rc series let's keep it simple and just fix the bug.
Signed-off-by: Joern Engel <joern@logfs.org>
Diffstat (limited to 'fs/logfs/readwrite.c')
-rw-r--r-- | fs/logfs/readwrite.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/logfs/readwrite.c b/fs/logfs/readwrite.c index 7a23b3e7c0a7..c3a3a6814b84 100644 --- a/fs/logfs/readwrite.c +++ b/fs/logfs/readwrite.c @@ -1594,7 +1594,6 @@ int logfs_delete(struct inode *inode, pgoff_t index, return ret; } -/* Rewrite cannot mark the inode dirty but has to write it immediatly. */ int logfs_rewrite_block(struct inode *inode, u64 bix, u64 ofs, gc_level_t gc_level, long flags) { @@ -1611,6 +1610,18 @@ int logfs_rewrite_block(struct inode *inode, u64 bix, u64 ofs, if (level != 0) alloc_indirect_block(inode, page, 0); err = logfs_write_buf(inode, page, flags); + if (!err && shrink_level(gc_level) == 0) { + /* Rewrite cannot mark the inode dirty but has to + * write it immediatly. + * Q: Can't we just create an alias for the inode + * instead? And if not, why not? + */ + if (inode->i_ino == LOGFS_INO_MASTER) + logfs_write_anchor(inode->i_sb); + else { + err = __logfs_write_inode(inode, flags); + } + } } logfs_put_write_page(page); return err; |