bcachefs: reflink_format.h

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
Kent Overstreet 2024-01-21 02:54:47 -05:00
parent b2fa1b633b
commit 8d52ba60c4
3 changed files with 48 additions and 47 deletions

View File

@ -423,14 +423,6 @@ struct bch_csum {
__le64 hi; __le64 hi;
} __packed __aligned(8); } __packed __aligned(8);
struct bch_reservation {
struct bch_val v;
__le32 generation;
__u8 nr_replicas;
__u8 pad[3];
} __packed __aligned(8);
struct bch_backpointer { struct bch_backpointer {
struct bch_val v; struct bch_val v;
__u8 btree_id; __u8 btree_id;
@ -441,45 +433,6 @@ struct bch_backpointer {
struct bpos pos; struct bpos pos;
} __packed __aligned(8); } __packed __aligned(8);
#include "extents_format.h"
/* Reflink: */
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[];
};
/* Inline data */
struct bch_inline_data {
struct bch_val v;
u8 data[];
};
/* LRU btree: */ /* LRU btree: */
struct bch_lru { struct bch_lru {
@ -542,6 +495,8 @@ struct bch_sb_field {
x(downgrade, 14) x(downgrade, 14)
#include "alloc_background_format.h" #include "alloc_background_format.h"
#include "extents_format.h"
#include "reflink_format.h"
#include "ec_format.h" #include "ec_format.h"
#include "inode_format.h" #include "inode_format.h"
#include "dirent_format.h" #include "dirent_format.h"

View File

@ -279,4 +279,17 @@ struct bch_extent {
#define BKEY_BTREE_PTR_U64s_MAX \ #define BKEY_BTREE_PTR_U64s_MAX \
(BKEY_U64s + BKEY_BTREE_PTR_VAL_U64s_MAX) (BKEY_U64s + BKEY_BTREE_PTR_VAL_U64s_MAX)
struct bch_reservation {
struct bch_val v;
__le32 generation;
__u8 nr_replicas;
__u8 pad[3];
} __packed __aligned(8);
struct bch_inline_data {
struct bch_val v;
u8 data[];
};
#endif /* _BCACHEFS_EXTENTS_FORMAT_H */ #endif /* _BCACHEFS_EXTENTS_FORMAT_H */

View File

@ -0,0 +1,33 @@
/* 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 */