aboutsummaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-11-29 02:14:31 -0500
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:12 -0400
commitf0cfb963ec0370b021bb21c899b5fdcd020014cf (patch)
treefd9b731954ec2015bae0bea2197e816a662ea4eb /fs
parent26609b619fa2301eb7eb5855a7005d99f8a07a73 (diff)
bcachefs: Track nr_inodes with the key marking machinery
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs')
-rw-r--r--fs/bcachefs/bcachefs.h3
-rw-r--r--fs/bcachefs/btree_gc.c1
-rw-r--r--fs/bcachefs/btree_types.h1
-rw-r--r--fs/bcachefs/buckets.c6
-rw-r--r--fs/bcachefs/buckets_types.h2
-rw-r--r--fs/bcachefs/fs.c7
-rw-r--r--fs/bcachefs/fsck.c8
-rw-r--r--fs/bcachefs/recovery.c2
8 files changed, 11 insertions, 19 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h
index cd2fff851bbe..d774ddf6cbb3 100644
--- a/fs/bcachefs/bcachefs.h
+++ b/fs/bcachefs/bcachefs.h
@@ -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];
diff --git a/fs/bcachefs/btree_gc.c b/fs/bcachefs/btree_gc.c
index 85fc181e76a8..65cf64f22522 100644
--- a/fs/bcachefs/btree_gc.c
+++ b/fs/bcachefs/btree_gc.c
@@ -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);
diff --git a/fs/bcachefs/btree_types.h b/fs/bcachefs/btree_types.h
index b4a826369a57..f34f340ff034 100644
--- a/fs/bcachefs/btree_types.h
+++ b/fs/bcachefs/btree_types.h
@@ -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:
diff --git a/fs/bcachefs/buckets.c b/fs/bcachefs/buckets.c
index d08e95020cef..8cbc1c5c8af5 100644
--- a/fs/bcachefs/buckets.c
+++ b/fs/bcachefs/buckets.c
@@ -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;
diff --git a/fs/bcachefs/buckets_types.h b/fs/bcachefs/buckets_types.h
index 0187f465d23f..9f7812c69bbc 100644
--- a/fs/bcachefs/buckets_types.h
+++ b/fs/bcachefs/buckets_types.h
@@ -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;
diff --git a/fs/bcachefs/fs.c b/fs/bcachefs/fs.c
index 93e1f3aaacd4..db3c5962ad31 100644
--- a/fs/bcachefs/fs.c
+++ b/fs/bcachefs/fs.c
@@ -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) ^
diff --git a/fs/bcachefs/fsck.c b/fs/bcachefs/fsck.c
index 57ab8f088415..810e1c3f4c49 100644
--- a/fs/bcachefs/fsck.c
+++ b/fs/bcachefs/fsck.c
@@ -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;
}
diff --git a/fs/bcachefs/recovery.c b/fs/bcachefs/recovery.c
index 172770606294..2d0736caa5ef 100644
--- a/fs/bcachefs/recovery.c
+++ b/fs/bcachefs/recovery.c
@@ -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)