Commit 8a825d22 authored by Guixin Liu's avatar Guixin Liu Committed by Keith Busch
Browse files

nvme: check ns's volatile write cache not present



When the VWC of a namespace does not exist, the BLK_FEAT_WRITE_CACHE
flag should not be set when registering the block device, regardless
of whether the controller supports VWC.

Signed-off-by: default avatarGuixin Liu <kanie@linux.alibaba.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarKeith Busch <kbusch@kernel.org>
parent 1d811438
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ struct nvme_ns_info {
	bool is_ready;
	bool is_removed;
	bool is_rotational;
	bool no_vwc;
};

unsigned int admin_timeout = 60;
@@ -1617,6 +1618,7 @@ static int nvme_ns_info_from_id_cs_indep(struct nvme_ctrl *ctrl,
		info->is_readonly = id->nsattr & NVME_NS_ATTR_RO;
		info->is_ready = id->nstat & NVME_NSTAT_NRDY;
		info->is_rotational = id->nsfeat & NVME_NS_ROTATIONAL;
		info->no_vwc = id->nsfeat & NVME_NS_VWC_NOT_PRESENT;
	}
	kfree(id);
	return ret;
@@ -2159,7 +2161,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
	    ns->head->ids.csi == NVME_CSI_ZNS)
		nvme_update_zone_info(ns, &lim, &zi);

	if (ns->ctrl->vwc & NVME_CTRL_VWC_PRESENT)
	if ((ns->ctrl->vwc & NVME_CTRL_VWC_PRESENT) && !info->no_vwc)
		lim.features |= BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA;
	else
		lim.features &= ~(BLK_FEAT_WRITE_CACHE | BLK_FEAT_FUA);
+1 −0
Original line number Diff line number Diff line
@@ -564,6 +564,7 @@ enum {
	NVME_NS_FLBAS_META_EXT	= 0x10,
	NVME_NS_NMIC_SHARED	= 1 << 0,
	NVME_NS_ROTATIONAL	= 1 << 4,
	NVME_NS_VWC_NOT_PRESENT = 1 << 5,
	NVME_LBAF_RP_BEST	= 0,
	NVME_LBAF_RP_BETTER	= 1,
	NVME_LBAF_RP_GOOD	= 2,