Hello,

Applied, thanks!

Samuel

Milos Nikic, le dim. 25 oct. 2026 20:19:17 -0700, a ecrit:
> Hello,
> 
> First to state a problem:
> 
> Ext2fs preallocates up to 8 blocks when a file grows, and marks them
> allocated in the block bitmap while only the node's memory owns them.
> A crash before the file uses them or gives them back leaks them.  With
> the journal this matters even more: the bitmap change commits with the
> allocation, and a normal boot only replays the log, without the full
> check that would free the blocks.  Killing the translator during
> tar -xf of a Linux tree left such blocks repeatedly.
> 
> Fix:
> Patch 1 is the fix the journal needs.  It keeps the preallocation
> window in memory only, in a per-group map next to the busy blocks, and
> sets a block in the bitmap only when a file takes it.  The layout does
> not change: in the test below, files get exactly the same fragments as
> before (1949 each).  Ten kills of the translator at random times during
> rm -rf and tar -xf, and filling the disk with several writers, left
> e2fsck -f clean.  Simply not preallocating with a journal, as I first
> tried, also fixes the leak, but doubles the fragments (4097).
> 
> Improvement:
> Patch 2 is an improvement on top inspired by ext3, and does not depend
> on the journal.  Files written at the same time take blocks in turn,
> so each fragment was at most one 8-block window long.
> A file that keeps using up its window now gets one twice as big, up to
> 1024 blocks, and the window is dropped at the last close instead of whenever
> the inode is written.
> ext3 also doubled its reservation windows, up to 1027 blocks.
> 
> Fragments per file, 3 runs each on a fresh 4 KB-block filesystem in an
> i386 VM:
> 
>                                       before   patch 1   patch 2
>   8 files appended in turn (64 MB)      1949      1949        23
>   4 parallel dd (256 MB)               ~6400     ~6300    55-70
> 
> The same holds without a journal (23 for the appended files).  With
> two concurrent tar -xf of a Linux tree, half as many files are
> fragmented with patch 2 (0.4% against 0.8%), but about 200 more small
> holes of 4 to 64K stay in the free space, 1% of it, mostly what small
> files leave of their windows.  The time is the same (about 205 s).
> Capping a window at the file's size made both worse, so it is not in
> the series.  A large Debian upgrade with both patches on the root
> filesystem left e2fsck clean.
> 
> The patches are independent of other work that is still pending.
> 
> Thanks,
> Milos
> 
> Milos Nikic (2):
>   ext2fs: Keep block preallocation in memory
>   ext2fs: Grow preallocation windows for sequential writers
> 
>  ext2fs/balloc.c   | 274 ++++++++++++++++++++++++++++++++--------------
>  ext2fs/ext2_fs.h  |   3 +
>  ext2fs/ext2fs.h   |   6 +-
>  ext2fs/getblk.c   |  70 ++++++------
>  ext2fs/ialloc.c   |   1 +
>  ext2fs/inode.c    |  17 ++-
>  ext2fs/truncate.c |   4 +-
>  7 files changed, 256 insertions(+), 119 deletions(-)
> 
> -- 
> 2.56.0
> 

-- 
Samuel
«Le monochrome, c'est pour ceux qui s'intéressent (encore) au contenu. 
 Usenet dans ces conditions, c'est comme le web avec lynx, on prend 
 trop conscience du vide, c'est déprimant.»
    -+- JLC in Guide du linuxien pervers : "Coup de cafard..." -+-

Reply via email to