在 2008-08-19二的 12:18 +0530,Aneesh Kumar K.V写道: > We need to make sure adding new buffer_head to the > contiguous block extent doesn't result in nrblocks > greater than EXT4_MAX_TRANS_DATA. We only have > enought credit to insert EXT4_MAX_TRANS_DATA blocks. > > Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@xxxxxxxxxxxxxxxxxx> Reviewed-by: Mingming Cao <cmm@xxxxxxxxxx> > --- > fs/ext4/inode.c | 38 +++++++++++++++++++++++++------------- > 1 files changed, 25 insertions(+), 13 deletions(-) > > diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c > index dcd1337..a10f8e5 100644 > --- a/fs/ext4/inode.c > +++ b/fs/ext4/inode.c > @@ -1909,27 +1909,39 @@ static int mpage_da_map_blocks(struct mpage_da_data *mpd) > static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, > sector_t logical, struct buffer_head *bh) > { > - struct buffer_head *lbh = &mpd->lbh; > sector_t next; > + size_t b_size = bh->b_size; > + struct buffer_head *lbh = &mpd->lbh; > int nrblocks = lbh->b_size >> mpd->inode->i_blkbits; > > /* check if thereserved journal credits might overflow */ > - if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL) && > - (nrblocks >= EXT4_MAX_TRANS_DATA)) > - /* > - * With noextent format we are limited by the journal > - * credit available. Total credit needed to insert > - * nrblocks contiguous blocks is dependent on the > - * nrblocks. So limit nrblocks. > - */ > - goto flush_it; > - > + if (!(EXT4_I(mpd->inode)->i_flags & EXT4_EXTENTS_FL)) { > + if (nrblocks >= EXT4_MAX_TRANS_DATA) { > + /* > + * With noextent format we are limited by the journal > + * credit available. Total credit needed to insert > + * nrblocks contiguous blocks is dependent on the > + * nrblocks. So limit nrblocks. > + */ > + goto flush_it; > + } else if ((nrblocks + (b_size >> mpd->inode->i_blkbits)) > > + EXT4_MAX_TRANS_DATA) { > + /* > + * Adding the new buffer_head would make it cross the > + * allowed limit for which we have journal credit > + * reserved. So limit the new bh->b_size > + */ > + b_size = (EXT4_MAX_TRANS_DATA - nrblocks) << > + mpd->inode->i_blkbits; > + /* we will do mpage_da_submit_io in the next loop */ > + } > + } > /* > * First block in the extent > */ > if (lbh->b_size == 0) { > lbh->b_blocknr = logical; > - lbh->b_size = bh->b_size; > + lbh->b_size = b_size; > lbh->b_state = bh->b_state & BH_FLAGS; > return; > } > @@ -1939,7 +1951,7 @@ static void mpage_add_bh_to_extent(struct mpage_da_data *mpd, > * Can we merge the block to our big extent? > */ > if (logical == next && (bh->b_state & BH_FLAGS) == lbh->b_state) { > - lbh->b_size += bh->b_size; > + lbh->b_size += b_size; > return; > } > -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html