summaryrefslogtreecommitdiffstats
path: root/fs/bcachefs/inode.h
blob: bd6166c40e6f9c9a030278b57f9bd31a7d726cd0 (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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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 */