Commit 83ccd9b3 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: bch_fs.rw_devs_change_count

Add a counter that's incremented whenever rw devices change; this will
be used for erasure coding so that it can keep ec_stripe_head in sync
and not deadlock on a new stripe when a device it wants goes away.
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent ad8d1f77
...@@ -2463,13 +2463,15 @@ static bool bch2_dev_has_open_write_point(struct bch_fs *c, struct bch_dev *ca) ...@@ -2463,13 +2463,15 @@ static bool bch2_dev_has_open_write_point(struct bch_fs *c, struct bch_dev *ca)
/* device goes ro: */ /* device goes ro: */
void bch2_dev_allocator_remove(struct bch_fs *c, struct bch_dev *ca) void bch2_dev_allocator_remove(struct bch_fs *c, struct bch_dev *ca)
{ {
unsigned i; lockdep_assert_held(&c->state_lock);
/* First, remove device from allocation groups: */ /* First, remove device from allocation groups: */
for (i = 0; i < ARRAY_SIZE(c->rw_devs); i++) for (unsigned i = 0; i < ARRAY_SIZE(c->rw_devs); i++)
clear_bit(ca->dev_idx, c->rw_devs[i].d); clear_bit(ca->dev_idx, c->rw_devs[i].d);
c->rw_devs_change_count++;
/* /*
* Capacity is calculated based off of devices in allocation groups: * Capacity is calculated based off of devices in allocation groups:
*/ */
...@@ -2498,11 +2500,13 @@ void bch2_dev_allocator_remove(struct bch_fs *c, struct bch_dev *ca) ...@@ -2498,11 +2500,13 @@ void bch2_dev_allocator_remove(struct bch_fs *c, struct bch_dev *ca)
/* device goes rw: */ /* device goes rw: */
void bch2_dev_allocator_add(struct bch_fs *c, struct bch_dev *ca) void bch2_dev_allocator_add(struct bch_fs *c, struct bch_dev *ca)
{ {
unsigned i; lockdep_assert_held(&c->state_lock);
for (i = 0; i < ARRAY_SIZE(c->rw_devs); i++) for (unsigned i = 0; i < ARRAY_SIZE(c->rw_devs); i++)
if (ca->mi.data_allowed & (1 << i)) if (ca->mi.data_allowed & (1 << i))
set_bit(ca->dev_idx, c->rw_devs[i].d); set_bit(ca->dev_idx, c->rw_devs[i].d);
c->rw_devs_change_count++;
} }
void bch2_dev_allocator_background_exit(struct bch_dev *ca) void bch2_dev_allocator_background_exit(struct bch_dev *ca)
......
...@@ -871,6 +871,7 @@ struct bch_fs { ...@@ -871,6 +871,7 @@ struct bch_fs {
/* ALLOCATION */ /* ALLOCATION */
struct bch_devs_mask rw_devs[BCH_DATA_NR]; struct bch_devs_mask rw_devs[BCH_DATA_NR];
unsigned long rw_devs_change_count;
u64 capacity; /* sectors */ u64 capacity; /* sectors */
u64 reserved; /* sectors */ u64 reserved; /* sectors */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment