summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2019-03-28 10:08:40 +0300
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-23 00:08:19 +0300
commit05b3d5ac1f4ea75defa4e133ca23a953b4a80c23 (patch)
tree5ba044e865c8d31001952cdd30d0c45c9de53100
parentf13f5a8c836f55c6b7b0a58cb26245282f67527c (diff)
downloadlinux-05b3d5ac1f4ea75defa4e133ca23a953b4a80c23.tar.xz
bcachefs: simplify gc locking a bit
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
-rw-r--r--fs/bcachefs/btree_gc.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c
index aa8ac7d661ee..5abd7ac5bb78 100644
--- a/fs/bcachefs/btree_gc.c
+++ b/fs/bcachefs/btree_gc.c
@@ -480,12 +480,8 @@ static void bch2_gc_free(struct bch_fs *c)
ca->usage[1] = NULL;
}
- percpu_down_write(&c->mark_lock);
-
free_percpu(c->usage[1]);
c->usage[1] = NULL;
-
- percpu_up_write(&c->mark_lock);
}
static void bch2_gc_done(struct bch_fs *c, bool initial)
@@ -526,8 +522,6 @@ static void bch2_gc_done(struct bch_fs *c, bool initial)
#define copy_fs_field(_f, _msg, ...) \
copy_field(_f, "fs has wrong " _msg, ##__VA_ARGS__)
- percpu_down_write(&c->mark_lock);
-
{
struct genradix_iter dst_iter = genradix_iter_init(&c->stripes[0], 0);
struct genradix_iter src_iter = genradix_iter_init(&c->stripes[1], 0);
@@ -635,8 +629,6 @@ static void bch2_gc_done(struct bch_fs *c, bool initial)
}
}
- percpu_up_write(&c->mark_lock);
-
#undef copy_fs_field
#undef copy_dev_field
#undef copy_bucket_field
@@ -649,8 +641,6 @@ static int bch2_gc_start(struct bch_fs *c)
struct bch_dev *ca;
unsigned i;
- percpu_down_write(&c->mark_lock);
-
/*
* indicate to stripe code that we need to allocate for the gc stripes
* radix tree, too
@@ -661,8 +651,6 @@ static int bch2_gc_start(struct bch_fs *c)
c->usage[1] = __alloc_percpu_gfp(fs_usage_u64s(c) * sizeof(u64),
sizeof(u64), GFP_KERNEL);
- percpu_up_write(&c->mark_lock);
-
if (!c->usage[1])
return -ENOMEM;
@@ -685,8 +673,6 @@ static int bch2_gc_start(struct bch_fs *c)
}
}
- percpu_down_write(&c->mark_lock);
-
for_each_member_device(ca, c, i) {
struct bucket_array *dst = __bucket_array(ca, 1);
struct bucket_array *src = __bucket_array(ca, 0);
@@ -703,8 +689,6 @@ static int bch2_gc_start(struct bch_fs *c)
}
};
- percpu_up_write(&c->mark_lock);
-
return bch2_ec_mem_alloc(c, true);
}
@@ -737,7 +721,10 @@ int bch2_gc(struct bch_fs *c, struct list_head *journal, bool initial)
down_write(&c->gc_lock);
again:
+ percpu_down_write(&c->mark_lock);
ret = bch2_gc_start(c);
+ percpu_up_write(&c->mark_lock);
+
if (ret)
goto out;
@@ -762,7 +749,11 @@ out:
bch_info(c, "Fixed gens, restarting mark and sweep:");
clear_bit(BCH_FS_FIXED_GENS, &c->flags);
__gc_pos_set(c, gc_phase(GC_PHASE_NOT_RUNNING));
+
+ percpu_down_write(&c->mark_lock);
bch2_gc_free(c);
+ percpu_up_write(&c->mark_lock);
+
goto again;
}
@@ -770,6 +761,8 @@ out:
ret = -EINVAL;
}
+ percpu_down_write(&c->mark_lock);
+
if (!ret)
bch2_gc_done(c, initial);
@@ -777,6 +770,8 @@ out:
__gc_pos_set(c, gc_phase(GC_PHASE_NOT_RUNNING));
bch2_gc_free(c);
+ percpu_up_write(&c->mark_lock);
+
up_write(&c->gc_lock);
trace_gc_end(c);