Skip to content

Commit

Permalink
bcachefs: reflink_format.h
Browse files Browse the repository at this point in the history
Signed-off-by: Kent Overstreet <[email protected]>
  • Loading branch information
Kent Overstreet committed Jan 21, 2024
1 parent b2fa1b6 commit 8d52ba6
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 47 deletions.
49 changes: 2 additions & 47 deletions fs/bcachefs/bcachefs_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -423,14 +423,6 @@ struct bch_csum {
__le64 hi;
} __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_val v;
__u8 btree_id;
Expand All @@ -441,45 +433,6 @@ struct bch_backpointer {
struct bpos pos;
} __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: */

struct bch_lru {
Expand Down Expand Up @@ -542,6 +495,8 @@ struct bch_sb_field {
x(downgrade, 14)

#include "alloc_background_format.h"
#include "extents_format.h"
#include "reflink_format.h"
#include "ec_format.h"
#include "inode_format.h"
#include "dirent_format.h"
Expand Down
13 changes: 13 additions & 0 deletions fs/bcachefs/extents_format.h
Original file line number Diff line number Diff line change
Expand Up @@ -279,4 +279,17 @@ struct bch_extent {
#define BKEY_BTREE_PTR_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 */
33 changes: 33 additions & 0 deletions fs/bcachefs/reflink_format.h
Original file line number Diff line number Diff line change
@@ -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 */

0 comments on commit 8d52ba6

Please sign in to comment.