Commit dd81a060 authored by Kent Overstreet's avatar Kent Overstreet

bcachefs: ec_stripe_delete_work() now takes ref on c->writes

Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 06ab86d5
...@@ -672,9 +672,8 @@ void bch2_stripes_heap_update(struct bch_fs *c, ...@@ -672,9 +672,8 @@ void bch2_stripes_heap_update(struct bch_fs *c,
heap_verify_backpointer(c, idx); heap_verify_backpointer(c, idx);
if (stripe_idx_to_delete(c) >= 0 && if (stripe_idx_to_delete(c) >= 0)
!percpu_ref_is_dying(&c->writes)) bch2_do_stripe_deletes(c);
schedule_work(&c->ec_stripe_delete_work);
} }
/* stripe deletion */ /* stripe deletion */
...@@ -707,6 +706,15 @@ static void ec_stripe_delete_work(struct work_struct *work) ...@@ -707,6 +706,15 @@ static void ec_stripe_delete_work(struct work_struct *work)
if (ec_stripe_delete(c, idx)) if (ec_stripe_delete(c, idx))
break; break;
} }
percpu_ref_put(&c->writes);
}
void bch2_do_stripe_deletes(struct bch_fs *c)
{
if (percpu_ref_tryget_live(&c->writes) &&
!schedule_work(&c->ec_stripe_delete_work))
percpu_ref_put(&c->writes);
} }
/* stripe creation: */ /* stripe creation: */
......
...@@ -213,6 +213,8 @@ void bch2_stripes_heap_update(struct bch_fs *, struct stripe *, size_t); ...@@ -213,6 +213,8 @@ void bch2_stripes_heap_update(struct bch_fs *, struct stripe *, size_t);
void bch2_stripes_heap_del(struct bch_fs *, struct stripe *, size_t); void bch2_stripes_heap_del(struct bch_fs *, struct stripe *, size_t);
void bch2_stripes_heap_insert(struct bch_fs *, struct stripe *, size_t); void bch2_stripes_heap_insert(struct bch_fs *, struct stripe *, size_t);
void bch2_do_stripe_deletes(struct bch_fs *);
void bch2_ec_stop_dev(struct bch_fs *, struct bch_dev *); void bch2_ec_stop_dev(struct bch_fs *, struct bch_dev *);
void bch2_ec_flush_new_stripes(struct bch_fs *); void bch2_ec_flush_new_stripes(struct bch_fs *);
......
...@@ -258,8 +258,6 @@ void bch2_fs_read_only(struct bch_fs *c) ...@@ -258,8 +258,6 @@ void bch2_fs_read_only(struct bch_fs *c)
*/ */
percpu_ref_kill(&c->writes); percpu_ref_kill(&c->writes);
cancel_work_sync(&c->ec_stripe_delete_work);
/* /*
* If we're not doing an emergency shutdown, we want to wait on * If we're not doing an emergency shutdown, we want to wait on
* outstanding writes to complete so they don't see spurious errors due * outstanding writes to complete so they don't see spurious errors due
...@@ -391,9 +389,6 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early) ...@@ -391,9 +389,6 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
bch2_dev_allocator_add(c, ca); bch2_dev_allocator_add(c, ca);
bch2_recalc_capacity(c); bch2_recalc_capacity(c);
bch2_do_discards(c);
bch2_do_invalidates(c);
if (!early) { if (!early) {
ret = bch2_fs_read_write_late(c); ret = bch2_fs_read_write_late(c);
if (ret) if (ret)
...@@ -403,6 +398,10 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early) ...@@ -403,6 +398,10 @@ static int __bch2_fs_read_write(struct bch_fs *c, bool early)
percpu_ref_reinit(&c->writes); percpu_ref_reinit(&c->writes);
set_bit(BCH_FS_RW, &c->flags); set_bit(BCH_FS_RW, &c->flags);
set_bit(BCH_FS_WAS_RW, &c->flags); set_bit(BCH_FS_WAS_RW, &c->flags);
bch2_do_discards(c);
bch2_do_invalidates(c);
bch2_do_stripe_deletes(c);
return 0; return 0;
err: err:
__bch2_fs_read_only(c); __bch2_fs_read_only(c);
......
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