bcachefs: Always use percpu_ref_tryget_live() on c->writes
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 18 Jun 2022 23:55:32 +0000 (19:55 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:34 +0000 (17:09 -0400)
If we're trying to get a ref and the refcount has been killed, it means
we're doing an emergency shutdown - we always want tryget_live().

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/alloc_background.c
fs/bcachefs/btree_update_interior.c
fs/bcachefs/btree_update_leaf.c
fs/bcachefs/ec.c
fs/bcachefs/fs-io.c
fs/bcachefs/io.c
fs/bcachefs/reflink.c
fs/bcachefs/subvolume.c
fs/bcachefs/sysfs.c

index 012607cefb6f60d4f8facc76867def364e01a6ba..3084081966b64b853388a1de3146bed428c798c4 100644 (file)
@@ -1072,7 +1072,7 @@ static void bch2_do_discards_work(struct work_struct *work)
 
 void bch2_do_discards(struct bch_fs *c)
 {
-       if (percpu_ref_tryget(&c->writes) &&
+       if (percpu_ref_tryget_live(&c->writes) &&
            !queue_work(system_long_wq, &c->discard_work))
                percpu_ref_put(&c->writes);
 }
@@ -1192,7 +1192,7 @@ static void bch2_do_invalidates_work(struct work_struct *work)
 
 void bch2_do_invalidates(struct bch_fs *c)
 {
-       if (percpu_ref_tryget(&c->writes))
+       if (percpu_ref_tryget_live(&c->writes))
                queue_work(system_long_wq, &c->invalidate_work);
 }
 
index a4f66e7cbb45778c0dfbd83cc2a3031906c01426..eeaea292bd8026976142f9315303880989368427 100644 (file)
@@ -1897,7 +1897,7 @@ void bch2_btree_node_rewrite_async(struct bch_fs *c, struct btree *b)
 {
        struct async_btree_rewrite *a;
 
-       if (!percpu_ref_tryget(&c->writes))
+       if (!percpu_ref_tryget_live(&c->writes))
                return;
 
        a = kmalloc(sizeof(*a), GFP_NOFS);
index 3425e3c007dd6ff93a275ebb7b5b6b447636ae6a..c6fe24f424dedb56ca5604e2d2e93d76b198c7eb 100644 (file)
@@ -1108,7 +1108,7 @@ int __bch2_trans_commit(struct btree_trans *trans)
        }
 
        if (!(trans->flags & BTREE_INSERT_NOCHECK_RW) &&
-           unlikely(!percpu_ref_tryget(&c->writes))) {
+           unlikely(!percpu_ref_tryget_live(&c->writes))) {
                ret = bch2_trans_commit_get_rw_cold(trans);
                if (ret)
                        goto out_reset;
index faabaa64dcdb5dc08079bd1b259260ebfabb339b..6ce352c526f012e38c7359547ffb53a333eca35e 100644 (file)
@@ -939,7 +939,7 @@ static void ec_stripe_create(struct ec_stripe_new *s)
 
        BUG_ON(!s->allocated);
 
-       if (!percpu_ref_tryget(&c->writes))
+       if (!percpu_ref_tryget_live(&c->writes))
                goto err;
 
        ec_generate_ec(&s->new_stripe);
index ad51483ad764ae8647b3818d48c7bba72e8e97a5..c0dda29dabb461e8060c4ab13f3d950d2de9ec1e 100644 (file)
@@ -3105,7 +3105,7 @@ long bch2_fallocate_dispatch(struct file *file, int mode,
        struct bch_fs *c = inode->v.i_sb->s_fs_info;
        long ret;
 
-       if (!percpu_ref_tryget(&c->writes))
+       if (!percpu_ref_tryget_live(&c->writes))
                return -EROFS;
 
        inode_lock(&inode->v);
index 91789185c78ef0f4155d0da73a66c6d326d851a5..ca72a31da5025a572b2e83419461b824f7b7a64c 100644 (file)
@@ -1397,7 +1397,7 @@ void bch2_write(struct closure *cl)
        }
 
        if (c->opts.nochanges ||
-           !percpu_ref_tryget(&c->writes)) {
+           !percpu_ref_tryget_live(&c->writes)) {
                op->error = -EROFS;
                goto err;
        }
@@ -1527,7 +1527,7 @@ static struct promote_op *__promote_alloc(struct bch_fs *c,
        unsigned pages = DIV_ROUND_UP(sectors, PAGE_SECTORS);
        int ret;
 
-       if (!percpu_ref_tryget(&c->writes))
+       if (!percpu_ref_tryget_live(&c->writes))
                return NULL;
 
        op = kzalloc(sizeof(*op) + sizeof(struct bio_vec) * pages, GFP_NOIO);
index 4e589c02a93bd2ce4f2f83c82c76fe7ea060c843..2038e3502d8c1434ea99102a101b6278ce2d6f0d 100644 (file)
@@ -282,7 +282,7 @@ s64 bch2_remap_range(struct bch_fs *c,
        u32 dst_snapshot, src_snapshot;
        int ret = 0, ret2 = 0;
 
-       if (!percpu_ref_tryget(&c->writes))
+       if (!percpu_ref_tryget_live(&c->writes))
                return -EROFS;
 
        bch2_check_set_feature(c, BCH_FEATURE_reflink);
index 8f41a06c3e11242c2688feb1566533323ee58dc0..60b60de83f3e5cf3188e7309a5c2cde519541e5f 100644 (file)
@@ -729,7 +729,7 @@ err:
 
 static void bch2_delete_dead_snapshots(struct bch_fs *c)
 {
-       if (unlikely(!percpu_ref_tryget(&c->writes)))
+       if (unlikely(!percpu_ref_tryget_live(&c->writes)))
                return;
 
        if (!queue_work(system_long_wq, &c->snapshot_delete_work))
@@ -931,7 +931,7 @@ int bch2_subvolume_wait_for_pagecache_and_delete_hook(struct btree_trans *trans,
        if (ret)
                return ret;
 
-       if (unlikely(!percpu_ref_tryget(&c->writes)))
+       if (unlikely(!percpu_ref_tryget_live(&c->writes)))
                return -EROFS;
 
        if (!queue_work(system_long_wq, &c->snapshot_wait_for_pagecache_and_delete_work))
index 173289c34de0f9a3cb4913efc47a32f467475def..4e2b6285cf3ad155fa91d7996976e9403bb7fa0b 100644 (file)
@@ -676,7 +676,7 @@ STORE(bch2_fs_opts_dir)
         * We don't need to take c->writes for correctness, but it eliminates an
         * unsightly error message in the dmesg log when we're RO:
         */
-       if (unlikely(!percpu_ref_tryget(&c->writes)))
+       if (unlikely(!percpu_ref_tryget_live(&c->writes)))
                return -EROFS;
 
        tmp = kstrdup(buf, GFP_KERNEL);