Hi Richard,
[I quote your report here, as you wanted to do so, but faced some issue]
Upstream bug: https://bugzilla.kernel.org/show_bug.cgi?id=211167
Fedora bug: https://bugzilla.redhat.com/show_bug.cgi?id=1926954
ArchLinux bug: https://bbs.archlinux.org/viewtopic.php?id=262243
fstrim of ntfs-3g filesystems is broken in newer Linux kernels.
I have confirmed this and bisected it to a particular kernel commit:
block: Do not discard buffers under a mounted filesystem
Discarding blocks and buffers under a mounted filesystem is hardly
anything admin wants to do. Usually it will confuse the filesystem and
IMHO it is the admin job to optimize their system, even running 24/7.
sometimes the loss of buffer_head state (including b_private field) can
even cause crashes like:
So there is a missing serialization. It is each file system job
to make sure blocks are not reused or reallocated while they are
being discarded.
BUG: unable to handle kernel NULL pointer dereference at 0000000000000008
PGD 0 P4D 0
Oops: 0002 [#1] SMP PTI
CPU: 4 PID: 203778 Comm: jbd2/dm-3-8 Kdump: loaded Tainted: G O
--------- - - 4.18.0-147.5.0.5.h126.eulerosv2r9.x86_64 #1
Hardware name: Huawei RH2288H V3/BC11HGSA0, BIOS 1.57 08/11/2015
RIP: 0010:jbd2_journal_grab_journal_head+0x1b/0x40 [jbd2]
...
Call Trace:
__jbd2_journal_insert_checkpoint+0x23/0x70 [jbd2]
jbd2_journal_commit_transaction+0x155f/0x1b60 [jbd2]
kjournald2+0xbd/0x270 [jbd2]
So if we don't have block device open with O_EXCL already, claim the
block device while we truncate buffer cache. This makes sure any
exclusive block device user (such as filesystem) cannot operate on the
device while we are discarding buffer cache.
Reported-by: Ye Bin <yebi...@huawei.com>
Signed-off-by: Jan Kara <j...@suse.cz>
Reviewed-by: Christoph Hellwig <h...@lst.de>
[axboe: fix !CONFIG_BLOCK error in truncate_bdev_range()]
Signed-off-by: Jens Axboe <ax...@kernel.dk>
As far as I can tell the commit is intended to stop you from doing
blkdiscard on a block device which is in use by a (kernel) filesystem,
which sounds like a good idea. Breakage of FUSE devices that use
block devices is possibly an unintentional side-effect.
So how is fstrim(8) supposed to be used ? Currently it requires a
mounted file system as its last argument.
Technically ntfs-3g can close the device (without unmounting), reopen
it without O_EXCL for trimming, and reopen again with O_EXCL, but this
sounds like a very bad way of doing.
How does the ext4 driver allow allow the discarding to take place ?
Jean-Pierre
Although reverting the commit fixes it, I've no idea how to fix it
properly.
Rich.
(BTW I'm unable to subscribe to ntfs-3g-devel ...)
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-builder quickly builds VMs from scratch
http://libguestfs.org/virt-builder.1.html
_______________________________________________
ntfs-3g-devel mailing list
ntfs-3g-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ntfs-3g-devel