please, try the patch attached. thanks, Alex Eric Sandeen wrote:
One thing that seems to be happening is that thanks to delalloc, a nice big request is coming in (only 1036 blocks of the 4096, not quite sure why), but then it gets into ext4_mb_normalize_request(), which finds the most blocks it can "preallocate" is 256, and chops down the request to 256 blocks. Shouldn't this preallocation be over & above what was asked for, vs. reducing the request? Ok, so, we get allocations in 256-block chunks... Why they don't all come out contiguous, I don't know yet... -Eric
Index: linux-2.6.24-rc1/fs/ext4/mballoc.c =================================================================== --- linux-2.6.24-rc1.orig/fs/ext4/mballoc.c 2007-10-27 10:29:17.000000000 +0400 +++ linux-2.6.24-rc1/fs/ext4/mballoc.c 2007-10-27 22:14:54.000000000 +0400 @@ -3088,8 +3088,10 @@ static void ext4_mb_normalize_request(st break; } } + size = wind; + if (wind == 0) { - __u64 tstart; + __u64 tstart, tend; /* file is quite large, we now preallocate with * the biggest configured window with regart to * logical offset */ @@ -3097,8 +3099,11 @@ static void ext4_mb_normalize_request(st tstart = ac->ac_o_ex.fe_logical; do_div(tstart, wind); start = tstart * wind; + tend = ac->ac_o_ex.fe_logical + ac->ac_o_ex.fe_len - 1; + do_div(tend, wind); + tend = tend * wind + wind; + size = tend - start; } - size = wind; orig_size = size; orig_start = start;