summaryrefslogtreecommitdiff
path: root/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch')
-rw-r--r--sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch95
1 files changed, 0 insertions, 95 deletions
diff --git a/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch b/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
deleted file mode 100644
index 6d8d2ea530d5..000000000000
--- a/sys-fs/bees/files/6002-context-workaround-to-prevent-LOGICAL_INO-and-btrfs-.patch
+++ /dev/null
@@ -1,95 +0,0 @@
-From f731ea8016c570243c783adef96681b535d9c927 Mon Sep 17 00:00:00 2001
-From: Zygo Blaxell <bees@furryterror.org>
-Date: Tue, 19 Nov 2019 16:01:31 -0500
-Subject: [PATCH 2/2] context: workaround to prevent LOGICAL_INO and btrfs
- balance from running concurrently
-
-This avoids some kernel bugs. One of them is fixed in 5.3.4 and later:
-
- efad8a853a "Btrfs: fix use-after-free when using the tree modification log"
-
-There are apparently others in current kernels, so for now just put bees
-on pause until the balance is done.
-
-At some point we may want to provide an option to disable this
-workaround; however, running bees and balance at the same time makes
-neither particularly fast, so maybe we'll just leave it this way.
-
-Signed-off-by: Zygo Blaxell <bees@furryterror.org>
----
- src/bees-context.cc | 31 +++++++++++++++++++++++++++++++
- src/bees.h | 4 ++++
- 2 files changed, 35 insertions(+)
-
-diff --git a/src/bees-context.cc b/src/bees-context.cc
-index 4e0a43e..0665019 100644
---- a/src/bees-context.cc
-+++ b/src/bees-context.cc
-@@ -760,11 +760,42 @@ BeesResolveAddrResult::BeesResolveAddrResult()
- {
- }
-
-+void
-+BeesContext::wait_for_balance()
-+{
-+ Timer balance_timer;
-+ BEESNOTE("WORKAROUND: waiting for balance to stop");
-+ while (true) {
-+ btrfs_ioctl_balance_args args;
-+ memset_zero<btrfs_ioctl_balance_args>(&args);
-+ const int ret = ioctl(root_fd(), BTRFS_IOC_BALANCE_PROGRESS, &args);
-+ if (ret < 0) {
-+ // Either can't get balance status or not running, exit either way
-+ break;
-+ }
-+
-+ if (!(args.state & BTRFS_BALANCE_STATE_RUNNING)) {
-+ // Balance not running, doesn't matter if paused or cancelled
-+ break;
-+ }
-+
-+ BEESLOGDEBUG("WORKAROUND: Waiting " << balance_timer << "s for balance to stop");
-+ sleep(BEES_BALANCE_POLL_INTERVAL);
-+ }
-+}
-+
- BeesResolveAddrResult
- BeesContext::resolve_addr_uncached(BeesAddress addr)
- {
- THROW_CHECK1(invalid_argument, addr, !addr.is_magic());
- THROW_CHECK0(invalid_argument, !!root_fd());
-+
-+ // Is there a bug where resolve and balance cause a crash (BUG_ON at fs/btrfs/ctree.c:1227)?
-+ // Apparently yes, and more than one.
-+ // Wait for the balance to finish before we run LOGICAL_INO
-+ wait_for_balance();
-+
-+ // Time how long this takes
- Timer resolve_timer;
-
- // There is no performance benefit if we restrict the buffer size.
-diff --git a/src/bees.h b/src/bees.h
-index da87d88..5c9375c 100644
---- a/src/bees.h
-+++ b/src/bees.h
-@@ -114,6 +114,9 @@ const size_t BEES_TRANSID_FACTOR = 10;
- // The actual limit in LOGICAL_INO seems to be 2730, but let's leave a little headroom
- const size_t BEES_MAX_EXTENT_REF_COUNT = 2560;
-
-+// Wait this long for a balance to stop
-+const double BEES_BALANCE_POLL_INTERVAL = 60.0;
-+
- // Flags
- const int FLAGS_OPEN_COMMON = O_NOFOLLOW | O_NONBLOCK | O_CLOEXEC | O_NOATIME | O_LARGEFILE | O_NOCTTY;
- const int FLAGS_OPEN_DIR = FLAGS_OPEN_COMMON | O_RDONLY | O_DIRECTORY;
-@@ -708,6 +711,7 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
- void set_root_fd(Fd fd);
-
- BeesResolveAddrResult resolve_addr_uncached(BeesAddress addr);
-+ void wait_for_balance();
-
- BeesFileRange scan_one_extent(const BeesFileRange &bfr, const Extent &e);
- void rewrite_file_range(const BeesFileRange &bfr);
---
-2.23.0
-