| From: Eric Biggers <ebiggers@google.com> |
| Date: Wed, 15 Mar 2017 14:52:02 -0400 |
| Subject: ext4: mark inode dirty after converting inline directory |
| |
| commit b9cf625d6ecde0d372e23ae022feead72b4228a6 upstream. |
| |
| If ext4_convert_inline_data() was called on a directory with inline |
| data, the filesystem was left in an inconsistent state (as considered by |
| e2fsck) because the file size was not increased to cover the new block. |
| This happened because the inode was not marked dirty after i_disksize |
| was updated. Fix this by marking the inode dirty at the end of |
| ext4_finish_convert_inline_dir(). |
| |
| This bug was probably not noticed before because most users mark the |
| inode dirty afterwards for other reasons. But if userspace executed |
| FS_IOC_SET_ENCRYPTION_POLICY with invalid parameters, as exercised by |
| 'kvm-xfstests -c adv generic/396', then the inode was never marked dirty |
| after updating i_disksize. |
| |
| Fixes: 3c47d54170b6a678875566b1b8d6dcf57904e49b |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/ext4/inline.c | 5 ++--- |
| 1 file changed, 2 insertions(+), 3 deletions(-) |
| |
| --- a/fs/ext4/inline.c |
| +++ b/fs/ext4/inline.c |
| @@ -1158,10 +1158,9 @@ static int ext4_finish_convert_inline_di |
| set_buffer_uptodate(dir_block); |
| err = ext4_handle_dirty_dirent_node(handle, inode, dir_block); |
| if (err) |
| - goto out; |
| + return err; |
| set_buffer_verified(dir_block); |
| -out: |
| - return err; |
| + return ext4_mark_inode_dirty(handle, inode); |
| } |
| |
| static int ext4_convert_inline_data_nolock(handle_t *handle, |