|
@@ -1055,27 +1055,11 @@ static int ext4_write_end(struct file *file,
|
|
|
} else
|
|
|
copied = block_write_end(file, mapping, pos,
|
|
|
len, copied, page, fsdata);
|
|
|
-
|
|
|
/*
|
|
|
- * No need to use i_size_read() here, the i_size
|
|
|
- * cannot change under us because we hole i_mutex.
|
|
|
- *
|
|
|
- * But it's important to update i_size while still holding page lock:
|
|
|
+ * it's important to update i_size while still holding page lock:
|
|
|
* page writeout could otherwise come in and zero beyond i_size.
|
|
|
*/
|
|
|
- if (pos + copied > inode->i_size) {
|
|
|
- i_size_write(inode, pos + copied);
|
|
|
- i_size_changed = 1;
|
|
|
- }
|
|
|
-
|
|
|
- if (pos + copied > EXT4_I(inode)->i_disksize) {
|
|
|
- /* We need to mark inode dirty even if
|
|
|
- * new_i_size is less that inode->i_size
|
|
|
- * but greater than i_disksize. (hint delalloc)
|
|
|
- */
|
|
|
- ext4_update_i_disksize(inode, (pos + copied));
|
|
|
- i_size_changed = 1;
|
|
|
- }
|
|
|
+ i_size_changed = ext4_update_inode_size(inode, pos + copied);
|
|
|
unlock_page(page);
|
|
|
page_cache_release(page);
|
|
|
|
|
@@ -1123,7 +1107,7 @@ static int ext4_journalled_write_end(struct file *file,
|
|
|
int ret = 0, ret2;
|
|
|
int partial = 0;
|
|
|
unsigned from, to;
|
|
|
- loff_t new_i_size;
|
|
|
+ int size_changed = 0;
|
|
|
|
|
|
trace_ext4_journalled_write_end(inode, pos, len, copied);
|
|
|
from = pos & (PAGE_CACHE_SIZE - 1);
|
|
@@ -1146,20 +1130,18 @@ static int ext4_journalled_write_end(struct file *file,
|
|
|
if (!partial)
|
|
|
SetPageUptodate(page);
|
|
|
}
|
|
|
- new_i_size = pos + copied;
|
|
|
- if (new_i_size > inode->i_size)
|
|
|
- i_size_write(inode, pos+copied);
|
|
|
+ size_changed = ext4_update_inode_size(inode, pos + copied);
|
|
|
ext4_set_inode_state(inode, EXT4_STATE_JDATA);
|
|
|
EXT4_I(inode)->i_datasync_tid = handle->h_transaction->t_tid;
|
|
|
- if (new_i_size > EXT4_I(inode)->i_disksize) {
|
|
|
- ext4_update_i_disksize(inode, new_i_size);
|
|
|
+ unlock_page(page);
|
|
|
+ page_cache_release(page);
|
|
|
+
|
|
|
+ if (size_changed) {
|
|
|
ret2 = ext4_mark_inode_dirty(handle, inode);
|
|
|
if (!ret)
|
|
|
ret = ret2;
|
|
|
}
|
|
|
|
|
|
- unlock_page(page);
|
|
|
- page_cache_release(page);
|
|
|
if (pos + len > inode->i_size && ext4_can_truncate(inode))
|
|
|
/* if we have allocated more blocks and copied
|
|
|
* less. We will have blocks allocated outside
|