Skip to content

Commit

Permalink
ext4: only zero partial blocks in ext4_zero_partial_blocks()
Browse files Browse the repository at this point in the history
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: Lukas Czerner <lczerner@redhat.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
  • Loading branch information
Lukas Czerner authored and Theodore Ts'o committed Jul 1, 2013
1 parent 42c832d commit e1be3a9
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions fs/ext4/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -3424,33 +3424,36 @@ int ext4_zero_partial_blocks(handle_t *handle, struct inode *inode,
{
struct super_block *sb = inode->i_sb;
struct address_space *mapping = inode->i_mapping;
unsigned partial = lstart & (sb->s_blocksize - 1);
unsigned partial_start, partial_end;
ext4_fsblk_t start, end;
loff_t byte_end = (lstart + length - 1);
int err = 0;

partial_start = lstart & (sb->s_blocksize - 1);
partial_end = byte_end & (sb->s_blocksize - 1);

start = lstart >> sb->s_blocksize_bits;
end = byte_end >> sb->s_blocksize_bits;

/* 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,
lstart, length);
return err;
}
/* Handle partial zero out on the start of the range */
if (partial) {
if (partial_start) {
err = ext4_block_zero_page_range(handle, mapping,
lstart, sb->s_blocksize);
if (err)
return err;
}
/* Handle partial zero out on the end of the range */
partial = byte_end & (sb->s_blocksize - 1);
if (partial != sb->s_blocksize - 1)
if (partial_end != sb->s_blocksize - 1)
err = ext4_block_zero_page_range(handle, mapping,
byte_end - partial,
partial + 1);
byte_end - partial_end,
partial_end + 1);
return err;
}

Expand Down

0 comments on commit e1be3a9

Please sign in to comment.