Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _BCACHEFS_REFLINK_FORMAT_H
3#define _BCACHEFS_REFLINK_FORMAT_H
4
5struct bch_reflink_p {
6 struct bch_val v;
7 __le64 idx_flags;
8 /*
9 * A reflink pointer might point to an indirect extent which is then
10 * later split (by copygc or rebalance). If we only pointed to part of
11 * the original indirect extent, and then one of the fragments is
12 * outside the range we point to, we'd leak a refcount: so when creating
13 * reflink pointers, we need to store pad values to remember the full
14 * range we were taking a reference on.
15 */
16 __le32 front_pad;
17 __le32 back_pad;
18} __packed __aligned(8);
19
20LE64_BITMASK(REFLINK_P_IDX, struct bch_reflink_p, idx_flags, 0, 56);
21LE64_BITMASK(REFLINK_P_ERROR, struct bch_reflink_p, idx_flags, 56, 57);
22LE64_BITMASK(REFLINK_P_MAY_UPDATE_OPTIONS,
23 struct bch_reflink_p, idx_flags, 57, 58);
24
25struct bch_reflink_v {
26 struct bch_val v;
27 __le64 refcount;
28 union bch_extent_entry start[0];
29 __u64 _data[];
30} __packed __aligned(8);
31
32struct bch_indirect_inline_data {
33 struct bch_val v;
34 __le64 refcount;
35 u8 data[];
36};
37
38#endif /* _BCACHEFS_REFLINK_FORMAT_H */