/* SPDX-License-Identifier: GPL-2.0 */ #ifndef _BCACHEFS_REFLINK_FORMAT_H #define _BCACHEFS_REFLINK_FORMAT_H struct bch_reflink_p { struct bch_val v; __le64 idx; /* * A reflink pointer might point to an indirect extent which is then * later split (by copygc or rebalance). If we only pointed to part of * the original indirect extent, and then one of the fragments is * outside the range we point to, we'd leak a refcount: so when creating * reflink pointers, we need to store pad values to remember the full * range we were taking a reference on. */ __le32 front_pad; __le32 back_pad; } __packed __aligned(8); struct bch_reflink_v { struct bch_val v; __le64 refcount; union bch_extent_entry start[0]; __u64 _data[]; } __packed __aligned(8); struct bch_indirect_inline_data { struct bch_val v; __le64 refcount; u8 data[]; }; #endif /* _BCACHEFS_REFLINK_FORMAT_H */