Skip to content

Commit

Permalink
ext4: update mtime in ext4_punch_hole even if no blocks are released
Browse files Browse the repository at this point in the history
Currently in ext4_punch_hole we're going to skip the mtime update if
there are no actual blocks to release. However we've actually modified
the file by zeroing the partial block so the mtime should be updated.

Moreover the sync and datasync handling is skipped as well, which is
also wrong. Fix it.

Signed-off-by: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Reported-by: Joe Habermann <joe.habermann@quantum.com>
Cc: <stable@vger.kernel.org>
  • Loading branch information
Lukas Czerner authored and tytso committed May 13, 2018
1 parent 6390d33 commit eee597a
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions fs/ext4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -4298,28 +4298,28 @@ int ext4_punch_hole(struct inode *inode, loff_t offset, loff_t length)
EXT4_BLOCK_SIZE_BITS(sb);
stop_block = (offset + length) >> EXT4_BLOCK_SIZE_BITS(sb);

/* If there are no blocks to remove, return now */
if (first_block >= stop_block)
goto out_stop;
/* If there are blocks to remove, do it */
if (stop_block > first_block) {

down_write(&EXT4_I(inode)->i_data_sem);
ext4_discard_preallocations(inode);
down_write(&EXT4_I(inode)->i_data_sem);
ext4_discard_preallocations(inode);

ret = ext4_es_remove_extent(inode, first_block,
stop_block - first_block);
if (ret) {
up_write(&EXT4_I(inode)->i_data_sem);
goto out_stop;
}
ret = ext4_es_remove_extent(inode, first_block,
stop_block - first_block);
if (ret) {
up_write(&EXT4_I(inode)->i_data_sem);
goto out_stop;
}

if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
ret = ext4_ext_remove_space(inode, first_block,
stop_block - 1);
else
ret = ext4_ind_remove_space(handle, inode, first_block,
stop_block);
if (ext4_test_inode_flag(inode, EXT4_INODE_EXTENTS))
ret = ext4_ext_remove_space(inode, first_block,
stop_block - 1);
else
ret = ext4_ind_remove_space(handle, inode, first_block,
stop_block);

up_write(&EXT4_I(inode)->i_data_sem);
up_write(&EXT4_I(inode)->i_data_sem);
}
if (IS_SYNC(inode))
ext4_handle_sync(handle);

Expand Down

0 comments on commit eee597a

Please sign in to comment.