ext4: fix inline data error paths

am: 6ec4583e9b

Change-Id: I288454fe8c77883f859f8bb7705727bd8c52c378
This commit is contained in:
Theodore Ts'o 2017-03-12 08:18:26 +00:00 committed by android-build-merger
commit 8f1c5b47f4
2 changed files with 23 additions and 6 deletions

View file

@ -947,8 +947,15 @@ int ext4_da_write_inline_data_end(struct inode *inode, loff_t pos,
struct page *page) struct page *page)
{ {
int i_size_changed = 0; int i_size_changed = 0;
int ret;
copied = ext4_write_inline_data_end(inode, pos, len, copied, page); ret = ext4_write_inline_data_end(inode, pos, len, copied, page);
if (ret < 0) {
unlock_page(page);
put_page(page);
return ret;
}
copied = ret;
/* /*
* No need to use i_size_read() here, the i_size * No need to use i_size_read() here, the i_size

View file

@ -1177,8 +1177,11 @@ static int ext4_write_end(struct file *file,
if (ext4_has_inline_data(inode)) { if (ext4_has_inline_data(inode)) {
ret = ext4_write_inline_data_end(inode, pos, len, ret = ext4_write_inline_data_end(inode, pos, len,
copied, page); copied, page);
if (ret < 0) if (ret < 0) {
unlock_page(page);
put_page(page);
goto errout; goto errout;
}
copied = ret; copied = ret;
} else } else
copied = block_write_end(file, mapping, pos, copied = block_write_end(file, mapping, pos,
@ -1281,10 +1284,16 @@ static int ext4_journalled_write_end(struct file *file,
BUG_ON(!ext4_handle_valid(handle)); BUG_ON(!ext4_handle_valid(handle));
if (ext4_has_inline_data(inode)) if (ext4_has_inline_data(inode)) {
copied = ext4_write_inline_data_end(inode, pos, len, ret = ext4_write_inline_data_end(inode, pos, len,
copied, page); copied, page);
else if (unlikely(copied < len) && !PageUptodate(page)) { if (ret < 0) {
unlock_page(page);
put_page(page);
goto errout;
}
copied = ret;
} else if (unlikely(copied < len) && !PageUptodate(page)) {
copied = 0; copied = 0;
ext4_journalled_zero_new_buffers(handle, page, from, to); ext4_journalled_zero_new_buffers(handle, page, from, to);
} else { } else {
@ -1319,6 +1328,7 @@ static int ext4_journalled_write_end(struct file *file,
*/ */
ext4_orphan_add(handle, inode); ext4_orphan_add(handle, inode);
errout:
ret2 = ext4_journal_stop(handle); ret2 = ext4_journal_stop(handle);
if (!ret) if (!ret)
ret = ret2; ret = ret2;