mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-24 03:08:51 +03:00
DLPX-44812 integrate EP-220 large memory scalability
This commit is contained in:
committed by
Brian Behlendorf
parent
616fa7c02b
commit
a6255b7fce
+43
-33
@@ -145,6 +145,7 @@
|
||||
#include <sys/metaslab.h>
|
||||
#include <sys/zio.h>
|
||||
#include <sys/dsl_scan.h>
|
||||
#include <sys/abd.h>
|
||||
#include <sys/fs/zfs.h>
|
||||
|
||||
/*
|
||||
@@ -178,7 +179,7 @@ vdev_label_number(uint64_t psize, uint64_t offset)
|
||||
}
|
||||
|
||||
static void
|
||||
vdev_label_read(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
|
||||
vdev_label_read(zio_t *zio, vdev_t *vd, int l, abd_t *buf, uint64_t offset,
|
||||
uint64_t size, zio_done_func_t *done, void *private, int flags)
|
||||
{
|
||||
ASSERT(spa_config_held(zio->io_spa, SCL_STATE_ALL, RW_WRITER) ==
|
||||
@@ -192,7 +193,7 @@ vdev_label_read(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
|
||||
}
|
||||
|
||||
static void
|
||||
vdev_label_write(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
|
||||
vdev_label_write(zio_t *zio, vdev_t *vd, int l, abd_t *buf, uint64_t offset,
|
||||
uint64_t size, zio_done_func_t *done, void *private, int flags)
|
||||
{
|
||||
ASSERT(spa_config_held(zio->io_spa, SCL_ALL, RW_WRITER) == SCL_ALL ||
|
||||
@@ -587,6 +588,7 @@ vdev_label_read_config(vdev_t *vd, uint64_t txg)
|
||||
spa_t *spa = vd->vdev_spa;
|
||||
nvlist_t *config = NULL;
|
||||
vdev_phys_t *vp;
|
||||
abd_t *vp_abd;
|
||||
zio_t *zio;
|
||||
uint64_t best_txg = 0;
|
||||
int error = 0;
|
||||
@@ -599,7 +601,8 @@ vdev_label_read_config(vdev_t *vd, uint64_t txg)
|
||||
if (!vdev_readable(vd))
|
||||
return (NULL);
|
||||
|
||||
vp = zio_buf_alloc(sizeof (vdev_phys_t));
|
||||
vp_abd = abd_alloc_linear(sizeof (vdev_phys_t), B_TRUE);
|
||||
vp = abd_to_buf(vp_abd);
|
||||
|
||||
retry:
|
||||
for (l = 0; l < VDEV_LABELS; l++) {
|
||||
@@ -607,7 +610,7 @@ retry:
|
||||
|
||||
zio = zio_root(spa, NULL, NULL, flags);
|
||||
|
||||
vdev_label_read(zio, vd, l, vp,
|
||||
vdev_label_read(zio, vd, l, vp_abd,
|
||||
offsetof(vdev_label_t, vl_vdev_phys),
|
||||
sizeof (vdev_phys_t), NULL, NULL, flags);
|
||||
|
||||
@@ -646,7 +649,7 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
|
||||
zio_buf_free(vp, sizeof (vdev_phys_t));
|
||||
abd_free(vp_abd);
|
||||
|
||||
return (config);
|
||||
}
|
||||
@@ -782,8 +785,10 @@ vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
|
||||
spa_t *spa = vd->vdev_spa;
|
||||
nvlist_t *label;
|
||||
vdev_phys_t *vp;
|
||||
char *pad2;
|
||||
abd_t *vp_abd;
|
||||
abd_t *pad2;
|
||||
uberblock_t *ub;
|
||||
abd_t *ub_abd;
|
||||
zio_t *zio;
|
||||
char *buf;
|
||||
size_t buflen;
|
||||
@@ -867,8 +872,9 @@ vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
|
||||
/*
|
||||
* Initialize its label.
|
||||
*/
|
||||
vp = zio_buf_alloc(sizeof (vdev_phys_t));
|
||||
bzero(vp, sizeof (vdev_phys_t));
|
||||
vp_abd = abd_alloc_linear(sizeof (vdev_phys_t), B_TRUE);
|
||||
abd_zero(vp_abd, sizeof (vdev_phys_t));
|
||||
vp = abd_to_buf(vp_abd);
|
||||
|
||||
/*
|
||||
* Generate a label describing the pool and our top-level vdev.
|
||||
@@ -928,7 +934,7 @@ vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
|
||||
error = nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP);
|
||||
if (error != 0) {
|
||||
nvlist_free(label);
|
||||
zio_buf_free(vp, sizeof (vdev_phys_t));
|
||||
abd_free(vp_abd);
|
||||
/* EFAULT means nvlist_pack ran out of room */
|
||||
return (error == EFAULT ? ENAMETOOLONG : EINVAL);
|
||||
}
|
||||
@@ -936,14 +942,15 @@ vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
|
||||
/*
|
||||
* Initialize uberblock template.
|
||||
*/
|
||||
ub = zio_buf_alloc(VDEV_UBERBLOCK_RING);
|
||||
bzero(ub, VDEV_UBERBLOCK_RING);
|
||||
*ub = spa->spa_uberblock;
|
||||
ub_abd = abd_alloc_linear(VDEV_UBERBLOCK_RING, B_TRUE);
|
||||
abd_zero(ub_abd, VDEV_UBERBLOCK_RING);
|
||||
abd_copy_from_buf(ub_abd, &spa->spa_uberblock, sizeof (uberblock_t));
|
||||
ub = abd_to_buf(ub_abd);
|
||||
ub->ub_txg = 0;
|
||||
|
||||
/* Initialize the 2nd padding area. */
|
||||
pad2 = zio_buf_alloc(VDEV_PAD_SIZE);
|
||||
bzero(pad2, VDEV_PAD_SIZE);
|
||||
pad2 = abd_alloc_for_io(VDEV_PAD_SIZE, B_TRUE);
|
||||
abd_zero(pad2, VDEV_PAD_SIZE);
|
||||
|
||||
/*
|
||||
* Write everything in parallel.
|
||||
@@ -953,7 +960,7 @@ retry:
|
||||
|
||||
for (l = 0; l < VDEV_LABELS; l++) {
|
||||
|
||||
vdev_label_write(zio, vd, l, vp,
|
||||
vdev_label_write(zio, vd, l, vp_abd,
|
||||
offsetof(vdev_label_t, vl_vdev_phys),
|
||||
sizeof (vdev_phys_t), NULL, NULL, flags);
|
||||
|
||||
@@ -966,7 +973,7 @@ retry:
|
||||
offsetof(vdev_label_t, vl_pad2),
|
||||
VDEV_PAD_SIZE, NULL, NULL, flags);
|
||||
|
||||
vdev_label_write(zio, vd, l, ub,
|
||||
vdev_label_write(zio, vd, l, ub_abd,
|
||||
offsetof(vdev_label_t, vl_uberblock),
|
||||
VDEV_UBERBLOCK_RING, NULL, NULL, flags);
|
||||
}
|
||||
@@ -979,9 +986,9 @@ retry:
|
||||
}
|
||||
|
||||
nvlist_free(label);
|
||||
zio_buf_free(pad2, VDEV_PAD_SIZE);
|
||||
zio_buf_free(ub, VDEV_UBERBLOCK_RING);
|
||||
zio_buf_free(vp, sizeof (vdev_phys_t));
|
||||
abd_free(pad2);
|
||||
abd_free(ub_abd);
|
||||
abd_free(vp_abd);
|
||||
|
||||
/*
|
||||
* If this vdev hasn't been previously identified as a spare, then we
|
||||
@@ -1039,7 +1046,7 @@ vdev_uberblock_load_done(zio_t *zio)
|
||||
vdev_t *vd = zio->io_vd;
|
||||
spa_t *spa = zio->io_spa;
|
||||
zio_t *rio = zio->io_private;
|
||||
uberblock_t *ub = zio->io_data;
|
||||
uberblock_t *ub = abd_to_buf(zio->io_abd);
|
||||
struct ubl_cbdata *cbp = rio->io_private;
|
||||
|
||||
ASSERT3U(zio->io_size, ==, VDEV_UBERBLOCK_SIZE(vd));
|
||||
@@ -1060,7 +1067,7 @@ vdev_uberblock_load_done(zio_t *zio)
|
||||
mutex_exit(&rio->io_lock);
|
||||
}
|
||||
|
||||
zio_buf_free(zio->io_data, zio->io_size);
|
||||
abd_free(zio->io_abd);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1076,8 +1083,8 @@ vdev_uberblock_load_impl(zio_t *zio, vdev_t *vd, int flags,
|
||||
for (l = 0; l < VDEV_LABELS; l++) {
|
||||
for (n = 0; n < VDEV_UBERBLOCK_COUNT(vd); n++) {
|
||||
vdev_label_read(zio, vd, l,
|
||||
zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd)),
|
||||
VDEV_UBERBLOCK_OFFSET(vd, n),
|
||||
abd_alloc_linear(VDEV_UBERBLOCK_SIZE(vd),
|
||||
B_TRUE), VDEV_UBERBLOCK_OFFSET(vd, n),
|
||||
VDEV_UBERBLOCK_SIZE(vd),
|
||||
vdev_uberblock_load_done, zio, flags);
|
||||
}
|
||||
@@ -1144,7 +1151,7 @@ vdev_uberblock_sync_done(zio_t *zio)
|
||||
static void
|
||||
vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
|
||||
{
|
||||
uberblock_t *ubbuf;
|
||||
abd_t *ub_abd;
|
||||
int c, l, n;
|
||||
|
||||
for (c = 0; c < vd->vdev_children; c++)
|
||||
@@ -1158,17 +1165,18 @@ vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, int flags)
|
||||
|
||||
n = ub->ub_txg & (VDEV_UBERBLOCK_COUNT(vd) - 1);
|
||||
|
||||
ubbuf = zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd));
|
||||
bzero(ubbuf, VDEV_UBERBLOCK_SIZE(vd));
|
||||
*ubbuf = *ub;
|
||||
/* Copy the uberblock_t into the ABD */
|
||||
ub_abd = abd_alloc_for_io(VDEV_UBERBLOCK_SIZE(vd), B_TRUE);
|
||||
abd_zero(ub_abd, VDEV_UBERBLOCK_SIZE(vd));
|
||||
abd_copy_from_buf(ub_abd, ub, sizeof (uberblock_t));
|
||||
|
||||
for (l = 0; l < VDEV_LABELS; l++)
|
||||
vdev_label_write(zio, vd, l, ubbuf,
|
||||
vdev_label_write(zio, vd, l, ub_abd,
|
||||
VDEV_UBERBLOCK_OFFSET(vd, n), VDEV_UBERBLOCK_SIZE(vd),
|
||||
vdev_uberblock_sync_done, zio->io_private,
|
||||
flags | ZIO_FLAG_DONT_PROPAGATE);
|
||||
|
||||
zio_buf_free(ubbuf, VDEV_UBERBLOCK_SIZE(vd));
|
||||
abd_free(ub_abd);
|
||||
}
|
||||
|
||||
/* Sync the uberblocks to all vdevs in svd[] */
|
||||
@@ -1245,6 +1253,7 @@ vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
|
||||
{
|
||||
nvlist_t *label;
|
||||
vdev_phys_t *vp;
|
||||
abd_t *vp_abd;
|
||||
char *buf;
|
||||
size_t buflen;
|
||||
int c;
|
||||
@@ -1263,15 +1272,16 @@ vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
|
||||
*/
|
||||
label = spa_config_generate(vd->vdev_spa, vd, txg, B_FALSE);
|
||||
|
||||
vp = zio_buf_alloc(sizeof (vdev_phys_t));
|
||||
bzero(vp, sizeof (vdev_phys_t));
|
||||
vp_abd = abd_alloc_linear(sizeof (vdev_phys_t), B_TRUE);
|
||||
abd_zero(vp_abd, sizeof (vdev_phys_t));
|
||||
vp = abd_to_buf(vp_abd);
|
||||
|
||||
buf = vp->vp_nvlist;
|
||||
buflen = sizeof (vp->vp_nvlist);
|
||||
|
||||
if (!nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP)) {
|
||||
for (; l < VDEV_LABELS; l += 2) {
|
||||
vdev_label_write(zio, vd, l, vp,
|
||||
vdev_label_write(zio, vd, l, vp_abd,
|
||||
offsetof(vdev_label_t, vl_vdev_phys),
|
||||
sizeof (vdev_phys_t),
|
||||
vdev_label_sync_done, zio->io_private,
|
||||
@@ -1279,7 +1289,7 @@ vdev_label_sync(zio_t *zio, vdev_t *vd, int l, uint64_t txg, int flags)
|
||||
}
|
||||
}
|
||||
|
||||
zio_buf_free(vp, sizeof (vdev_phys_t));
|
||||
abd_free(vp_abd);
|
||||
nvlist_free(label);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user