diff options
Diffstat (limited to 'libbcachefs/inode.h')
-rw-r--r-- | libbcachefs/inode.h | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/libbcachefs/inode.h b/libbcachefs/inode.h new file mode 100644 index 00000000..277d4e42 --- /dev/null +++ b/libbcachefs/inode.h @@ -0,0 +1,57 @@ +#ifndef _BCACHE_INODE_H +#define _BCACHE_INODE_H + +#include <linux/math64.h> + +extern const struct bkey_ops bch2_bkey_inode_ops; + +struct bch_inode_unpacked { + u64 inum; + __le64 i_hash_seed; + u32 i_flags; + u16 i_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 +} __packed; + +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); +int bch2_inode_create(struct bch_fs *, struct bkey_i *, 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 *); +int bch2_cached_dev_inode_find_by_uuid(struct bch_fs *, uuid_le *, + struct bkey_i_inode_blockdev *); + +static inline struct timespec bch2_time_to_timespec(struct bch_fs *c, u64 time) +{ + return ns_to_timespec(time * c->sb.time_precision + c->sb.time_base_lo); +} + +static inline u64 timespec_to_bch2_time(struct bch_fs *c, struct timespec ts) +{ + s64 ns = timespec_to_ns(&ts) - c->sb.time_base_lo; + + if (c->sb.time_precision == 1) + return ns; + + return div_s64(ns, c->sb.time_precision); +} + +#endif |