bcachefs: Initial commit
[linux-block.git] / fs / bcachefs / inode.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef _BCACHEFS_INODE_H
3 #define _BCACHEFS_INODE_H
4
5 #include "opts.h"
6
7 #include <linux/math64.h>
8
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);
11
12 #define bch2_bkey_inode_ops (struct bkey_ops) {         \
13         .key_invalid    = bch2_inode_invalid,           \
14         .val_to_text    = bch2_inode_to_text,           \
15 }
16
17 struct bch_inode_unpacked {
18         u64                     bi_inum;
19         __le64                  bi_hash_seed;
20         u32                     bi_flags;
21         u16                     bi_mode;
22
23 #define BCH_INODE_FIELD(_name, _bits)   u##_bits _name;
24         BCH_INODE_FIELDS()
25 #undef  BCH_INODE_FIELD
26 };
27
28 struct bkey_inode_buf {
29         struct bkey_i_inode     inode;
30
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)));
35
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 *);
38
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 *);
42
43 int __bch2_inode_create(struct btree_trans *,
44                         struct bch_inode_unpacked *,
45                         u64, u64, u64 *);
46 int bch2_inode_create(struct bch_fs *, struct bch_inode_unpacked *,
47                       u64, u64, u64 *);
48
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);
52
53 int bch2_inode_find_by_inum(struct bch_fs *, u64,
54                            struct bch_inode_unpacked *);
55
56 static inline struct bch_io_opts bch2_inode_opts_get(struct bch_inode_unpacked *inode)
57 {
58         struct bch_io_opts ret = { 0 };
59
60 #define BCH_INODE_OPT(_name, _bits)                                     \
61         if (inode->bi_##_name)                                          \
62                 opt_set(ret, _name, inode->bi_##_name - 1);
63         BCH_INODE_OPTS()
64 #undef BCH_INODE_OPT
65         return ret;
66 }
67
68 static inline void __bch2_inode_opt_set(struct bch_inode_unpacked *inode,
69                                         enum bch_opt_id id, u64 v)
70 {
71         switch (id) {
72 #define BCH_INODE_OPT(_name, ...)                                       \
73         case Opt_##_name:                                               \
74                 inode->bi_##_name = v;                                  \
75                 break;
76         BCH_INODE_OPTS()
77 #undef BCH_INODE_OPT
78         default:
79                 BUG();
80         }
81 }
82
83 static inline void bch2_inode_opt_set(struct bch_inode_unpacked *inode,
84                                       enum bch_opt_id id, u64 v)
85 {
86         return __bch2_inode_opt_set(inode, id, v + 1);
87 }
88
89 static inline void bch2_inode_opt_clear(struct bch_inode_unpacked *inode,
90                                         enum bch_opt_id id)
91 {
92         return __bch2_inode_opt_set(inode, id, 0);
93 }
94
95 #ifdef CONFIG_BCACHEFS_DEBUG
96 void bch2_inode_pack_test(void);
97 #else
98 static inline void bch2_inode_pack_test(void) {}
99 #endif
100
101 #endif /* _BCACHEFS_INODE_H */