From 641ab736437a3f9881467c0005b0d677194fff63 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Thu, 6 Dec 2018 11:52:58 -0500 Subject: bcachefs: improve/clarify ptr_disk_sectors() Signed-off-by: Kent Overstreet --- fs/bcachefs/buckets.c | 47 ++++++++++++++++++--------------------------- fs/bcachefs/buckets.h | 14 ++++++++++++++ fs/bcachefs/extents_types.h | 8 ++++---- 3 files changed, 37 insertions(+), 32 deletions(-) diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c index c4fe703d1681..ab68c5138ade 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -558,36 +558,25 @@ void bch2_mark_metadata_bucket(struct bch_fs *c, struct bch_dev *ca, preempt_enable(); } -static int __disk_sectors(struct bch_extent_crc_unpacked crc, unsigned sectors) +static s64 ptr_disk_sectors_delta(struct extent_ptr_decoded p, + s64 delta) { - if (!sectors) - return 0; - - return max(1U, DIV_ROUND_UP(sectors * crc.compressed_size, - crc.uncompressed_size)); -} - -static s64 ptr_disk_sectors(const struct bkey *k, - struct extent_ptr_decoded p, - s64 sectors) -{ - - if (p.crc.compression_type) { - unsigned old_sectors, new_sectors; - - if (sectors > 0) { - old_sectors = 0; - new_sectors = sectors; - } else { - old_sectors = k->size; - new_sectors = k->size + sectors; - } + if (delta > 0) { + /* + * marking a new extent, which _will have size_ @delta + * + * in the bch2_mark_update -> BCH_EXTENT_OVERLAP_MIDDLE + * case, we haven't actually created the key we'll be inserting + * yet (for the split) - so we don't want to be using + * k->size/crc.live_size here: + */ + return __ptr_disk_sectors(p, delta); + } else { + BUG_ON(-delta > p.crc.live_size); - sectors = -__disk_sectors(p.crc, old_sectors) - +__disk_sectors(p.crc, new_sectors); + return (s64) __ptr_disk_sectors(p, p.crc.live_size + delta) - + (s64) ptr_disk_sectors(p); } - - return sectors; } /* @@ -722,7 +711,9 @@ static int bch2_mark_extent(struct bch_fs *c, struct bkey_s_c k, BUG_ON(!sectors); bkey_for_each_ptr_decode(k.k, ptrs, p, entry) { - s64 disk_sectors = ptr_disk_sectors(k.k, p, sectors); + s64 disk_sectors = data_type == BCH_DATA_BTREE + ? sectors + : ptr_disk_sectors_delta(p, sectors); s64 adjusted_disk_sectors = disk_sectors; bch2_mark_pointer(c, p, disk_sectors, data_type, diff --git a/fs/bcachefs/buckets.h b/fs/bcachefs/buckets.h index a13f7e068c61..d76e65316245 100644 --- a/fs/bcachefs/buckets.h +++ b/fs/bcachefs/buckets.h @@ -136,6 +136,20 @@ static inline u8 ptr_stale(struct bch_dev *ca, return gen_after(ptr_bucket_mark(ca, ptr).gen, ptr->gen); } +static inline unsigned __ptr_disk_sectors(struct extent_ptr_decoded p, + unsigned live_size) +{ + return live_size && p.crc.compression_type + ? max(1U, DIV_ROUND_UP(live_size * p.crc.compressed_size, + p.crc.uncompressed_size)) + : live_size; +} + +static inline unsigned ptr_disk_sectors(struct extent_ptr_decoded p) +{ + return __ptr_disk_sectors(p, p.crc.live_size); +} + /* bucket gc marks */ static inline unsigned bucket_sectors_used(struct bucket_mark mark) diff --git a/fs/bcachefs/extents_types.h b/fs/bcachefs/extents_types.h index a85cda0e7a6a..a8dd6952d989 100644 --- a/fs/bcachefs/extents_types.h +++ b/fs/bcachefs/extents_types.h @@ -5,14 +5,14 @@ #include "bcachefs_format.h" struct bch_extent_crc_unpacked { + u32 compressed_size; + u32 uncompressed_size; + u32 live_size; + u8 csum_type; u8 compression_type; - u16 compressed_size; - u16 uncompressed_size; - u16 offset; - u16 live_size; u16 nonce; -- cgit v1.2.3