aboutsummaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/alloc_foreground.c
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <[email protected]>2025-05-13 06:19:37 +0000
committerGreg Kroah-Hartman <[email protected]>2025-05-13 06:19:37 +0000
commit991919e969043a4422dfebbcadf600a5d28b94e4 (patch)
tree4776f9f162c665a9735198fafc466d3e49a14253 /fs/bcachefs/alloc_foreground.c
parentcomedi: drivers: adl_pci9118.c: Edit file so that checkpatch.pl has 0 typo er... (diff)
parentLinux 6.15-rc6 (diff)
downloadkernel-991919e969043a4422dfebbcadf600a5d28b94e4.tar.gz
kernel-991919e969043a4422dfebbcadf600a5d28b94e4.zip
Merge 6.15-rc6 into char-misc-next
We need the iio/hyperv fixes in here as well. Signed-off-by: Greg Kroah-Hartman <[email protected]>
Diffstat (limited to 'fs/bcachefs/alloc_foreground.c')
-rw-r--r--fs/bcachefs/alloc_foreground.c22
1 files changed, 21 insertions, 1 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c
index effafc3e0ced..7ec022e9361a 100644
--- a/fs/bcachefs/alloc_foreground.c
+++ b/fs/bcachefs/alloc_foreground.c
@@ -1422,11 +1422,31 @@ alloc_done:
wp->sectors_free = UINT_MAX;
- open_bucket_for_each(c, &wp->ptrs, ob, i)
+ open_bucket_for_each(c, &wp->ptrs, ob, i) {
+ /*
+ * Ensure proper write alignment - either due to misaligned
+ * bucket sizes (from buggy bcachefs-tools), or writes that mix
+ * logical/physical alignment:
+ */
+ struct bch_dev *ca = ob_dev(c, ob);
+ u64 offset = bucket_to_sector(ca, ob->bucket) +
+ ca->mi.bucket_size -
+ ob->sectors_free;
+ unsigned align = round_up(offset, block_sectors(c)) - offset;
+
+ ob->sectors_free = max_t(int, 0, ob->sectors_free - align);
+
wp->sectors_free = min(wp->sectors_free, ob->sectors_free);
+ }
wp->sectors_free = rounddown(wp->sectors_free, block_sectors(c));
+ /* Did alignment use up space in an open_bucket? */
+ if (unlikely(!wp->sectors_free)) {
+ bch2_alloc_sectors_done(c, wp);
+ goto retry;
+ }
+
BUG_ON(!wp->sectors_free || wp->sectors_free == UINT_MAX);
return 0;