summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-12-06 11:52:58 -0500
committerKent Overstreet <kent.overstreet@gmail.com>2018-12-27 11:38:36 -0500
commitcf7055dd1f859738c7bad9007aef3a935ae6a7cc (patch)
tree0338b0c026a75ef488dcd4c3e45bcdaee65a2106
parent6bfe3b36d3115a21b91e9783999d261c4038c185 (diff)
bcachefs: improve/clarify ptr_disk_sectors()
-rw-r--r--fs/bcachefs/buckets.c47
-rw-r--r--fs/bcachefs/buckets.h14
-rw-r--r--fs/bcachefs/extents_types.h8
3 files changed, 37 insertions, 32 deletions
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 073848b9fea6..d8eb545df24c 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -550,36 +550,25 @@ void bch2_mark_metadata_bucket(struct bch_fs *c, struct bch_dev *ca,
}
}
-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;
}
/*
@@ -714,7 +703,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 75cb798eaf5d..554eb03b82ce 100644
--- a/fs/bcachefs/buckets.h
+++ b/fs/bcachefs/buckets.h
@@ -135,6 +135,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 efd72e26259d..6d4284105053 100644
--- a/fs/bcachefs/extents_types.h
+++ b/fs/bcachefs/extents_types.h
@@ -4,14 +4,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;