|
@@ -1330,8 +1330,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,
|
|
@@ -1433,10 +1436,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))
|
|
|
|
- copied = ext4_write_inline_data_end(inode, pos, len,
|
|
|
|
- copied, page);
|
|
|
|
- else if (unlikely(copied < len) && !PageUptodate(page)) {
|
|
|
|
|
|
+ if (ext4_has_inline_data(inode)) {
|
|
|
|
+ ret = ext4_write_inline_data_end(inode, pos, len,
|
|
|
|
+ copied, 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 {
|
|
@@ -1471,6 +1480,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;
|