| From 9b1c7b0e17c8744db1c75378d42b7f1c285bf36b Mon Sep 17 00:00:00 2001 |
| From: Eric Biggers <ebiggers@google.com> |
| Date: Wed, 15 Mar 2017 14:52:02 -0400 |
| Subject: [PATCH] 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. |
| |
| Cc: stable@vger.kernel.org # 3.10+ |
| Fixes: 3c47d54170b6a678875566b1b8d6dcf57904e49b |
| Signed-off-by: Eric Biggers <ebiggers@google.com> |
| Signed-off-by: Theodore Ts'o <tytso@mit.edu> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c |
| index 37b521ed39df..73cbc01ef5ad 100644 |
| --- a/fs/ext4/inline.c |
| +++ b/fs/ext4/inline.c |
| @@ -1157,10 +1157,9 @@ static int ext4_finish_convert_inline_dir(handle_t *handle, |
| 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, |
| -- |
| 2.12.0 |
| |