]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
bcachefs: BCH_DATA_unstriped
authorKent Overstreet <kent.overstreet@linux.dev>
Thu, 23 Nov 2023 21:34:03 +0000 (16:34 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 14 Jul 2024 23:00:12 +0000 (19:00 -0400)
Add a new pseudo data type, to track buckets that are members of a
stripe, but have unstriped data in them.

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_background.h
fs/bcachefs/bcachefs_format.h
fs/bcachefs/buckets.c
fs/bcachefs/chardev.c

index d7eb9feb7a7e61e7abfdb047ee7c6ac866e19e05..a766eaf48863ace7dbdb504d394c6e3b8dcfba27 100644 (file)
@@ -100,6 +100,11 @@ static inline unsigned bch2_bucket_sectors_fragmented(struct bch_dev *ca,
        return d ? max(0, ca->mi.bucket_size - d) : 0;
 }
 
+static inline unsigned bch2_bucket_sectors_unstriped(struct bch_alloc_v4 a)
+{
+       return a.data_type == BCH_DATA_stripe ? a.dirty_sectors : 0;
+}
+
 static inline enum bch_data_type alloc_data_type(struct bch_alloc_v4 a,
                                                 enum bch_data_type data_type)
 {
index e3b1bde489c3b0e4a8834af733a930b175ababdd..1d580e529da54055c086c69bca5a7921a1d909aa 100644 (file)
@@ -612,7 +612,8 @@ LE64_BITMASK(BCH_KDF_SCRYPT_P,      struct bch_sb_field_crypt, kdf_flags, 32, 48);
        x(parity,       6)              \
        x(stripe,       7)              \
        x(need_gc_gens, 8)              \
-       x(need_discard, 9)
+       x(need_discard, 9)              \
+       x(unstriped,    10)
 
 enum bch_data_type {
 #define x(t, n) BCH_DATA_##t,
index 8017faf56b0f10138f552a0c053488f2aee1761f..33b75f92b6ae2860d19ac5dc56f6a8d7e4ca3dec 100644 (file)
@@ -309,12 +309,20 @@ void bch2_dev_usage_update(struct bch_fs *c, struct bch_dev *ca,
        u->d[old->data_type].sectors -= bch2_bucket_sectors_dirty(*old);
        u->d[new->data_type].sectors += bch2_bucket_sectors_dirty(*new);
 
-       u->d[BCH_DATA_cached].sectors += new->cached_sectors;
-       u->d[BCH_DATA_cached].sectors -= old->cached_sectors;
-
        u->d[old->data_type].fragmented -= bch2_bucket_sectors_fragmented(ca, *old);
        u->d[new->data_type].fragmented += bch2_bucket_sectors_fragmented(ca, *new);
 
+       u->d[BCH_DATA_cached].sectors -= old->cached_sectors;
+       u->d[BCH_DATA_cached].sectors += new->cached_sectors;
+
+       unsigned old_unstriped = bch2_bucket_sectors_unstriped(*old);
+       u->d[BCH_DATA_unstriped].buckets -= old_unstriped != 0;
+       u->d[BCH_DATA_unstriped].sectors -= old_unstriped;
+
+       unsigned new_unstriped = bch2_bucket_sectors_unstriped(*new);
+       u->d[BCH_DATA_unstriped].buckets += new_unstriped != 0;
+       u->d[BCH_DATA_unstriped].sectors += new_unstriped;
+
        preempt_enable();
 }
 
index 8c5b13cd3205c359fdc11a315ea3ef2706002aff..7fd80f6de22178bed2b382fb8a5fe24393b93310 100644 (file)
@@ -619,7 +619,7 @@ static long bch2_ioctl_dev_usage(struct bch_fs *c,
        arg.bucket_size         = ca->mi.bucket_size;
        arg.nr_buckets          = ca->mi.nbuckets - ca->mi.first_bucket;
 
-       for (i = 0; i < BCH_DATA_NR; i++) {
+       for (i = 0; i < ARRAY_SIZE(arg.d); i++) {
                arg.d[i].buckets        = src.d[i].buckets;
                arg.d[i].sectors        = src.d[i].sectors;
                arg.d[i].fragmented     = src.d[i].fragmented;