Skip to content

Implement dynamic gang header sizes #17004

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions cmd/zdb/zdb.c
Original file line number Diff line number Diff line change
Expand Up @@ -8588,9 +8588,9 @@ zdb_dump_indirect(blkptr_t *bp, int nbps, int flags)
}

static void
zdb_dump_gbh(void *buf, int flags)
zdb_dump_gbh(void *buf, uint64_t size, int flags)
{
zdb_dump_indirect((blkptr_t *)buf, SPA_GBH_NBLKPTRS, flags);
zdb_dump_indirect((blkptr_t *)buf, gbh_nblkptrs(size), flags);
}

static void
Expand Down Expand Up @@ -9073,7 +9073,7 @@ zdb_read_block(char *thing, spa_t *spa)
zdb_dump_indirect((blkptr_t *)buf,
orig_lsize / sizeof (blkptr_t), flags);
else if (flags & ZDB_FLAG_GBH)
zdb_dump_gbh(buf, flags);
zdb_dump_gbh(buf, lsize, flags);
else
zdb_dump_block(thing, buf, lsize, flags);

Expand Down
8 changes: 7 additions & 1 deletion include/sys/metaslab.h
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ extern "C" {

typedef struct metaslab_ops {
const char *msop_name;
uint64_t (*msop_alloc)(metaslab_t *, uint64_t);
uint64_t (*msop_alloc)(metaslab_t *, uint64_t, uint64_t, uint64_t *);
} metaslab_ops_t;


Expand Down Expand Up @@ -82,6 +82,9 @@ uint64_t metaslab_largest_allocatable(metaslab_t *);

int metaslab_alloc(spa_t *, metaslab_class_t *, uint64_t, blkptr_t *, int,
uint64_t, blkptr_t *, int, zio_alloc_list_t *, int, const void *);
int metaslab_alloc_range(spa_t *, metaslab_class_t *, uint64_t, uint64_t,
blkptr_t *, int, uint64_t, blkptr_t *, int, zio_alloc_list_t *,
int, const void *, uint64_t *);
int metaslab_alloc_dva(spa_t *, metaslab_class_t *, uint64_t,
dva_t *, int, dva_t *, uint64_t, int, zio_alloc_list_t *, int);
void metaslab_free(spa_t *, const blkptr_t *, uint64_t, boolean_t);
Expand All @@ -95,6 +98,7 @@ void metaslab_check_free(spa_t *, const blkptr_t *);

void metaslab_stat_init(void);
void metaslab_stat_fini(void);
void metaslab_trace_move(zio_alloc_list_t *, zio_alloc_list_t *);
void metaslab_trace_init(zio_alloc_list_t *);
void metaslab_trace_fini(zio_alloc_list_t *);

Expand Down Expand Up @@ -127,6 +131,8 @@ uint64_t metaslab_group_get_space(metaslab_group_t *);
void metaslab_group_histogram_verify(metaslab_group_t *);
uint64_t metaslab_group_fragmentation(metaslab_group_t *);
void metaslab_group_histogram_remove(metaslab_group_t *, metaslab_t *);
void metaslab_group_alloc_increment_all(spa_t *, blkptr_t *, int, int,
uint64_t, const void *);
void metaslab_group_alloc_decrement(spa_t *, uint64_t, int, int, uint64_t,
const void *);
void metaslab_recalculate_weight_and_sort(metaslab_t *);
Expand Down
4 changes: 3 additions & 1 deletion include/sys/vdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,8 @@ extern void vdev_space_update(vdev_t *vd,

extern int64_t vdev_deflated_space(vdev_t *vd, int64_t space);

extern uint64_t vdev_asize_to_psize_txg(vdev_t *vd, uint64_t asize,
uint64_t txg);
extern uint64_t vdev_psize_to_asize_txg(vdev_t *vd, uint64_t psize,
uint64_t txg);
extern uint64_t vdev_psize_to_asize(vdev_t *vd, uint64_t psize);
Expand All @@ -146,7 +148,7 @@ extern uint64_t vdev_psize_to_asize(vdev_t *vd, uint64_t psize);
static inline uint64_t
vdev_gang_header_asize(vdev_t *vd)
{
return (vdev_psize_to_asize_txg(vd, SPA_GANGBLOCKSIZE, 0));
return (vdev_psize_to_asize_txg(vd, SPA_OLD_GANGBLOCKSIZE, 0));
}

extern int vdev_fault(spa_t *spa, uint64_t guid, vdev_aux_t aux);
Expand Down
2 changes: 1 addition & 1 deletion include/sys/vdev_draid.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ extern int vdev_draid_generate_perms(const draid_map_t *, uint8_t **);
*/
extern boolean_t vdev_draid_readable(vdev_t *, uint64_t);
extern boolean_t vdev_draid_missing(vdev_t *, uint64_t, uint64_t, uint64_t);
extern uint64_t vdev_draid_asize_to_psize(vdev_t *, uint64_t);
extern uint64_t vdev_draid_asize_to_psize(vdev_t *, uint64_t, uint64_t);
extern void vdev_draid_map_alloc_empty(zio_t *, struct raidz_row *);
extern int vdev_draid_map_verify_empty(zio_t *, struct raidz_row *);
extern nvlist_t *vdev_draid_read_config_spare(vdev_t *);
Expand Down
4 changes: 3 additions & 1 deletion include/sys/vdev_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ typedef const struct vdev_ops {
vdev_fini_func_t *vdev_op_fini;
vdev_open_func_t *vdev_op_open;
vdev_close_func_t *vdev_op_close;
vdev_asize_func_t *vdev_op_asize;
vdev_asize_func_t *vdev_op_psize_to_asize;
vdev_asize_func_t *vdev_op_asize_to_psize;
vdev_min_asize_func_t *vdev_op_min_asize;
vdev_min_alloc_func_t *vdev_op_min_alloc;
vdev_io_start_func_t *vdev_op_io_start;
Expand Down Expand Up @@ -615,6 +616,7 @@ extern vdev_ops_t vdev_indirect_ops;
*/
extern void vdev_default_xlate(vdev_t *vd, const zfs_range_seg64_t *logical_rs,
zfs_range_seg64_t *physical_rs, zfs_range_seg64_t *remain_rs);
extern uint64_t vdev_default_psize(vdev_t *vd, uint64_t asize, uint64_t txg);
extern uint64_t vdev_default_asize(vdev_t *vd, uint64_t psize, uint64_t txg);
extern uint64_t vdev_default_min_asize(vdev_t *vd);
extern uint64_t vdev_get_min_asize(vdev_t *vd);
Expand Down
52 changes: 37 additions & 15 deletions include/sys/zio.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,19 +61,38 @@ typedef struct zio_eck {
* Gang block headers are self-checksumming and contain an array
* of block pointers.
*/
#define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE
#define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \
sizeof (zio_eck_t)) / sizeof (blkptr_t))
#define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \
sizeof (zio_eck_t) - \
(SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
sizeof (uint64_t))

typedef struct zio_gbh {
blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
uint64_t zg_filler[SPA_GBH_FILLER];
zio_eck_t zg_tail;
} zio_gbh_phys_t;

typedef enum zio_gb_version {
ZIO_GB_OLD = 0,
ZIO_GB_SIZED,
ZIO_GB_VERSIONS,
} zio_gb_version_t;

typedef struct zio_gb_tail {
uint64_t zgt_version; /* gang block type */
zio_eck_t zgt_eck; /* embedded checksum */
} zio_gb_tail_t;

#define SPA_OLD_GANGBLOCKSIZE SPA_MINBLOCKSIZE

static inline uint64_t
gbh_nblkptrs(uint64_t size) {
return ((size - sizeof (zio_gb_tail_t)) /
sizeof (blkptr_t));
}

static inline uint64_t
gbh_filler(uint64_t size) {
return ((size - sizeof (zio_gb_tail_t) -
(gbh_nblkptrs(size) * sizeof (blkptr_t))) /
sizeof (uint64_t));
}

static inline zio_gb_tail_t *
gbh_tail(void *gbh, uint64_t size) {
return ((zio_gb_tail_t *)((uintptr_t)gbh + size -
sizeof (zio_gb_tail_t)));
}

enum zio_checksum {
ZIO_CHECKSUM_INHERIT = 0,
Expand Down Expand Up @@ -227,6 +246,7 @@ typedef uint64_t zio_flag_t;
#define ZIO_FLAG_REEXECUTED (1ULL << 30)
#define ZIO_FLAG_DELEGATED (1ULL << 31)
#define ZIO_FLAG_DIO_CHKSUM_ERR (1ULL << 32)
#define ZIO_FLAG_PREALLOCATED (1ULL << 33)

#define ZIO_ALLOCATOR_NONE (-1)
#define ZIO_HAS_ALLOCATOR(zio) ((zio)->io_allocator != ZIO_ALLOCATOR_NONE)
Expand Down Expand Up @@ -397,8 +417,10 @@ typedef struct zio_vsd_ops {
} zio_vsd_ops_t;

typedef struct zio_gang_node {
zio_gbh_phys_t *gn_gbh;
struct zio_gang_node *gn_child[SPA_GBH_NBLKPTRS];
void *gn_gbh;
uint64_t gn_gangblocksize;
uint64_t gn_orig_gangblocksize;
struct zio_gang_node *gn_child[];
} zio_gang_node_t;

typedef zio_t *zio_gang_issue_func_t(zio_t *zio, blkptr_t *bp,
Expand Down
10 changes: 9 additions & 1 deletion include/zfeature_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ typedef enum spa_feature {
SPA_FEATURE_FAST_DEDUP,
SPA_FEATURE_LONGNAME,
SPA_FEATURE_LARGE_MICROZAP,
SPA_FEATURE_DYNAMIC_GANG_HEADER,
SPA_FEATURES
} spa_feature_t;

Expand All @@ -103,7 +104,14 @@ typedef enum zfeature_flags {
/* Activate this feature at the same time it is enabled. */
ZFEATURE_FLAG_ACTIVATE_ON_ENABLE = (1 << 2),
/* Each dataset has a field set if it has ever used this feature. */
ZFEATURE_FLAG_PER_DATASET = (1 << 3)
ZFEATURE_FLAG_PER_DATASET = (1 << 3),
/*
* This feature isn't enabled by zpool upgrade; it must be explicitly
* listed to be enabled. This also applies to compatibility lists. This
* flag can be removed from a given feature once support is sufficiently
* widespread.
*/
ZFEATURE_FLAG_NO_UPGRADE = (1 << 4)
} zfeature_flags_t;

typedef enum zfeature_type {
Expand Down
Loading
Loading