Merge tag 'bcachefs-2023-11-5' of https://evilpiepirate.org/git/bcachefs
[linux-2.6-microblaze.git] / fs / bcachefs / btree_key_cache.c
index 3304bff..9b78f78 100644 (file)
@@ -834,8 +834,7 @@ void bch2_btree_key_cache_drop(struct btree_trans *trans,
 static unsigned long bch2_btree_key_cache_scan(struct shrinker *shrink,
                                           struct shrink_control *sc)
 {
-       struct bch_fs *c = container_of(shrink, struct bch_fs,
-                                       btree_key_cache.shrink);
+       struct bch_fs *c = shrink->private_data;
        struct btree_key_cache *bc = &c->btree_key_cache;
        struct bucket_table *tbl;
        struct bkey_cached *ck, *t;
@@ -932,8 +931,7 @@ out:
 static unsigned long bch2_btree_key_cache_count(struct shrinker *shrink,
                                            struct shrink_control *sc)
 {
-       struct bch_fs *c = container_of(shrink, struct bch_fs,
-                                       btree_key_cache.shrink);
+       struct bch_fs *c = shrink->private_data;
        struct btree_key_cache *bc = &c->btree_key_cache;
        long nr = atomic_long_read(&bc->nr_keys) -
                atomic_long_read(&bc->nr_dirty);
@@ -953,7 +951,7 @@ void bch2_fs_btree_key_cache_exit(struct btree_key_cache *bc)
        int cpu;
 #endif
 
-       unregister_shrinker(&bc->shrink);
+       shrinker_free(bc->shrink);
 
        mutex_lock(&bc->lock);
 
@@ -1027,6 +1025,7 @@ void bch2_fs_btree_key_cache_init_early(struct btree_key_cache *c)
 int bch2_fs_btree_key_cache_init(struct btree_key_cache *bc)
 {
        struct bch_fs *c = container_of(bc, struct bch_fs, btree_key_cache);
+       struct shrinker *shrink;
 
 #ifdef __KERNEL__
        bc->pcpu_freed = alloc_percpu(struct btree_key_cache_freelist);
@@ -1039,11 +1038,15 @@ int bch2_fs_btree_key_cache_init(struct btree_key_cache *bc)
 
        bc->table_init_done = true;
 
-       bc->shrink.seeks                = 0;
-       bc->shrink.count_objects        = bch2_btree_key_cache_count;
-       bc->shrink.scan_objects         = bch2_btree_key_cache_scan;
-       if (register_shrinker(&bc->shrink, "%s-btree_key_cache", c->name))
+       shrink = shrinker_alloc(0, "%s-btree_key_cache", c->name);
+       if (!shrink)
                return -BCH_ERR_ENOMEM_fs_btree_cache_init;
+       bc->shrink = shrink;
+       shrink->seeks           = 0;
+       shrink->count_objects   = bch2_btree_key_cache_count;
+       shrink->scan_objects    = bch2_btree_key_cache_scan;
+       shrink->private_data    = c;
+       shrinker_register(shrink);
        return 0;
 }