From 31f5c3f0741285f50d574d24b35118a64eccf256 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Wed, 19 Aug 2020 13:26:16 +0200 Subject: [PATCH] 4.14-stable patches added patches: btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch --- ...lock-device-for-user-invisible-roots.patch | 90 +++++++++++++++++++ queue-4.14/series | 1 + 2 files changed, 91 insertions(+) create mode 100644 queue-4.14/btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch diff --git a/queue-4.14/btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch b/queue-4.14/btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch new file mode 100644 index 00000000000..633033c840c --- /dev/null +++ b/queue-4.14/btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch @@ -0,0 +1,90 @@ +From 851fd730a743e072badaf67caf39883e32439431 Mon Sep 17 00:00:00 2001 +From: Qu Wenruo +Date: Tue, 16 Jun 2020 10:17:34 +0800 +Subject: btrfs: don't allocate anonymous block device for user invisible roots + +From: Qu Wenruo + +commit 851fd730a743e072badaf67caf39883e32439431 upstream. + +[BUG] +When a lot of subvolumes are created, there is a user report about +transaction aborted: + + BTRFS: Transaction aborted (error -24) + WARNING: CPU: 17 PID: 17041 at fs/btrfs/transaction.c:1576 create_pending_snapshot+0xbc4/0xd10 [btrfs] + RIP: 0010:create_pending_snapshot+0xbc4/0xd10 [btrfs] + Call Trace: + create_pending_snapshots+0x82/0xa0 [btrfs] + btrfs_commit_transaction+0x275/0x8c0 [btrfs] + btrfs_mksubvol+0x4b9/0x500 [btrfs] + btrfs_ioctl_snap_create_transid+0x174/0x180 [btrfs] + btrfs_ioctl_snap_create_v2+0x11c/0x180 [btrfs] + btrfs_ioctl+0x11a4/0x2da0 [btrfs] + do_vfs_ioctl+0xa9/0x640 + ksys_ioctl+0x67/0x90 + __x64_sys_ioctl+0x1a/0x20 + do_syscall_64+0x5a/0x110 + entry_SYSCALL_64_after_hwframe+0x44/0xa9 + ---[ end trace 33f2f83f3d5250e9 ]--- + BTRFS: error (device sda1) in create_pending_snapshot:1576: errno=-24 unknown + BTRFS info (device sda1): forced readonly + BTRFS warning (device sda1): Skipping commit of aborted transaction. + BTRFS: error (device sda1) in cleanup_transaction:1831: errno=-24 unknown + +[CAUSE] +The error is EMFILE (Too many files open) and comes from the anonymous +block device allocation. The ids are in a shared pool of size 1<<20. + +The ids are assigned to live subvolumes, ie. the root structure exists +in memory (eg. after creation or after the root appears in some path). +The pool could be exhausted if the numbers are not reclaimed fast +enough, after subvolume deletion or if other system component uses the +anon block devices. + +[WORKAROUND] +Since it's not possible to completely solve the problem, we can only +minimize the time the id is allocated to a subvolume root. + +Firstly, we can reduce the use of anon_dev by trees that are not +subvolume roots, like data reloc tree. + +This patch will do extra check on root objectid, to skip roots that +don't need anon_dev. Currently it's only data reloc tree and orphan +roots. + +Reported-by: Greed Rong +Link: https://lore.kernel.org/linux-btrfs/CA+UqX+NTrZ6boGnWHhSeZmEY5J76CTqmYjO2S+=tHJX7nb9DPw@mail.gmail.com/ +CC: stable@vger.kernel.org # 4.4+ +Reviewed-by: Josef Bacik +Signed-off-by: Qu Wenruo +Reviewed-by: David Sterba +Signed-off-by: David Sterba +Signed-off-by: Greg Kroah-Hartman + +--- + fs/btrfs/disk-io.c | 13 ++++++++++--- + 1 file changed, 10 insertions(+), 3 deletions(-) + +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -1509,9 +1509,16 @@ int btrfs_init_fs_root(struct btrfs_root + spin_lock_init(&root->ino_cache_lock); + init_waitqueue_head(&root->ino_cache_wait); + +- ret = get_anon_bdev(&root->anon_dev); +- if (ret) +- goto fail; ++ /* ++ * Don't assign anonymous block device to roots that are not exposed to ++ * userspace, the id pool is limited to 1M ++ */ ++ if (is_fstree(root->root_key.objectid) && ++ btrfs_root_refs(&root->root_item) > 0) { ++ ret = get_anon_bdev(&root->anon_dev); ++ if (ret) ++ goto fail; ++ } + + mutex_lock(&root->objectid_mutex); + ret = btrfs_find_highest_objectid(root, diff --git a/queue-4.14/series b/queue-4.14/series index 3241d32f56f..8ce02d00a8a 100644 --- a/queue-4.14/series +++ b/queue-4.14/series @@ -166,3 +166,4 @@ xen-balloon-make-the-balloon-wait-interruptible.patch net-initialize-fastreuse-on-inet_inherit_port.patch smb3-warn-on-confusing-error-scenario-with-sec-krb5.patch pci-hotplug-acpi-fix-context-refcounting-in-acpiphp_grab_context.patch +btrfs-don-t-allocate-anonymous-block-device-for-user-invisible-roots.patch -- 2.47.3