Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 19321917 authored by Joern Engel's avatar Joern Engel
Browse files

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: default avatarJoern Engel <joern@logfs.org>
parent 6f2e9e6a
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -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;