diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-11-29 02:14:31 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-12-27 11:38:34 -0500 |
commit | 917826ea208cbe991fe98a49d56cf33bd7600c50 (patch) | |
tree | 9eed9a149f285423e918ef7f01766be732a5a29f | |
parent | 925050bb88c11a66d367fc27bd326a4a68826d9d (diff) |
bcachefs: Track nr_inodes with the key marking machinery
-rw-r--r-- | fs/bcachefs/bcachefs.h | 3 | ||||
-rw-r--r-- | fs/bcachefs/btree_gc.c | 1 | ||||
-rw-r--r-- | fs/bcachefs/btree_types.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/buckets.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/buckets_types.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/fs.c | 7 | ||||
-rw-r--r-- | fs/bcachefs/fsck.c | 8 | ||||
-rw-r--r-- | fs/bcachefs/recovery.c | 2 |
8 files changed, 11 insertions, 19 deletions
diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index d69da3e58006..51f010e59854 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -718,9 +718,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 c30d1f7b15a3..b82facb808cd 100644 --- a/fs/bcachefs/btree_gc.c +++ b/fs/bcachefs/btree_gc.c @@ -682,6 +682,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 834ed0e74efe..c99af28a9df9 100644 --- a/fs/bcachefs/btree_types.h +++ b/fs/bcachefs/btree_types.h @@ -438,6 +438,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 401ff8250873..c2951482dc8a 100644 --- a/fs/bcachefs/buckets.c +++ b/fs/bcachefs/buckets.c @@ -854,6 +854,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 0b1bd95419ca..225a41059e7c 100644 --- a/fs/bcachefs/buckets_types.h +++ b/fs/bcachefs/buckets_types.h @@ -72,6 +72,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 67b0dd371856..73a5c10354e2 100644 --- a/fs/bcachefs/fs.c +++ b/fs/bcachefs/fs.c @@ -341,8 +341,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); @@ -1333,9 +1331,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"); } } @@ -1354,7 +1349,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 5525af8f6e62..955ab8bec904 100644 --- a/fs/bcachefs/fsck.c +++ b/fs/bcachefs/fsck.c @@ -1313,9 +1313,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, @@ -1379,7 +1376,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) { @@ -1388,9 +1384,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| @@ -1404,7 +1397,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 e9e4a1addd5a..a9fcf0524e11 100644 --- a/fs/bcachefs/recovery.c +++ b/fs/bcachefs/recovery.c @@ -374,8 +374,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) |