vbdev_lvol: esnap memdomain support
Return the total number of memory domains supported by the blobstore and any external snapshot bdev. Signed-off-by: Mike Gerdts <mgerdts@nvidia.com> Change-Id: I2f8afba6b31e689b8f942e2cf36906a0a30f38c8 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16430 Reviewed-by: Ben Walker <benjamin.walker@intel.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
parent
35298940a8
commit
dcd012e8d0
@ -954,11 +954,73 @@ static int
|
|||||||
vbdev_lvol_get_memory_domains(void *ctx, struct spdk_memory_domain **domains, int array_size)
|
vbdev_lvol_get_memory_domains(void *ctx, struct spdk_memory_domain **domains, int array_size)
|
||||||
{
|
{
|
||||||
struct spdk_lvol *lvol = ctx;
|
struct spdk_lvol *lvol = ctx;
|
||||||
struct spdk_bdev *base_bdev;
|
struct spdk_bdev *base_bdev, *esnap_bdev;
|
||||||
|
struct spdk_bs_dev *bs_dev;
|
||||||
|
struct spdk_lvol_store *lvs;
|
||||||
|
int base_cnt, esnap_cnt;
|
||||||
|
|
||||||
base_bdev = lvol->lvol_store->bs_dev->get_base_bdev(lvol->lvol_store->bs_dev);
|
lvs = lvol->lvol_store;
|
||||||
|
base_bdev = lvs->bs_dev->get_base_bdev(lvol->lvol_store->bs_dev);
|
||||||
|
|
||||||
return spdk_bdev_get_memory_domains(base_bdev, domains, array_size);
|
base_cnt = spdk_bdev_get_memory_domains(base_bdev, domains, array_size);
|
||||||
|
if (base_cnt < 0) {
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lvol->blob == NULL) {
|
||||||
|
/*
|
||||||
|
* This is probably called due to an open happening during blobstore load. Another
|
||||||
|
* open will follow shortly that has lvol->blob set.
|
||||||
|
*/
|
||||||
|
return -EAGAIN;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!spdk_blob_is_esnap_clone(lvol->blob)) {
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
bs_dev = spdk_blob_get_esnap_bs_dev(lvol->blob);
|
||||||
|
if (bs_dev == NULL) {
|
||||||
|
assert(false);
|
||||||
|
SPDK_ERRLOG("lvol %s is an esnap clone but has no esnap device\n", lvol->unique_id);
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bs_dev->get_base_bdev == NULL) {
|
||||||
|
/*
|
||||||
|
* If this were a blob_bdev, we wouldn't be here. We are probably here because an
|
||||||
|
* lvol bdev is being registered with spdk_bdev_register() before the external
|
||||||
|
* snapshot bdev is loaded. Ideally, the load of a missing esnap would trigger an
|
||||||
|
* event that causes the lvol bdev's memory domain information to be updated.
|
||||||
|
*/
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
esnap_bdev = bs_dev->get_base_bdev(bs_dev);
|
||||||
|
if (esnap_bdev == NULL) {
|
||||||
|
/*
|
||||||
|
* The esnap bdev has not yet been loaded. Anyone that has opened at this point may
|
||||||
|
* miss out on using memory domains if base_cnt is zero.
|
||||||
|
*/
|
||||||
|
SPDK_NOTICELOG("lvol %s reporting %d memory domains, not including missing esnap\n",
|
||||||
|
lvol->unique_id, base_cnt);
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (base_cnt < array_size) {
|
||||||
|
array_size -= base_cnt;
|
||||||
|
domains += base_cnt;
|
||||||
|
} else {
|
||||||
|
array_size = 0;
|
||||||
|
domains = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
esnap_cnt = spdk_bdev_get_memory_domains(esnap_bdev, domains, array_size);
|
||||||
|
if (esnap_cnt <= 0) {
|
||||||
|
return base_cnt;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base_cnt + esnap_cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct spdk_bdev_fn_table vbdev_lvol_fn_table = {
|
static struct spdk_bdev_fn_table vbdev_lvol_fn_table = {
|
||||||
|
@ -50,6 +50,7 @@ DEFINE_STUB(spdk_lvs_esnap_missing_add, int,
|
|||||||
(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, const void *esnap_id,
|
(struct spdk_lvol_store *lvs, struct spdk_lvol *lvol, const void *esnap_id,
|
||||||
uint32_t id_len), -ENOTSUP);
|
uint32_t id_len), -ENOTSUP);
|
||||||
DEFINE_STUB(spdk_blob_is_degraded, bool, (const struct spdk_blob *blob), false);
|
DEFINE_STUB(spdk_blob_is_degraded, bool, (const struct spdk_blob *blob), false);
|
||||||
|
DEFINE_STUB(spdk_blob_get_esnap_bs_dev, struct spdk_bs_dev *, (const struct spdk_blob *blob), NULL);
|
||||||
|
|
||||||
struct spdk_blob {
|
struct spdk_blob {
|
||||||
uint64_t id;
|
uint64_t id;
|
||||||
|
Loading…
Reference in New Issue
Block a user