ext4: Mark the unwritten buffer_head as mapped during write_begin
authorAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Tue, 12 May 2009 20:30:27 +0000 (16:30 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Tue, 12 May 2009 20:30:27 +0000 (16:30 -0400)
commit29fa89d088941d79765d60f22d5ccdd6b8696e11
tree3fbe031eec140c03dafa11f2416c4f6e3826f21d
parent8fb0e342481c4d80040670fec915f0b9c7c6499a
ext4: Mark the unwritten buffer_head as mapped during write_begin

Setting BH_Unwritten buffer_heads as BH_Mapped avoids multiple
(unnecessary) calls to get_block() during the call to the write(2)
system call.  Setting BH_Unwritten buffer heads as BH_Mapped requires
that the writepages() functions can handle BH_Unwritten buffer_heads.

After this commit, things work as follows:

ext4_ext_get_block() returns unmapped, unwritten, buffer head when
called with create = 0 for prealloc space. This makes sure we handle
the read path and non-delayed allocation case correctly.  Even though
the buffer head is marked unmapped we have valid b_blocknr and b_bdev
values in the buffer_head.

ext4_da_get_block_prep() called for block resrevation will now return
mapped, unwritten, new buffer_head for prealloc space. This avoids
multiple calls to get_block() for write to same offset. By making such
buffers as BH_New, we also assure that sub-block zeroing of buffered
writes happens correctly.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
fs/ext4/extents.c
fs/ext4/inode.c