summaryrefslogtreecommitdiff
path: root/libbcachefs/inode.h
blob: 06e2ffdac8f104aa3f9686aef06edd9925f5fa58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#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
};

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);
}

#ifdef CONFIG_BCACHEFS_DEBUG
void bch2_inode_pack_test(void);
#else
static inline void bch2_inode_pack_test(void) {}
#endif

#endif