180 lines
5.4 KiB
Diff
180 lines
5.4 KiB
Diff
From a5fe1d1656b8471db2cd0854062977245aadd80a Mon Sep 17 00:00:00 2001
|
|
From: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Date: Sat, 19 Oct 2024 21:41:20 -0400
|
|
Subject: [PATCH 047/233] bcachefs: New bch_extent_rebalance fields
|
|
Content-Type: text/plain; charset="utf-8"
|
|
Content-Transfer-Encoding: 8bit
|
|
|
|
- Add more io path options to bch_extent_rebalance
|
|
- For each option, track whether it came from the filesystem or the
|
|
inode
|
|
|
|
This will be used for improved rebalance support for reflinked data.
|
|
|
|
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
|
|
Signed-off-by: Alexander Miroshnichenko <alex@millerson.name>
|
|
---
|
|
fs/bcachefs/extents.c | 65 ++++++++++++++++++++++++++++++------
|
|
fs/bcachefs/extents_format.h | 34 +++++++++++++++++--
|
|
fs/bcachefs/opts.h | 3 +-
|
|
3 files changed, 87 insertions(+), 15 deletions(-)
|
|
|
|
diff --git a/fs/bcachefs/extents.c b/fs/bcachefs/extents.c
|
|
index a134aa5a76bb..467ffed0809e 100644
|
|
--- a/fs/bcachefs/extents.c
|
|
+++ b/fs/bcachefs/extents.c
|
|
@@ -1121,6 +1121,57 @@ void bch2_extent_crc_unpacked_to_text(struct printbuf *out, struct bch_extent_cr
|
|
bch2_prt_compression_type(out, crc->compression_type);
|
|
}
|
|
|
|
+static void bch2_extent_rebalance_to_text(struct printbuf *out, struct bch_fs *c,
|
|
+ const struct bch_extent_rebalance *r)
|
|
+{
|
|
+ prt_str(out, "rebalance:");
|
|
+
|
|
+ prt_printf(out, " replicas=%u", r->data_replicas);
|
|
+ if (r->data_replicas_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+
|
|
+ prt_str(out, " checksum=");
|
|
+ bch2_prt_csum_opt(out, r->data_checksum);
|
|
+ if (r->data_checksum_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+
|
|
+ if (r->background_compression || r->background_compression_from_inode) {
|
|
+ prt_str(out, " background_compression=");
|
|
+ bch2_compression_opt_to_text(out, r->background_compression);
|
|
+
|
|
+ if (r->background_compression_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+ }
|
|
+
|
|
+ if (r->background_target || r->background_target_from_inode) {
|
|
+ prt_str(out, " background_target=");
|
|
+ if (c)
|
|
+ bch2_target_to_text(out, c, r->background_target);
|
|
+ else
|
|
+ prt_printf(out, "%u", r->background_target);
|
|
+
|
|
+ if (r->background_target_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+ }
|
|
+
|
|
+ if (r->promote_target || r->promote_target_from_inode) {
|
|
+ prt_str(out, " promote_target=");
|
|
+ if (c)
|
|
+ bch2_target_to_text(out, c, r->promote_target);
|
|
+ else
|
|
+ prt_printf(out, "%u", r->promote_target);
|
|
+
|
|
+ if (r->promote_target_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+ }
|
|
+
|
|
+ if (r->erasure_code || r->erasure_code_from_inode) {
|
|
+ prt_printf(out, " ec=%u", r->erasure_code);
|
|
+ if (r->erasure_code_from_inode)
|
|
+ prt_str(out, " (inode)");
|
|
+ }
|
|
+}
|
|
+
|
|
void bch2_bkey_ptrs_to_text(struct printbuf *out, struct bch_fs *c,
|
|
struct bkey_s_c k)
|
|
{
|
|
@@ -1156,18 +1207,10 @@ void bch2_bkey_ptrs_to_text(struct printbuf *out, struct bch_fs *c,
|
|
(u64) ec->idx, ec->block);
|
|
break;
|
|
}
|
|
- case BCH_EXTENT_ENTRY_rebalance: {
|
|
- const struct bch_extent_rebalance *r = &entry->rebalance;
|
|
-
|
|
- prt_str(out, "rebalance: target ");
|
|
- if (c)
|
|
- bch2_target_to_text(out, c, r->background_target);
|
|
- else
|
|
- prt_printf(out, "%u", r->background_target);
|
|
- prt_str(out, " compression ");
|
|
- bch2_compression_opt_to_text(out, r->background_compression);
|
|
+ case BCH_EXTENT_ENTRY_rebalance:
|
|
+ bch2_extent_rebalance_to_text(out, c, &entry->rebalance);
|
|
break;
|
|
- }
|
|
+
|
|
default:
|
|
prt_printf(out, "(invalid extent entry %.16llx)", *((u64 *) entry));
|
|
return;
|
|
diff --git a/fs/bcachefs/extents_format.h b/fs/bcachefs/extents_format.h
|
|
index 520697f236c0..222eed6b46d8 100644
|
|
--- a/fs/bcachefs/extents_format.h
|
|
+++ b/fs/bcachefs/extents_format.h
|
|
@@ -204,21 +204,49 @@ struct bch_extent_stripe_ptr {
|
|
struct bch_extent_rebalance {
|
|
#if defined(__LITTLE_ENDIAN_BITFIELD)
|
|
__u64 type:6,
|
|
- unused:34,
|
|
+ unused:3,
|
|
+
|
|
+ promote_target_from_inode:1,
|
|
+ erasure_code_from_inode:1,
|
|
+ data_checksum_from_inode:1,
|
|
+ background_compression_from_inode:1,
|
|
+ data_replicas_from_inode:1,
|
|
+ background_target_from_inode:1,
|
|
+
|
|
+ promote_target:16,
|
|
+ erasure_code:1,
|
|
+ data_checksum:4,
|
|
+ data_replicas:4,
|
|
background_compression:8, /* enum bch_compression_opt */
|
|
background_target:16;
|
|
#elif defined (__BIG_ENDIAN_BITFIELD)
|
|
__u64 background_target:16,
|
|
background_compression:8,
|
|
- unused:34,
|
|
+ data_replicas:4,
|
|
+ data_checksum:4,
|
|
+ erasure_code:1,
|
|
+ promote_target:16,
|
|
+
|
|
+ background_target_from_inode:1,
|
|
+ data_replicas_from_inode:1,
|
|
+ background_compression_from_inode:1,
|
|
+ data_checksum_from_inode:1,
|
|
+ erasure_code_from_inode:1,
|
|
+ promote_target_from_inode:1,
|
|
+
|
|
+ unused:3,
|
|
type:6;
|
|
#endif
|
|
};
|
|
|
|
/* subset of BCH_INODE_OPTS */
|
|
#define BCH_REBALANCE_OPTS() \
|
|
+ x(data_checksum) \
|
|
x(background_compression) \
|
|
- x(background_target)
|
|
+ x(data_replicas) \
|
|
+ x(promote_target) \
|
|
+ x(background_target) \
|
|
+ x(erasure_code)
|
|
|
|
union bch_extent_entry {
|
|
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ || __BITS_PER_LONG == 64
|
|
diff --git a/fs/bcachefs/opts.h b/fs/bcachefs/opts.h
|
|
index f6dc0628b025..39cdc185fa73 100644
|
|
--- a/fs/bcachefs/opts.h
|
|
+++ b/fs/bcachefs/opts.h
|
|
@@ -665,7 +665,8 @@ static inline struct bch_extent_rebalance io_opts_to_rebalance_opts(struct bch_i
|
|
return (struct bch_extent_rebalance) {
|
|
.type = BIT(BCH_EXTENT_ENTRY_rebalance),
|
|
#define x(_name) \
|
|
- ._name = opts->_name,
|
|
+ ._name = opts->_name, \
|
|
+ ._name##_from_inode = opts->_name##_from_inode,
|
|
BCH_REBALANCE_OPTS()
|
|
#undef x
|
|
};
|
|
--
|
|
2.45.2
|
|
|