nr_fields++; \
\
if (inode->_name) { \
- ret = bch2_varint_encode(out, inode->_name); \
+ ret = bch2_varint_encode_fast(out, inode->_name); \
out += ret; \
\
if (_bits > 64) \
#define x(_name, _bits) \
if (fieldnr < INODE_NR_FIELDS(inode.v)) { \
- ret = bch2_varint_decode(in, end, &v[0]); \
+ ret = bch2_varint_decode_fast(in, end, &v[0]); \
if (ret < 0) \
return ret; \
in += ret; \
\
if (_bits > 64) { \
- ret = bch2_varint_decode(in, end, &v[1]); \
+ ret = bch2_varint_decode_fast(in, end, &v[1]); \
if (ret < 0) \
return ret; \
in += ret; \
struct bkey_s_c k;
int ret;
- iter = bch2_trans_get_iter(trans, BTREE_ID_inodes, POS(0, inum),
- BTREE_ITER_CACHED|flags);
- k = bch2_btree_iter_peek_cached(iter);
+ if (trans->c->opts.inodes_use_key_cache)
+ flags |= BTREE_ITER_CACHED;
+
+ iter = bch2_trans_get_iter(trans, BTREE_ID_inodes, POS(0, inum), flags);
+ k = bch2_btree_iter_peek_slot(iter);
ret = bkey_err(k);
if (ret)
goto err;
- ret = k.k->type == KEY_TYPE_inode ? 0 : -EIO;
+ ret = k.k->type == KEY_TYPE_inode ? 0 : -ENOENT;
if (ret)
goto err;
bch2_inode_pack(trans->c, inode_p, inode);
inode_p->inode.k.p.snapshot = iter->snapshot;
- bch2_trans_update(trans, iter, &inode_p->inode.k_i, 0);
- return 0;
+ return bch2_trans_update(trans, iter, &inode_p->inode.k_i, 0);
}
const char *bch2_inode_invalid(const struct bch_fs *c, struct bkey_s_c k)
return NULL;
}
+static void __bch2_inode_unpacked_to_text(struct printbuf *out, struct bch_inode_unpacked *inode)
+{
+ pr_buf(out, "mode %o flags %x ", inode->bi_mode, inode->bi_flags);
+
+#define x(_name, _bits) \
+ pr_buf(out, #_name " %llu ", (u64) inode->_name);
+ BCH_INODE_FIELDS()
+#undef x
+}
+
+void bch2_inode_unpacked_to_text(struct printbuf *out, struct bch_inode_unpacked *inode)
+{
+ pr_buf(out, "inum: %llu ", inode->bi_inum);
+ __bch2_inode_unpacked_to_text(out, inode);
+}
+
void bch2_inode_to_text(struct printbuf *out, struct bch_fs *c,
struct bkey_s_c k)
{
return;
}
- pr_buf(out, "mode: %o ", unpacked.bi_mode);
-
-#define x(_name, _bits) \
- pr_buf(out, #_name ": %llu ", (u64) unpacked._name);
- BCH_INODE_FIELDS()
-#undef x
+ __bch2_inode_unpacked_to_text(out, &unpacked);
}
const char *bch2_inode_generation_invalid(const struct bch_fs *c,
struct btree_iter *bch2_inode_create(struct btree_trans *trans,
struct bch_inode_unpacked *inode_u,
- u32 snapshot)
+ u32 snapshot, u64 cpu)
{
struct bch_fs *c = trans->c;
struct btree_iter *iter = NULL;
struct bkey_s_c k;
u64 min, max, start, pos, *hint;
- int ret;
+ int ret = 0;
+ unsigned bits = (c->opts.inodes_32bit ? 31 : 63);
- u64 cpu = raw_smp_processor_id();
- unsigned bits = (c->opts.inodes_32bit
- ? 31 : 63) - c->inode_shard_bits;
+ if (c->opts.shard_inode_numbers) {
+ bits -= c->inode_shard_bits;
- min = (cpu << bits);
- max = (cpu << bits) | ~(ULLONG_MAX << bits);
+ min = (cpu << bits);
+ max = (cpu << bits) | ~(ULLONG_MAX << bits);
- min = max_t(u64, min, BLOCKDEV_INODE_MAX);
- hint = c->unused_inode_hints + cpu;
+ min = max_t(u64, min, BLOCKDEV_INODE_MAX);
+ hint = c->unused_inode_hints + cpu;
+ } else {
+ min = BLOCKDEV_INODE_MAX;
+ max = ~(ULLONG_MAX << bits);
+ hint = c->unused_inode_hints;
+ }
start = READ_ONCE(*hint);
if (k.k->p.snapshot == snapshot &&
k.k->type != KEY_TYPE_inode &&
!bch2_btree_key_cache_find(c, BTREE_ID_inodes, SPOS(0, pos, snapshot))) {
- bch2_btree_iter_next(iter);
+ bch2_btree_iter_advance(iter);
continue;
}
struct bpos end = POS(inode_nr + 1, 0);
struct bch_inode_unpacked inode_u;
struct bkey_s_c k;
+ unsigned iter_flags = BTREE_ITER_INTENT;
int ret;
- bch2_trans_init(&trans, c, 0, 0);
+ if (cached && c->opts.inodes_use_key_cache)
+ iter_flags |= BTREE_ITER_CACHED;
+
+ bch2_trans_init(&trans, c, 0, 1024);
/*
* If this was a directory, there shouldn't be any real dirents left -
retry:
bch2_trans_begin(&trans);
- if (cached) {
- iter = bch2_trans_get_iter(&trans, BTREE_ID_inodes, POS(0, inode_nr),
- BTREE_ITER_CACHED|BTREE_ITER_INTENT);
- k = bch2_btree_iter_peek_cached(iter);
- } else {
- iter = bch2_trans_get_iter(&trans, BTREE_ID_inodes, POS(0, inode_nr),
- BTREE_ITER_SLOTS|BTREE_ITER_INTENT);
- k = bch2_btree_iter_peek_slot(iter);
- }
+ iter = bch2_trans_get_iter(&trans, BTREE_ID_inodes,
+ POS(0, inode_nr), iter_flags);
+ k = bch2_btree_iter_peek_slot(iter);
ret = bkey_err(k);
if (ret)
delete.k.p = iter->pos;
delete.v.bi_generation = cpu_to_le32(inode_u.bi_generation + 1);
- bch2_trans_update(&trans, iter, &delete.k_i, 0);
-
- ret = bch2_trans_commit(&trans, NULL, NULL,
+ ret = bch2_trans_update(&trans, iter, &delete.k_i, 0) ?:
+ bch2_trans_commit(&trans, NULL, NULL,
BTREE_INSERT_NOFAIL);
err:
bch2_trans_iter_put(&trans, iter);
return ret;
}
-int __bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
- struct bch_inode_unpacked *inode,
- unsigned flags)
+static int bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
+ struct bch_inode_unpacked *inode)
{
struct btree_iter *iter;
- struct bkey_s_c k;
int ret;
- iter = bch2_trans_get_iter(trans, BTREE_ID_inodes,
- POS(0, inode_nr), flags);
- k = (flags & BTREE_ITER_TYPE) == BTREE_ITER_CACHED
- ? bch2_btree_iter_peek_cached(iter)
- : bch2_btree_iter_peek_slot(iter);
- ret = bkey_err(k);
- if (ret)
- goto err;
-
- ret = k.k->type == KEY_TYPE_inode
- ? bch2_inode_unpack(bkey_s_c_to_inode(k), inode)
- : -ENOENT;
-err:
+ iter = bch2_inode_peek(trans, inode, inode_nr, 0);
+ ret = PTR_ERR_OR_ZERO(iter);
bch2_trans_iter_put(trans, iter);
return ret;
}
-int bch2_inode_find_by_inum_trans(struct btree_trans *trans, u64 inode_nr,
- struct bch_inode_unpacked *inode)
-{
- return __bch2_inode_find_by_inum_trans(trans, inode_nr,
- inode, BTREE_ITER_CACHED);
-
-}
-
int bch2_inode_find_by_inum(struct bch_fs *c, u64 inode_nr,
struct bch_inode_unpacked *inode)
{