diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2022-06-21 02:48:16 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:09:34 +0300 |
commit | 1c6ff39445553f84f9a46c2c60a4768c7f4ef226 (patch) | |
tree | b28054c9d19b1f496c59f4db8210eff7866f0385 | |
parent | a3d7afa5c1b62140168982747fd15c1999d991f4 (diff) | |
download | linux-1c6ff39445553f84f9a46c2c60a4768c7f4ef226.tar.xz |
bcachefs: Fix refcount leak in bch2_do_invalidates()
If we fail to queue the work item because it's already in process, we
need to drop the ref we just took.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/alloc_background.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/fs/bcachefs/alloc_background.c b/fs/bcachefs/alloc_background.c index 3084081966b6..933334fed960 100644 --- a/fs/bcachefs/alloc_background.c +++ b/fs/bcachefs/alloc_background.c @@ -1192,8 +1192,9 @@ static void bch2_do_invalidates_work(struct work_struct *work) void bch2_do_invalidates(struct bch_fs *c) { - if (percpu_ref_tryget_live(&c->writes)) - queue_work(system_long_wq, &c->invalidate_work); + if (percpu_ref_tryget_live(&c->writes) && + !queue_work(system_long_wq, &c->invalidate_work)) + percpu_ref_put(&c->writes); } static int bucket_freespace_init(struct btree_trans *trans, struct btree_iter *iter) |