diff options
author | Kent Overstreet <kent.overstreet@linux.dev> | 2025-05-08 12:27:30 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2025-05-08 14:37:46 -0400 |
commit | 968369e0da92643a81f3df3e3078a750b9fe22c6 (patch) | |
tree | a794388b81ce24bee7ac34860656fc61cf106115 /libbcachefs/alloc_foreground.c | |
parent | 723b9092ace2a9bb6d9751955cb7656386aed07e (diff) |
Update bcachefs sources to db6b78d0e5ef bcachefs: Extend bucket_size to 32 bits
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'libbcachefs/alloc_foreground.c')
-rw-r--r-- | libbcachefs/alloc_foreground.c | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/libbcachefs/alloc_foreground.c b/libbcachefs/alloc_foreground.c index c17c5733..b50846da 100644 --- a/libbcachefs/alloc_foreground.c +++ b/libbcachefs/alloc_foreground.c @@ -1336,11 +1336,31 @@ alloc_done: req->wp->sectors_free = UINT_MAX; - open_bucket_for_each(c, &req->wp->ptrs, ob, i) + open_bucket_for_each(c, &req->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); + req->wp->sectors_free = min(req->wp->sectors_free, ob->sectors_free); + } req->wp->sectors_free = rounddown(req->wp->sectors_free, block_sectors(c)); + /* Did alignment use up space in an open_bucket? */ + if (unlikely(!req->wp->sectors_free)) { + bch2_alloc_sectors_done(c, req->wp); + goto retry; + } + BUG_ON(!req->wp->sectors_free || req->wp->sectors_free == UINT_MAX); return 0; @@ -1368,20 +1388,6 @@ err: return ret; } -struct bch_extent_ptr bch2_ob_ptr(struct bch_fs *c, struct open_bucket *ob) -{ - struct bch_dev *ca = ob_dev(c, ob); - - return (struct bch_extent_ptr) { - .type = 1 << BCH_EXTENT_ENTRY_ptr, - .gen = ob->gen, - .dev = ob->dev, - .offset = bucket_to_sector(ca, ob->bucket) + - ca->mi.bucket_size - - ob->sectors_free, - }; -} - void bch2_alloc_sectors_append_ptrs(struct bch_fs *c, struct write_point *wp, struct bkey_i *k, unsigned sectors, bool cached) |