Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 79ffab34 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Theodore Ts'o
Browse files

ext4: Properly initialize the buffer_head state



These struct buffer_heads are allocated on the stack (and hence are
initialized with stack garbage).  They are only used to call a
get_blocks() function, so that's mostly OK, but b_state must be
initialized to be 0 so we don't have any unexpected BH_* flags set by
accident, such as BH_Unwritten or BH_Delay.

Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatar"Theodore Ts'o" <tytso@mit.edu>
parent 9fa7eb28
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -3150,6 +3150,7 @@ long ext4_fallocate(struct inode *inode, int mode, loff_t offset, loff_t len)
			ret = PTR_ERR(handle);
			break;
		}
		map_bh.b_state = 0;
		ret = ext4_get_blocks_wrap(handle, inode, block,
					  max_blocks, &map_bh,
					  EXT4_CREATE_UNINITIALIZED_EXT, 0, 0);
+14 −1
Original line number Diff line number Diff line
@@ -2055,7 +2055,20 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd)
	if ((mpd->b_state  & (1 << BH_Mapped)) &&
	    !(mpd->b_state & (1 << BH_Delay)))
		return 0;
	new.b_state = mpd->b_state;
	/*
	 * We need to make sure the BH_Delay flag is passed down to
	 * ext4_da_get_block_write(), since it calls
	 * ext4_get_blocks_wrap() with the EXT4_DELALLOC_RSVED flag.
	 * This flag causes ext4_get_blocks_wrap() to call
	 * ext4_da_update_reserve_space() if the passed buffer head
	 * has the BH_Delay flag set.  In the future, once we clean up
	 * the interfaces to ext4_get_blocks_wrap(), we should pass in
	 * a separate flag which requests that the delayed allocation
	 * statistics should be updated, instead of depending on the
	 * state information getting passed down via the map_bh's
	 * state bitmasks plus the magic EXT4_DELALLOC_RSVED flag.
	 */
	new.b_state = mpd->b_state & (1 << BH_Delay);
	new.b_blocknr = 0;
	new.b_size = mpd->b_size;
	next = mpd->b_blocknr;
+4 −2
Original line number Diff line number Diff line
@@ -379,7 +379,8 @@ mpage_readpages(struct address_space *mapping, struct list_head *pages,
	struct buffer_head map_bh;
	unsigned long first_logical_block = 0;

	clear_buffer_mapped(&map_bh);
	map_bh.b_state = 0;
	map_bh.b_size = 0;
	for (page_idx = 0; page_idx < nr_pages; page_idx++) {
		struct page *page = list_entry(pages->prev, struct page, lru);

@@ -412,7 +413,8 @@ int mpage_readpage(struct page *page, get_block_t get_block)
	struct buffer_head map_bh;
	unsigned long first_logical_block = 0;

	clear_buffer_mapped(&map_bh);
	map_bh.b_state = 0;
	map_bh.b_size = 0;
	bio = do_mpage_readpage(bio, page, 1, &last_block_in_bio,
			&map_bh, &first_logical_block, get_block);
	if (bio)