Commit 52a0feb4 authored by Allen Zhu's avatar Allen Zhu Committed by Tomasz Zawadzki
Browse files

bdev/nvme: handle namespace resize event



while the size of namespace is changed,
the resize event will be notified.

Signed-off-by: default avatarAlexey Marchuk <alexeymar@mellanox.com>
Signed-off-by: default avatarEvgeniy Kochetov <evgeniik@mellanox.com>
Signed-off-by: default avatarAllen Zhu <allenz@mellanox.com>

Change-Id: I5d85f17df898dc21c0ae1eb9f529dcb624a457ac
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/849


Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 75c2135d
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -1799,20 +1799,29 @@ nvme_ctrlr_update_namespaces(struct spdk_nvme_ctrlr *ctrlr)
{
	uint32_t i, nn = ctrlr->cdata.nn;
	struct spdk_nvme_ns_data *nsdata;
	bool ns_is_active;

	for (i = 0; i < nn; i++) {
		struct spdk_nvme_ns	*ns = &ctrlr->ns[i];
		uint32_t		nsid = i + 1;

		nsdata = &ctrlr->nsdata[nsid - 1];
		ns_is_active = spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid);

		if ((nsdata->ncap == 0) && spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid)) {
		if (nsdata->ncap && ns_is_active) {
			if (nvme_ns_update(ns) != 0) {
				SPDK_ERRLOG("Failed to update active NS %u\n", nsid);
				continue;
			}
		}

		if ((nsdata->ncap == 0) && ns_is_active) {
			if (nvme_ns_construct(ns, nsid, ctrlr) != 0) {
				continue;
			}
		}

		if (nsdata->ncap && !spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid)) {
		if (nsdata->ncap && !ns_is_active) {
			nvme_ns_destruct(ns);
		}
	}
+1 −0
Original line number Diff line number Diff line
@@ -901,6 +901,7 @@ void nvme_ns_set_identify_data(struct spdk_nvme_ns *ns);
int	nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
			  struct spdk_nvme_ctrlr *ctrlr);
void	nvme_ns_destruct(struct spdk_nvme_ns *ns);
int	nvme_ns_update(struct spdk_nvme_ns *ns);

int	nvme_fabric_ctrlr_set_reg_4(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint32_t value);
int	nvme_fabric_ctrlr_set_reg_8(struct spdk_nvme_ctrlr *ctrlr, uint32_t offset, uint64_t value);
+5 −0
Original line number Diff line number Diff line
@@ -394,3 +394,8 @@ void nvme_ns_destruct(struct spdk_nvme_ns *ns)
	ns->sectors_per_stripe = 0;
	ns->flags = 0;
}

int nvme_ns_update(struct spdk_nvme_ns *ns)
{
	return nvme_ctrlr_identify_ns(ns);
}
+28 −2
Original line number Diff line number Diff line
@@ -1120,7 +1120,12 @@ nvme_ctrlr_populate_namespaces(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr,
{
	struct spdk_nvme_ctrlr	*ctrlr = nvme_bdev_ctrlr->ctrlr;
	struct nvme_bdev_ns	*ns;
	struct spdk_nvme_ns	*nvme_ns;
	struct nvme_bdev	*bdev;
	uint32_t		i;
	int			rc;
	uint64_t		num_sectors;
	bool			ns_is_active;

	if (ctx) {
		/* Initialize this count to 1 to handle the populate functions
@@ -1133,7 +1138,28 @@ nvme_ctrlr_populate_namespaces(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr,
		uint32_t	nsid = i + 1;

		ns = nvme_bdev_ctrlr->namespaces[i];
		if (!ns->populated && spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid)) {
		ns_is_active = spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid);

		if (ns->populated && ns_is_active && ns->type == NVME_BDEV_NS_STANDARD) {
			/* NS is still there but attributes may have changed */
			nvme_ns = spdk_nvme_ctrlr_get_ns(ctrlr, nsid);
			num_sectors = spdk_nvme_ns_get_num_sectors(nvme_ns);
			bdev = TAILQ_FIRST(&ns->bdevs);
			if (bdev->disk.blockcnt != num_sectors) {
				SPDK_NOTICELOG("NSID %u is resized: bdev name %s, old size %lu, new size %lu\n",
					       nsid,
					       bdev->disk.name,
					       bdev->disk.blockcnt,
					       num_sectors);
				rc = spdk_bdev_notify_blockcnt_change(&bdev->disk, num_sectors);
				if (rc != 0) {
					SPDK_ERRLOG("Could not change num blocks for nvme bdev: name %s, errno: %d.\n",
						    bdev->disk.name, rc);
				}
			}
		}

		if (!ns->populated && ns_is_active) {
			ns->id = nsid;
			ns->ctrlr = nvme_bdev_ctrlr;
			if (spdk_nvme_ctrlr_is_ocssd_supported(ctrlr)) {
@@ -1150,7 +1176,7 @@ nvme_ctrlr_populate_namespaces(struct nvme_bdev_ctrlr *nvme_bdev_ctrlr,
			nvme_ctrlr_populate_namespace(nvme_bdev_ctrlr, ns, ctx);
		}

		if (ns->populated && !spdk_nvme_ctrlr_is_active_ns(ctrlr, nsid)) {
		if (ns->populated && !ns_is_active) {
			nvme_ctrlr_depopulate_namespace(nvme_bdev_ctrlr, ns);
		}
	}
+6 −0
Original line number Diff line number Diff line
@@ -457,6 +457,12 @@ nvme_ns_construct(struct spdk_nvme_ns *ns, uint32_t id,
	return 0;
}

int
nvme_ns_update(struct spdk_nvme_ns *ns)
{
	return 0;
}

void
spdk_pci_device_detach(struct spdk_pci_device *device)
{