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; 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 20struct bch_reflink_v { 21 struct bch_val v; 22 __le64 refcount; 23 union bch_extent_entry start[0]; 24 __u64 _data[]; 25} __packed __aligned(8); 26 27struct bch_indirect_inline_data { 28 struct bch_val v; 29 __le64 refcount; 30 u8 data[]; 31}; 32 33#endif /* _BCACHEFS_REFLINK_FORMAT_H */ 34