bcachefs: improve/clarify ptr_disk_sectors()
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 6 Dec 2018 16:52:58 +0000 (11:52 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:13 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/buckets.c
fs/bcachefs/buckets.h
fs/bcachefs/extents_types.h

index c4fe703d16811ed764005d45bc63dd3c2c1cb3bc..ab68c5138ade5e9aa8e684992ee92bb80d4280a3 100644 (file)
@@ -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,
index a13f7e068c6114c249d0afee8340fa107d53d49f..d76e65316245fc5997f9ad645cdf2a62d7ffa5ea 100644 (file)
@@ -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)
index a85cda0e7a6aa4b37961374c2f988caeb167eb85..a8dd6952d9895cddd2f13c350db500966454cc94 100644 (file)
@@ -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;