Message ID | cf82bd542cb3412da63d797073204e7c@rwthex-w2-b.rwth-ad.de |
---|---|
State | Accepted |
Delegated to: | Tom Rini |
Headers | show |
On Tue, Sep 06, 2016 at 04:36:49AM +0200, Stefan Brüns wrote: > The last free block of a block group may be in its middle. After it has > been allocated, the next block group should be scanned from its beginning. > > The following command triggers the bad behaviour (on a blocksize 1024 fs): > > ./sandbox/u-boot -c 'i=0; host bind 0 ./disk.raw ; > while test $i -lt 260 ; do echo $i; setexpr i $i + 1; > ext4write host 0:2 0 /X${i} 0x1450; done ; > ext4write host 0:2 0 /X240 0x2000 ; ' > > When 'X240' is extended from 5200 byte to 8192 byte, the new blocks should > start from the first free block (8811), but it uses the blocks 8098-8103 > and 16296-16297 -- 8103 + 1 + 8192 = 16296. This can be shown with > debugfs, commands 'ffb' and 'stat X240'. > > Signed-off-by: Stefan Brüns <stefan.bruens@rwth-aachen.de> > Reviewed-by: Lukasz Majewski <l.majewski@samsung.com> Applied to u-boot/master, thanks!
diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 539d622..8fc7559 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -903,8 +903,8 @@ uint32_t ext4fs_get_new_blk_no(void) goto fail; } else { -restart: fs->curr_blkno++; +restart: /* get the blockbitmap index respective to blockno */ bg_idx = fs->curr_blkno / blk_per_grp; if (fs->blksz == 1024) { @@ -922,8 +922,9 @@ restart: if (bgd[bg_idx].free_blocks == 0) { debug("block group %u is full. Skipping\n", bg_idx); - fs->curr_blkno = fs->curr_blkno + blk_per_grp; - fs->curr_blkno--; + fs->curr_blkno = (bg_idx + 1) * blk_per_grp; + if (fs->blksz == 1024) + fs->curr_blkno += 1; goto restart; } @@ -940,6 +941,7 @@ restart: bg_idx) != 0) { debug("going for restart for the block no %ld %u\n", fs->curr_blkno, bg_idx); + fs->curr_blkno++; goto restart; }