1 ext4: fix inline data error paths
3 The write_end() function must always unlock the page and drop its ref
4 count, even on an error.
6 Signed-off-by: Theodore Ts'o <tytso@mit.edu>
7 Cc: stable@vger.kernel.org
9 fs/ext4/inline.c | 9 ++++++++-
10 fs/ext4/inode.c | 20 +++++++++++++++-----
11 2 files changed, 23 insertions(+), 6 deletions(-)
13 diff --git a/fs/ext4/inline.c b/fs/ext4/inline.c
14 index 338cfd862adb..b777b8aa14ae 100644
15 --- a/fs/ext4/inline.c
16 +++ b/fs/ext4/inline.c
17 @@ -943,8 +943,15 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
20 int i_size_changed = 0;
23 - copied = ext4_write_inline_data_end(inode, pos, len, copied, page);
24 + ret = ext4_write_inline_data_end(inode, pos, len, copied, page);
33 * No need to use i_size_read() here, the i_size
34 diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
35 index 918d351d5b94..af97b9170358 100644
38 @@ -1330,8 +1330,11 @@ static int ext4_write_end(struct file *file,
39 if (ext4_has_inline_data(inode)) {
40 ret = ext4_write_inline_data_end(inode, pos, len,
50 copied = block_write_end(file, mapping, pos,
51 @@ -1433,10 +1436,16 @@ static int ext4_journalled_write_end(struct file *file,
53 BUG_ON(!ext4_handle_valid(handle));
55 - if (ext4_has_inline_data(inode))
56 - copied = ext4_write_inline_data_end(inode, pos, len,
58 - else if (unlikely(copied < len) && !PageUptodate(page)) {
59 + if (ext4_has_inline_data(inode)) {
60 + ret = ext4_write_inline_data_end(inode, pos, len,
68 + } else if (unlikely(copied < len) && !PageUptodate(page)) {
70 ext4_journalled_zero_new_buffers(handle, page, from, to);
72 @@ -1471,6 +1480,7 @@ static int ext4_journalled_write_end(struct file *file,
74 ext4_orphan_add(handle, inode);
77 ret2 = ext4_journal_stop(handle);