> On Jun 1, 2015, at 1:55 AM, Lukas Czerner <lczerner@xxxxxxxxxx> wrote: > > Currently on the machines with page size > block size when initializing > block group buddy cache we initialize it for all the block group bitmaps > in the page. However in the case of read error, checksum error, or if > a single bitmap is in any way corrupted we would fail to initialize all > of the bitmaps. This is problematic because we will not have access to > the other allocation groups even though those might be perfectly fine > and usable. > > Fix this by reading all the bitmaps instead of error out on the first > problem and simply skip the bitmaps which were either not read properly, > or are not valid. > > Signed-off-by: Lukas Czerner <lczerner@xxxxxxxxxx> > --- > fs/ext4/mballoc.c | 10 +++++++--- > 1 file changed, 7 insertions(+), 3 deletions(-) > > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index 8d1e602..5677a03 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -882,10 +882,8 @@ static int ext4_mb_init_cache(struct page *page, char *incore) > > /* wait for I/O completion */ > for (i = 0, group = first_group; i < groups_per_page; i++, group++) { > - if (bh[i] && ext4_wait_block_bitmap(sb, group, bh[i])) { > + if (bh[i] && ext4_wait_block_bitmap(sb, group, bh[i])) > err = -EIO; > - goto out; > - } > } > > first_block = page->index * blocks_per_page; > @@ -898,6 +896,12 @@ static int ext4_mb_init_cache(struct page *page, char *incore) > /* skip initialized uptodate buddy */ > continue; > > + if (!buffer_verified(bh[group - first_group])) > + /* Skip faulty bitmaps */ > + continue; > + else > + err = 0; Not really a need for "else" here after the "continue" line, but that is mostly harmless. Cheers, Andreas -- 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