Re: mkfs.ext4 vs. e2fsck discard oddities
From: Eric Sandeen <hidden>
Date: 2012-02-29 16:01:55
On 2/29/12 1:12 AM, Lukas Czerner wrote:
On Tue, 28 Feb 2012, Eric Sandeen wrote:quoted
I've been testing Lukas' last 2 patches for e2fsck discard, and noticed something a little odd. If I make a 512M file, loopback mount it, and mkfs.ext4 it with discard, it uses about 17M at that point. If I then run fsstress on it with a known seed, then run e2fsck -E discard on it, it uses about 52M. If I repeat the above test telling mkfs.ext4 NOT to discard, I'm left with about 94M after the discarding e2fsck. So it seems that perhaps e2fsck is not discarding everything that it could; after a discarding fsck, we should be left with the same (minimal) nr. of blocks "in use" no?The reason is (as I commented in the patch #2) that we will not discard BLOCK_UNINIT groups. We use BLOCK_UNINIT as a optimization measure to skip groups which are likely to be non-provisioned, because we have never written there anything since the mkfs. If you create file system without discard, then obviously nothing is discarded, image is fully provisioned and e2fsck discard *only* initialized groups. So you'll end up with the bigger image, in case that your image was not sparse. I hope that makes sense.
It does, sorry, I had been focusing too much on patch #1 ;) -Eric
Actually I want to make the same optimization for fitrim. We discussed it with Ted and Phillip (see the discussion under [RESEND] [PATCH 2/2 v2] e2fsck: Do not forget to discard last block group. They did seem to be convinced by that, however I think it is right thing to do for the reasons I gave in that thread. Thanks! -Lukasquoted
I guess that's better than discarding _more_ than it should though. ;) (I suppose it is possible that this is the underlying filesytem being selective about which discards it accepts, but it behaves the same way on ext4 and xfs backing filesystems) -Eric FWIW, sequence of events here, tested with and without "-K" on mkfs.ext4: dd if=/dev/zero of=fsfile bs=1M count=512 losetup /dev/loop0 fsfile mkfs.ext4 -F /dev/loop0&>/dev/null mount /dev/loop0 mnt/ /root/git/xfstests/ltp/fsstress -s 1 -d mnt/ -n 2000 -p 4 umount mnt/ e2fsck/e2fsck.static -fy -E discard /dev/loop0> fsck1.out || exit du -hc fsfile losetup -d /dev/loop0