Commit 7fad20dd authored by Christoph Hellwig's avatar Christoph Hellwig
Browse files

nvme: fix initialization of the zone bitmaps



The removal of the ->revalidate_disk method broke the initialization of
the zone bitmaps, as nvme_revalidate_disk now never gets called during
initialization.

Move the zone related code from nvme_revalidate_disk into a new helper in
zns.c, and call it from nvme_alloc_ns in addition to nvme_validate_ns to
ensure the zone bitmaps are initialized during probe.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarKeith Busch <kbusch@kernel.org>
Reviewed-by: default avatarDamien Le Moal <damien.lemoal@wdc.com>
parent 6fcd6695
Loading
Loading
Loading
Loading
+5 −23
Original line number Diff line number Diff line
@@ -2202,28 +2202,6 @@ static int _nvme_revalidate_disk(struct gendisk *disk)
	return ret;
}

static int nvme_revalidate_disk(struct gendisk *disk)
{
	int ret;

	ret = _nvme_revalidate_disk(disk);
	if (ret)
		return ret;

#ifdef CONFIG_BLK_DEV_ZONED
	if (blk_queue_is_zoned(disk->queue)) {
		struct nvme_ns *ns = disk->private_data;
		struct nvme_ctrl *ctrl = ns->ctrl;

		ret = blk_revalidate_disk_zones(disk, NULL);
		if (!ret)
			blk_queue_max_zone_append_sectors(disk->queue,
							  ctrl->max_zone_append);
	}
#endif
	return ret;
}

static char nvme_pr_type(enum pr_type type)
{
	switch (type) {
@@ -3958,6 +3936,8 @@ static void nvme_alloc_ns(struct nvme_ctrl *ctrl, unsigned nsid)

	if (__nvme_revalidate_disk(disk, id))
		goto out_put_disk;
	if (blk_queue_is_zoned(ns->queue) && nvme_revalidate_zones(ns))
		goto out_put_disk;

	if ((ctrl->quirks & NVME_QUIRK_LIGHTNVM) && id->vs[0] == 0x1) {
		ret = nvme_nvm_register(ns, disk_name, node);
@@ -4052,7 +4032,9 @@ static void nvme_validate_ns(struct nvme_ctrl *ctrl, unsigned nsid)
		return;
	}

	ret = nvme_revalidate_disk(ns->disk);
	ret = _nvme_revalidate_disk(ns->disk);
	if (!ret && blk_queue_is_zoned(ns->queue))
		ret = nvme_revalidate_zones(ns);
	revalidate_disk_size(ns->disk, ret == 0);
	if (ret)
		nvme_ns_remove(ns);
+1 −0
Original line number Diff line number Diff line
@@ -758,6 +758,7 @@ static inline void nvme_mpath_start_freeze(struct nvme_subsystem *subsys)
}
#endif /* CONFIG_NVME_MULTIPATH */

int nvme_revalidate_zones(struct nvme_ns *ns);
#ifdef CONFIG_BLK_DEV_ZONED
int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns,
			  unsigned lbaf);
+11 −0
Original line number Diff line number Diff line
@@ -7,6 +7,17 @@
#include <linux/vmalloc.h>
#include "nvme.h"

int nvme_revalidate_zones(struct nvme_ns *ns)
{
	struct request_queue *q = ns->queue;
	int ret;

	ret = blk_revalidate_disk_zones(ns->disk, NULL);
	if (!ret)
		blk_queue_max_zone_append_sectors(q, ns->ctrl->max_zone_append);
	return ret;
}

static int nvme_set_max_append(struct nvme_ctrl *ctrl)
{
	struct nvme_command c = { };