Commit 2d21d112 authored by Kent Overstreet's avatar Kent Overstreet
Browse files

bcachefs: New bch_extent_rebalance fields



- 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: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent ed13bb57
Loading
Loading
Loading
Loading
+54 −11
Original line number Diff line number Diff line
@@ -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;
+31 −3
Original line number Diff line number Diff line
@@ -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
+2 −1
Original line number Diff line number Diff line
@@ -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
	};