bcachefs: Track nr_inodes with the key marking machinery
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 29 Nov 2018 07:14:31 +0000 (02:14 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:12 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/bcachefs.h
fs/bcachefs/btree_gc.c
fs/bcachefs/btree_types.h
fs/bcachefs/buckets.c
fs/bcachefs/buckets_types.h
fs/bcachefs/fs.c
fs/bcachefs/fsck.c
fs/bcachefs/recovery.c

index cd2fff851bbe1b26df6ce9c1a6ce8a524ce3fb10..d774ddf6cbb30c376dfe154f6e804bead878c3f2 100644 (file)
@@ -721,9 +721,6 @@ struct bch_fs {
        struct mutex            fsck_error_lock;
        bool                    fsck_alloc_err;
 
-       /* FILESYSTEM */
-       atomic_long_t           nr_inodes;
-
        /* QUOTAS */
        struct bch_memquota_type quotas[QTYP_NR];
 
index 85fc181e76a81de7253e0b06f0702008ea30b8f5..65cf64f2252231f009363ed36f97f9f68c53bbce 100644 (file)
@@ -685,6 +685,7 @@ static void bch2_gc_done(struct bch_fs *c, bool initial)
                for (b = 0; b < BCH_DATA_NR; b++)
                        copy_fs_field(buckets[b],
                                      "buckets[%s]", bch2_data_types[b]);
+               copy_fs_field(nr_inodes, "nr_inodes");
 
                for_each_possible_cpu(cpu) {
                        p = per_cpu_ptr(c->usage[0], cpu);
index b4a826369a57b3c8d41b87d2a2c0a9255dd681bc..f34f340ff034ebb386ca7f7fdeb9c54006c7cfee 100644 (file)
@@ -439,6 +439,7 @@ static inline bool btree_node_type_needs_gc(enum btree_node_type type)
        switch (type) {
        case BKEY_TYPE_BTREE:
        case BKEY_TYPE_EXTENTS:
+       case BKEY_TYPE_INODES:
        case BKEY_TYPE_EC:
                return true;
        default:
index d08e95020cef4b756369ca17aed55ec9bb24d998..8cbc1c5c8af584606b88a522d9a02083fbe5a78b 100644 (file)
@@ -862,6 +862,12 @@ static int __bch2_mark_key(struct bch_fs *c, struct bkey_s_c k,
                ret = bch2_mark_stripe(c, k, inserting,
                                       stats, journal_seq, flags, gc);
                break;
+       case KEY_TYPE_alloc:
+               if (inserting)
+                       stats->nr_inodes++;
+               else
+                       stats->nr_inodes--;
+               break;
        case KEY_TYPE_reservation: {
                unsigned replicas = bkey_s_c_to_reservation(k).v->nr_replicas;
 
index 0187f465d23f52d24718f6eef8645ae855e581d8..9f7812c69bbc000b68878fb6e861d171f528561e 100644 (file)
@@ -73,6 +73,8 @@ struct bch_fs_usage {
 
        u64                     buckets[BCH_DATA_NR];
 
+       u64                     nr_inodes;
+
        /* fields starting here aren't touched by gc: */
        u64                     online_reserved;
        u64                     available_cache;
index 93e1f3aaacd42d782713877fc4fe2f25595b7979..db3c5962ad313b17ab995941b3b9e39572c58030 100644 (file)
@@ -400,8 +400,6 @@ retry:
        if (unlikely(ret))
                goto err_trans;
 
-       atomic_long_inc(&c->nr_inodes);
-
        if (!tmpfile) {
                bch2_inode_update_after_write(c, dir, &dir_u,
                                              ATTR_MTIME|ATTR_CTIME);
@@ -1418,9 +1416,6 @@ static void bch2_evict_inode(struct inode *vinode)
                bch2_quota_acct(c, inode->ei_qid, Q_INO, -1,
                                KEY_TYPE_QUOTA_WARN);
                bch2_inode_rm(c, inode->v.i_ino);
-
-               WARN_ONCE(atomic_long_dec_return(&c->nr_inodes) < 0,
-                         "nr_inodes < 0");
        }
 }
 
@@ -1439,7 +1434,7 @@ static int bch2_statfs(struct dentry *dentry, struct kstatfs *buf)
        buf->f_blocks   = (c->capacity - hidden_metadata) >> shift;
        buf->f_bfree    = (c->capacity - bch2_fs_sectors_used(c, usage)) >> shift;
        buf->f_bavail   = buf->f_bfree;
-       buf->f_files    = atomic_long_read(&c->nr_inodes);
+       buf->f_files    = usage.nr_inodes;
        buf->f_ffree    = U64_MAX;
 
        fsid = le64_to_cpup((void *) c->sb.user_uuid.b) ^
index 57ab8f088415484ab691ff0295218bed4c779368..810e1c3f4c4971959eababa225fa5de27b7becf3 100644 (file)
@@ -1314,9 +1314,6 @@ peek_nlinks:      link = genradix_iter_peek(&nlinks_iter, links);
                        BUG_ON(ret == -EINTR);
                        if (ret)
                                break;
-
-                       if (link->count)
-                               atomic_long_inc(&c->nr_inodes);
                } else {
                        /* Should have been caught by dirents pass: */
                        need_fsck_err_on(link->count, c,
@@ -1380,7 +1377,6 @@ static int check_inodes_fast(struct bch_fs *c)
        struct btree_iter iter;
        struct bkey_s_c k;
        struct bkey_s_c_inode inode;
-       unsigned long nr_inodes = 0;
        int ret = 0;
 
        for_each_btree_key(&iter, c, BTREE_ID_INODES, POS_MIN, 0, k) {
@@ -1389,9 +1385,6 @@ static int check_inodes_fast(struct bch_fs *c)
 
                inode = bkey_s_c_to_inode(k);
 
-               if (!(inode.v->bi_flags & BCH_INODE_UNLINKED))
-                       nr_inodes++;
-
                if (inode.v->bi_flags &
                    (BCH_INODE_I_SIZE_DIRTY|
                     BCH_INODE_I_SECTORS_DIRTY|
@@ -1405,7 +1398,6 @@ static int check_inodes_fast(struct bch_fs *c)
                                break;
                }
        }
-       atomic_long_set(&c->nr_inodes, nr_inodes);
 fsck_err:
        return bch2_btree_iter_unlock(&iter) ?: ret;
 }
index 17277060629447af936f07c7bc17dcc597c0695f..2d0736caa5efd006df19b9bfce5c2cd11a156ee8 100644 (file)
@@ -375,8 +375,6 @@ int bch2_fs_initialize(struct bch_fs *c)
        if (ret)
                goto err;
 
-       atomic_long_set(&c->nr_inodes, 2);
-
        if (enabled_qtypes(c)) {
                ret = bch2_fs_quota_read(c);
                if (ret)