Commit e1be3a92 authored by Lukas Czerner's avatar Lukas Czerner Committed by Theodore Ts'o

ext4: only zero partial blocks in ext4_zero_partial_blocks()

Currently if we pass range into ext4_zero_partial_blocks() which covers
entire block we would attempt to zero it even though we should only zero
unaligned part of the block.

Fix this by checking whether the range covers the whole block skip
zeroing if so.
Signed-off-by: default avatarLukas Czerner <lczerner@redhat.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 42c832de
...@@ -3424,33 +3424,36 @@ int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode, ...@@ -3424,33 +3424,36 @@ int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
{ {
struct super_block *sb = inode->i_sb; struct super_block *sb = inode->i_sb;
struct address_space *mapping = inode->i_mapping; struct address_space *mapping = inode->i_mapping;
unsigned partial = lstart & (sb->s_blocksize - 1); unsigned partial_start, partial_end;
ext4_fsblk_t start, end; ext4_fsblk_t start, end;
loff_t byte_end = (lstart + length - 1); loff_t byte_end = (lstart + length - 1);
int err = 0; int err = 0;
partial_start = lstart & (sb->s_blocksize - 1);
partial_end = byte_end & (sb->s_blocksize - 1);
start = lstart >> sb->s_blocksize_bits; start = lstart >> sb->s_blocksize_bits;
end = byte_end >> sb->s_blocksize_bits; end = byte_end >> sb->s_blocksize_bits;
/* Handle partial zero within the single block */ /* Handle partial zero within the single block */
if (start == end) { if (start == end &&
(partial_start || (partial_end != sb->s_blocksize - 1))) {
err = ext4_block_zero_page_range(handle, mapping, err = ext4_block_zero_page_range(handle, mapping,
lstart, length); lstart, length);
return err; return err;
} }
/* Handle partial zero out on the start of the range */ /* Handle partial zero out on the start of the range */
if (partial) { if (partial_start) {
err = ext4_block_zero_page_range(handle, mapping, err = ext4_block_zero_page_range(handle, mapping,
lstart, sb->s_blocksize); lstart, sb->s_blocksize);
if (err) if (err)
return err; return err;
} }
/* Handle partial zero out on the end of the range */ /* Handle partial zero out on the end of the range */
partial = byte_end & (sb->s_blocksize - 1); if (partial_end != sb->s_blocksize - 1)
if (partial != sb->s_blocksize - 1)
err = ext4_block_zero_page_range(handle, mapping, err = ext4_block_zero_page_range(handle, mapping,
byte_end - partial, byte_end - partial_end,
partial + 1); partial_end + 1);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment