bcachefs: Don't block on allocations when only writing to specific device
authorKent Overstreet <kent.overstreet@gmail.com>
Wed, 12 Aug 2020 17:48:02 +0000 (13:48 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:43 +0000 (17:08 -0400)
Since the copygc thread is now global and not per device, we're not
freeing up space on any one device in bounded time - and indeed we never
really were, since rebalance wasn't moving data around between devices
with that objective.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/io.c

index 0f4c5c3c408c74e20f0d966fcf48b3ce34a0ddb4..52501714985501696167f33a2a9d7806636d1740 100644 (file)
@@ -1090,6 +1090,11 @@ again:
                        goto err;
                }
 
+               /*
+                * The copygc thread is now global, which means it's no longer
+                * freeing up space on specific disks, which means that
+                * allocations for specific disks may hang arbitrarily long:
+                */
                wp = bch2_alloc_sectors_start(c,
                        op->target,
                        op->opts.erasure_code,
@@ -1099,7 +1104,8 @@ again:
                        op->nr_replicas_required,
                        op->alloc_reserve,
                        op->flags,
-                       (op->flags & BCH_WRITE_ALLOC_NOWAIT) ? NULL : cl);
+                       (op->flags & (BCH_WRITE_ALLOC_NOWAIT|
+                                     BCH_WRITE_ONLY_SPECIFIED_DEVS)) ? NULL : cl);
                EBUG_ON(!wp);
 
                if (unlikely(IS_ERR(wp))) {