1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_INODE_H
3 #define _BCACHEFS_INODE_H
7 #include <linux/math64.h>
9 const char *bch2_inode_invalid(const struct bch_fs *, struct bkey_s_c);
10 void bch2_inode_to_text(struct bch_fs *, char *, size_t, struct bkey_s_c);
12 #define bch2_bkey_inode_ops (struct bkey_ops) { \
13 .key_invalid = bch2_inode_invalid, \
14 .val_to_text = bch2_inode_to_text, \
17 struct bch_inode_unpacked {
23 #define BCH_INODE_FIELD(_name, _bits) u##_bits _name;
25 #undef BCH_INODE_FIELD
28 struct bkey_inode_buf {
29 struct bkey_i_inode inode;
31 #define BCH_INODE_FIELD(_name, _bits) + 8 + _bits / 8
32 u8 _pad[0 + BCH_INODE_FIELDS()];
33 #undef BCH_INODE_FIELD
34 } __attribute__((packed, aligned(8)));
36 void bch2_inode_pack(struct bkey_inode_buf *, const struct bch_inode_unpacked *);
37 int bch2_inode_unpack(struct bkey_s_c_inode, struct bch_inode_unpacked *);
39 void bch2_inode_init(struct bch_fs *, struct bch_inode_unpacked *,
40 uid_t, gid_t, umode_t, dev_t,
41 struct bch_inode_unpacked *);
43 int __bch2_inode_create(struct btree_trans *,
44 struct bch_inode_unpacked *,
46 int bch2_inode_create(struct bch_fs *, struct bch_inode_unpacked *,
49 int bch2_inode_truncate(struct bch_fs *, u64, u64,
50 struct extent_insert_hook *, u64 *);
51 int bch2_inode_rm(struct bch_fs *, u64);
53 int bch2_inode_find_by_inum(struct bch_fs *, u64,
54 struct bch_inode_unpacked *);
56 static inline struct bch_io_opts bch2_inode_opts_get(struct bch_inode_unpacked *inode)
58 struct bch_io_opts ret = { 0 };
60 #define BCH_INODE_OPT(_name, _bits) \
61 if (inode->bi_##_name) \
62 opt_set(ret, _name, inode->bi_##_name - 1);
68 static inline void __bch2_inode_opt_set(struct bch_inode_unpacked *inode,
69 enum bch_opt_id id, u64 v)
72 #define BCH_INODE_OPT(_name, ...) \
74 inode->bi_##_name = v; \
83 static inline void bch2_inode_opt_set(struct bch_inode_unpacked *inode,
84 enum bch_opt_id id, u64 v)
86 return __bch2_inode_opt_set(inode, id, v + 1);
89 static inline void bch2_inode_opt_clear(struct bch_inode_unpacked *inode,
92 return __bch2_inode_opt_set(inode, id, 0);
95 #ifdef CONFIG_BCACHEFS_DEBUG
96 void bch2_inode_pack_test(void);
98 static inline void bch2_inode_pack_test(void) {}
101 #endif /* _BCACHEFS_INODE_H */