diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2017-03-17 09:18:50 +0300 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@linux.dev> | 2023-10-23 00:08:07 +0300 |
commit | 1c6fdbd8f2465ddfb73a01ec620cbf3d14044e1a (patch) | |
tree | 9192de91a00908ee898bc331ac8b0544d6fc030a /fs/bcachefs/inode.h | |
parent | 0d29a833b7b1800bd2759bbc064b5ada4729caf5 (diff) | |
download | linux-1c6fdbd8f2465ddfb73a01ec620cbf3d14044e1a.tar.xz |
bcachefs: Initial commit
Initially forked from drivers/md/bcache, bcachefs is a new copy-on-write
filesystem with every feature you could possibly want.
Website: https://bcachefs.org
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/inode.h')
-rw-r--r-- | fs/bcachefs/inode.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/fs/bcachefs/inode.h b/fs/bcachefs/inode.h new file mode 100644 index 000000000000..bd6166c40e6f --- /dev/null +++ b/fs/bcachefs/inode.h @@ -0,0 +1,101 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef _BCACHEFS_INODE_H +#define _BCACHEFS_INODE_H + +#include "opts.h" + +#include <linux/math64.h> + +const char *bch2_inode_invalid(const struct bch_fs *, struct bkey_s_c); +void bch2_inode_to_text(struct bch_fs *, char *, size_t, struct bkey_s_c); + +#define bch2_bkey_inode_ops (struct bkey_ops) { \ + .key_invalid = bch2_inode_invalid, \ + .val_to_text = bch2_inode_to_text, \ +} + +struct bch_inode_unpacked { + u64 bi_inum; + __le64 bi_hash_seed; + u32 bi_flags; + u16 bi_mode; + +#define BCH_INODE_FIELD(_name, _bits) u##_bits _name; + BCH_INODE_FIELDS() +#undef BCH_INODE_FIELD +}; + +struct bkey_inode_buf { + struct bkey_i_inode inode; + +#define BCH_INODE_FIELD(_name, _bits) + 8 + _bits / 8 + u8 _pad[0 + BCH_INODE_FIELDS()]; +#undef BCH_INODE_FIELD +} __attribute__((packed, aligned(8))); + +void bch2_inode_pack(struct bkey_inode_buf *, const struct bch_inode_unpacked *); +int bch2_inode_unpack(struct bkey_s_c_inode, struct bch_inode_unpacked *); + +void bch2_inode_init(struct bch_fs *, struct bch_inode_unpacked *, + uid_t, gid_t, umode_t, dev_t, + struct bch_inode_unpacked *); + +int __bch2_inode_create(struct btree_trans *, + struct bch_inode_unpacked *, + u64, u64, u64 *); +int bch2_inode_create(struct bch_fs *, struct bch_inode_unpacked *, + u64, u64, u64 *); + +int bch2_inode_truncate(struct bch_fs *, u64, u64, + struct extent_insert_hook *, u64 *); +int bch2_inode_rm(struct bch_fs *, u64); + +int bch2_inode_find_by_inum(struct bch_fs *, u64, + struct bch_inode_unpacked *); + +static inline struct bch_io_opts bch2_inode_opts_get(struct bch_inode_unpacked *inode) +{ + struct bch_io_opts ret = { 0 }; + +#define BCH_INODE_OPT(_name, _bits) \ + if (inode->bi_##_name) \ + opt_set(ret, _name, inode->bi_##_name - 1); + BCH_INODE_OPTS() +#undef BCH_INODE_OPT + return ret; +} + +static inline void __bch2_inode_opt_set(struct bch_inode_unpacked *inode, + enum bch_opt_id id, u64 v) +{ + switch (id) { +#define BCH_INODE_OPT(_name, ...) \ + case Opt_##_name: \ + inode->bi_##_name = v; \ + break; + BCH_INODE_OPTS() +#undef BCH_INODE_OPT + default: + BUG(); + } +} + +static inline void bch2_inode_opt_set(struct bch_inode_unpacked *inode, + enum bch_opt_id id, u64 v) +{ + return __bch2_inode_opt_set(inode, id, v + 1); +} + +static inline void bch2_inode_opt_clear(struct bch_inode_unpacked *inode, + enum bch_opt_id id) +{ + return __bch2_inode_opt_set(inode, id, 0); +} + +#ifdef CONFIG_BCACHEFS_DEBUG +void bch2_inode_pack_test(void); +#else +static inline void bch2_inode_pack_test(void) {} +#endif + +#endif /* _BCACHEFS_INODE_H */ |