diff options
Diffstat (limited to 'fs/ext4/inode.c')
-rw-r--r-- | fs/ext4/inode.c | 16 |
1 files changed, 7 insertions, 9 deletions
diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c index 7d6c10017bdf..4efe77286ecd 100644 --- a/fs/ext4/inode.c +++ b/fs/ext4/inode.c | |||
@@ -1389,9 +1389,10 @@ static int ext4_write_end(struct file *file, | |||
1389 | loff_t old_size = inode->i_size; | 1389 | loff_t old_size = inode->i_size; |
1390 | int ret = 0, ret2; | 1390 | int ret = 0, ret2; |
1391 | int i_size_changed = 0; | 1391 | int i_size_changed = 0; |
1392 | int inline_data = ext4_has_inline_data(inode); | ||
1392 | 1393 | ||
1393 | trace_ext4_write_end(inode, pos, len, copied); | 1394 | trace_ext4_write_end(inode, pos, len, copied); |
1394 | if (ext4_has_inline_data(inode)) { | 1395 | if (inline_data) { |
1395 | ret = ext4_write_inline_data_end(inode, pos, len, | 1396 | ret = ext4_write_inline_data_end(inode, pos, len, |
1396 | copied, page); | 1397 | copied, page); |
1397 | if (ret < 0) { | 1398 | if (ret < 0) { |
@@ -1419,7 +1420,7 @@ static int ext4_write_end(struct file *file, | |||
1419 | * ordering of page lock and transaction start for journaling | 1420 | * ordering of page lock and transaction start for journaling |
1420 | * filesystems. | 1421 | * filesystems. |
1421 | */ | 1422 | */ |
1422 | if (i_size_changed) | 1423 | if (i_size_changed || inline_data) |
1423 | ext4_mark_inode_dirty(handle, inode); | 1424 | ext4_mark_inode_dirty(handle, inode); |
1424 | 1425 | ||
1425 | if (pos + len > inode->i_size && ext4_can_truncate(inode)) | 1426 | if (pos + len > inode->i_size && ext4_can_truncate(inode)) |
@@ -1493,6 +1494,7 @@ static int ext4_journalled_write_end(struct file *file, | |||
1493 | int partial = 0; | 1494 | int partial = 0; |
1494 | unsigned from, to; | 1495 | unsigned from, to; |
1495 | int size_changed = 0; | 1496 | int size_changed = 0; |
1497 | int inline_data = ext4_has_inline_data(inode); | ||
1496 | 1498 | ||
1497 | trace_ext4_journalled_write_end(inode, pos, len, copied); | 1499 | trace_ext4_journalled_write_end(inode, pos, len, copied); |
1498 | from = pos & (PAGE_SIZE - 1); | 1500 | from = pos & (PAGE_SIZE - 1); |
@@ -1500,7 +1502,7 @@ static int ext4_journalled_write_end(struct file *file, | |||
1500 | 1502 | ||
1501 | BUG_ON(!ext4_handle_valid(handle)); | 1503 | BUG_ON(!ext4_handle_valid(handle)); |
1502 | 1504 | ||
1503 | if (ext4_has_inline_data(inode)) { | 1505 | if (inline_data) { |
1504 | ret = ext4_write_inline_data_end(inode, pos, len, | 1506 | ret = ext4_write_inline_data_end(inode, pos, len, |
1505 | copied, page); | 1507 | copied, page); |
1506 | if (ret < 0) { | 1508 | if (ret < 0) { |
@@ -1531,7 +1533,7 @@ static int ext4_journalled_write_end(struct file *file, | |||
1531 | if (old_size < pos) | 1533 | if (old_size < pos) |
1532 | pagecache_isize_extended(inode, old_size, pos); | 1534 | pagecache_isize_extended(inode, old_size, pos); |
1533 | 1535 | ||
1534 | if (size_changed) { | 1536 | if (size_changed || inline_data) { |
1535 | ret2 = ext4_mark_inode_dirty(handle, inode); | 1537 | ret2 = ext4_mark_inode_dirty(handle, inode); |
1536 | if (!ret) | 1538 | if (!ret) |
1537 | ret = ret2; | 1539 | ret = ret2; |
@@ -2028,11 +2030,7 @@ static int __ext4_journalled_writepage(struct page *page, | |||
2028 | } | 2030 | } |
2029 | 2031 | ||
2030 | if (inline_data) { | 2032 | if (inline_data) { |
2031 | BUFFER_TRACE(inode_bh, "get write access"); | 2033 | ret = ext4_mark_inode_dirty(handle, inode); |
2032 | ret = ext4_journal_get_write_access(handle, inode_bh); | ||
2033 | |||
2034 | err = ext4_handle_dirty_metadata(handle, inode, inode_bh); | ||
2035 | |||
2036 | } else { | 2034 | } else { |
2037 | ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, | 2035 | ret = ext4_walk_page_buffers(handle, page_bufs, 0, len, NULL, |
2038 | do_journal_get_write_access); | 2036 | do_journal_get_write_access); |