summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@linux.dev>2023-11-23 16:34:03 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2024-06-12 20:43:37 -0400
commit5cb3b05cc8bec069293db6daca69c94dfa96b2ca (patch)
tree866dc29021b2317c607451550969e410ad447a06
parent7f96d5606cad377561718a1a9c2581300b7f02c6 (diff)
bcachefs: BCH_DATA_unstriped
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>
-rw-r--r--fs/bcachefs/alloc_background.h5
-rw-r--r--fs/bcachefs/bcachefs_format.h3
-rw-r--r--fs/bcachefs/buckets.c14
-rw-r--r--fs/bcachefs/chardev.c2
4 files changed, 19 insertions, 5 deletions
diff --git a/fs/bcachefs/alloc_background.h b/fs/bcachefs/alloc_background.h
index 05591644e323..dcfe035fa65a 100644
--- a/fs/bcachefs/alloc_background.h
+++ b/fs/bcachefs/alloc_background.h
@@ -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)
{
diff --git a/fs/bcachefs/bcachefs_format.h b/fs/bcachefs/bcachefs_format.h
index 90c12fe2a2cd..2b3f5a0f22d7 100644
--- a/fs/bcachefs/bcachefs_format.h
+++ b/fs/bcachefs/bcachefs_format.h
@@ -609,7 +609,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,
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index 8805f6e8070f..72f30082e72d 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -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();
}
diff --git a/fs/bcachefs/chardev.c b/fs/bcachefs/chardev.c
index 5040c584cd72..ab1cd1894262 100644
--- a/fs/bcachefs/chardev.c
+++ b/fs/bcachefs/chardev.c
@@ -617,7 +617,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;