btrfs: do not abort transaction on failure to write log tree when syncing log
authorFilipe Manana <fdmanana@suse.com>
Tue, 10 Jan 2023 14:56:37 +0000 (14:56 +0000)
committerDavid Sterba <dsterba@suse.com>
Thu, 12 Jan 2023 14:43:30 +0000 (15:43 +0100)
commit16199ad9eb6db60a6b10794a09fc1ac6d09312ff
tree4495c26f3649e7964bd07c6620a81c2b8eca17dc
parent94cd63ae679973edeb5ea95ec25a54467c3e54c8
btrfs: do not abort transaction on failure to write log tree when syncing log

When syncing the log, if we fail to write log tree extent buffers, we mark
the log for a full commit and abort the transaction. However we don't need
to abort the transaction, all we really need to do is to make sure no one
can commit a superblock pointing to new log tree roots. Just because we
got a failure writing extent buffers for a log tree, it does not mean we
will also fail to do a transaction commit.

One particular case is if due to a bug somewhere, when writing log tree
extent buffers, the tree checker detects some corruption and the writeout
fails because of that. Aborting the transaction can be very disruptive for
a user, specially if the issue happened on a root filesystem. One example
is the scenario in the Link tag below, where an isolated corruption on log
tree leaves was causing transaction aborts when syncing the log.

Link: https://lore.kernel.org/linux-btrfs/ae169fc6-f504-28f0-a098-6fa6a4dfb612@leemhuis.info/
CC: stable@vger.kernel.org # 5.15+
Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/disk-io.c
fs/btrfs/tree-log.c