On 12/1/21 10:41 pm, Josef Bacik wrote:
On 1/12/21 5:34 AM, Anand Jain wrote:
In the current kernel both scrub and balance fails due to ENOSPC,
however there is no reason that it should be transitioned to the
RDONLY and making free spaces difficult.
Signed-off-by: Anand Jain <anand.j...@oracle.com>
---
fs/btrfs/super.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 12d7d3be7cd4..8c1b858f55c4 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -172,6 +172,9 @@ void __btrfs_handle_fs_error(struct btrfs_fs_info
*fs_info, const char *function
if (sb_rdonly(sb))
return;
+ if (errno == -ENOSPC)
+ return;
+
btrfs_discard_stop(fs_info);
/* btrfs handle error by forcing the filesystem readonly */
Filipe and Qu are right, but there are cases where we probably shouldn't
flip read only on ENOSPC, and we should address those at the specific
spots where this happens. Do you have an example? If it's happening at
btrfs_search_slot() time then we're not reserving enough space in
whatever reserve we use, but if it's happening somewhere else, for
example trying to mark a block group as read only and getting an ENOSPC
there, we could probably skip flipping read only for that sort of case.
We need to address the specific scenarios you're hitting rather than
blanket skipping the abort for ENOSPC, otherwise we'll get corrupt file
systems. Thanks,
Ok. It makes sense to me.
Unfortunately, I had to restore my laptop, my only source of production.
Per the stack trace below, ENOSPC is from the search.
[ 2460.219094] BTRFS info (device sdb6): balance: start -f
-dconvert=single -mconvert=single -sconvert=single
[ 2460.219224] BTRFS info (device sdb6): relocating block group
194572713984 flags data
[ 2460.241299] ------------[ cut here ]------------
[ 2460.241302] BTRFS: Transaction aborted (error -28)
[ 2460.241328] WARNING: CPU: 3 PID: 4135 at fs/btrfs/volumes.c:3003
btrfs_remove_chunk+0x60e/0x6c0 [btrfs]
::
[ 2460.241447] RIP: 0010:btrfs_remove_chunk+0x60e/0x6c0 [btrfs]
::
[ 2460.241497] Call Trace:
[ 2460.241500] btrfs_relocate_chunk+0x9d/0xd0 [btrfs]
[ 2460.241533] __btrfs_balance+0x413/0xa30 [btrfs]
[ 2460.241566] btrfs_balance+0x436/0x4d0 [btrfs]
[ 2460.241597] btrfs_ioctl_balance+0x2d5/0x380 [btrfs]
[ 2460.241647] btrfs_ioctl+0x565/0x22b0 [btrfs]
[ 2460.241693] ? selinux_file_ioctl+0x174/0x220
[ 2460.241698] ? handle_mm_fault+0xd7/0x2b0
[ 2460.241702] __x64_sys_ioctl+0x91/0xc0
[ 2460.241705] ? __x64_sys_ioctl+0x91/0xc0
[ 2460.241707] do_syscall_64+0x38/0x50
[ 2460.241711] entry_SYSCALL_64_after_hwframe+0x44/0xa9
::
[ 2460.241735] ---[ end trace 95b8b7b84503a477 ]---
[ 2460.241738] BTRFS: error (device sdb6) in btrfs_remove_chunk:3003:
errno=-28 No space left
[ 2460.241743] BTRFS info (device sdb6): forced readonly
[ 2460.242646] BTRFS info (device sdb6): 1 enospc errors during balance
[ 2460.242649] BTRFS info (device sdb6): balance: ended with status: -30
btrfs fi us /Volumes/
Overall:
Device size: 154.97GiB
Device allocated: 154.97GiB
Device unallocated: 2.00MiB
Device missing: 0.00B
Used: 147.91GiB
Free (estimated): 2.75GiB (min: 2.75GiB)
Data ratio: 1.99
Metadata ratio: 1.52
Global reserve: 183.72MiB (used: 0.00B)
Data,single: Size:894.00MiB, Used:0.00B (0.00%)
/dev/sdb6 894.00MiB
Data,RAID1: Size:75.53GiB, Used:73.23GiB (96.96%)
/dev/sdb6 75.53GiB
/dev/sdc2 75.53GiB
Metadata,single: Size:964.00MiB, Used:0.00B (0.00%)
/dev/sdb6 964.00MiB
Metadata,RAID1: Size:1.00GiB, Used:737.25MiB (72.00%)
/dev/sdb6 1.00GiB
/dev/sdc2 1.00GiB
System,single: Size:32.00MiB, Used:0.00B (0.00%)
/dev/sdb6 32.00MiB
System,RAID1: Size:32.00MiB, Used:16.00KiB (0.05%)
/dev/sdb6 32.00MiB
/dev/sdc2 32.00MiB
Unallocated:
/dev/sdb6 1.00MiB
/dev/sdc2 1.00MiB
--------
But below is another ENOSPC leading rdonlyfs. Here it was during the
scrub. And while trying to finish the ordered extents.
[ 2365.314375] ------------[ cut here ]------------
[ 2365.314385] BTRFS: Transaction aborted (error -28)
[ 2365.314470] WARNING: CPU: 2 PID: 4672 at fs/btrfs/inode.c:2823
btrfs_finish_ordered_io+0x8e6/0x950 [btrfs]
<snap>
[ 2365.314921] CPU: 2 PID: 4672 Comm: kworker/u8:11 Not tainted
5.11.0-rc2+ #3
[ 2365.314933] Hardware name: LENOVO 20FAS6PN00/20FAS6PN00, BIOS
N1CET47W (1.15 ) 08/08/2016
[ 2365.314939] Workqueue: btrfs-endio-write btrfs_work_helper [btrfs]
[ 2365.315093] RIP: 0010:btrfs_finish_ordered_io+0x8e6/0x950 [btrfs]
<snap>
[ 2365.315290] Call Trace:
[ 2365.315309] BTRFS warning (device sda6):
btrfs_finish_ordered_io:2823: Aborting unused transaction(No space left).
[ 2365.315305] finish_ordered_fn+0x15/0x20 [btrfs]
[ 2365.315532] btrfs_work_helper+0xcc/0x2f0 [btrfs]
[ 2365.315763] process_one_work+0x1ee/0x390
[ 2365.315781] worker_thread+0x50/0x3d0
[ 2365.315797] kthread+0x114/0x150
[ 2365.315811] ? process_one_work+0x390/0x390
[ 2365.315824] ? kthread_park+0x90/0x90
[ 2365.315836] ret_from_fork+0x22/0x30
[ 2365.315861] ---[ end trace b0e289a2c3d424e8 ]---
[ 2365.315871] BTRFS warning (device sda6):
btrfs_finish_ordered_io:2823: Aborting unused transaction(No space left).
[ 2365.316713] BTRFS warning (device sda6):
btrfs_finish_ordered_io:2823: Aborting unused transaction(No space left).
[ 2365.316796] BTRFS warning (device sda6): Skipping commit of aborted
transaction.
[ 2365.316809] BTRFS: error (device sda6) in cleanup_transaction:1938:
errno=-30 Readonly filesystem
[ 2365.316824] BTRFS info (device sda6): forced readonly
[ 2365.359195] BTRFS info (device sda6): scrub: not finished on devid 2
with status: -125
-Anand
Josef