mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
ext4: Ensure zeroout blocks have no dirty metadata
commit 515f41c33a upstream (as of v2.6.33-rc3)
This fixes a bug (found by Curt Wohlgemuth) in which new blocks
returned from an extent created with ext4_ext_zeroout() can have dirty
metadata still associated with them.
Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: Curt Wohlgemuth <curtw@google.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
fe018ae141
commit
13a4fbba7a
@@ -3029,6 +3029,14 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void unmap_underlying_metadata_blocks(struct block_device *bdev,
|
||||
sector_t block, int count)
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < count; i++)
|
||||
unmap_underlying_metadata(bdev, block + i);
|
||||
}
|
||||
|
||||
static int
|
||||
ext4_ext_handle_uninitialized_extents(handle_t *handle, struct inode *inode,
|
||||
ext4_lblk_t iblock, unsigned int max_blocks,
|
||||
@@ -3104,6 +3112,18 @@ out:
|
||||
} else
|
||||
allocated = ret;
|
||||
set_buffer_new(bh_result);
|
||||
/*
|
||||
* if we allocated more blocks than requested
|
||||
* we need to make sure we unmap the extra block
|
||||
* allocated. The actual needed block will get
|
||||
* unmapped later when we find the buffer_head marked
|
||||
* new.
|
||||
*/
|
||||
if (allocated > max_blocks) {
|
||||
unmap_underlying_metadata_blocks(inode->i_sb->s_bdev,
|
||||
newblock + max_blocks,
|
||||
allocated - max_blocks);
|
||||
}
|
||||
map_out:
|
||||
set_buffer_mapped(bh_result);
|
||||
out1:
|
||||
|
||||
Reference in New Issue
Block a user