svn commit: r342046 - in head/sys: cam/nvme dev/nvme

Chuck Tuffli chuck at FreeBSD.org
Thu Dec 13 13:25:39 UTC 2018


Author: chuck
Date: Thu Dec 13 13:25:37 2018
New Revision: 342046
URL: https://svnweb.freebsd.org/changeset/base/342046

Log:
  nda(4) fix check for Dataset Management support
  
  In the nda(4) driver, only set DISKFLAG_CANDELETE (a.k.a. can support
  BIO_DELETE) if the drive supports Dataset Management. There are reports
  that without this check, VMWare Workstation does not work reliably.
  
  Fix is to check the ONCS field in the NVMe Controller Data structure for
  support. This check previously existed but did not survive the
  big-endian changes.
  
  Reported by: yuripv at yuripv.net
  Reviewed by: imp, mav, jimharris
  Approved by: imp (mentor)
  MFC after: 2 weeks
  Differential Revision: https://reviews.freebsd.org/D18493

Modified:
  head/sys/cam/nvme/nvme_da.c
  head/sys/dev/nvme/nvme.h
  head/sys/dev/nvme/nvme_ns.c

Modified: head/sys/cam/nvme/nvme_da.c
==============================================================================
--- head/sys/cam/nvme/nvme_da.c	Thu Dec 13 12:58:42 2018	(r342045)
+++ head/sys/cam/nvme/nvme_da.c	Thu Dec 13 13:25:37 2018	(r342046)
@@ -798,7 +798,7 @@ ndaregister(struct cam_periph *periph, void *arg)
 	disk->d_mediasize = (off_t)(disk->d_sectorsize * nsd->nsze);
 	disk->d_delmaxsize = disk->d_mediasize;
 	disk->d_flags = DISKFLAG_DIRECT_COMPLETION;
-//	if (cd->oncs.dsm) // XXX broken?
+	if (nvme_ctrlr_has_dataset_mgmt(cd))
 		disk->d_flags |= DISKFLAG_CANDELETE;
 	vwc_present = (cd->vwc >> NVME_CTRLR_DATA_VWC_PRESENT_SHIFT) &
 		NVME_CTRLR_DATA_VWC_PRESENT_MASK;

Modified: head/sys/dev/nvme/nvme.h
==============================================================================
--- head/sys/dev/nvme/nvme.h	Thu Dec 13 12:58:42 2018	(r342045)
+++ head/sys/dev/nvme/nvme.h	Thu Dec 13 13:25:37 2018	(r342046)
@@ -1259,6 +1259,13 @@ void		nvme_unregister_consumer(struct nvme_consumer *c
 device_t	nvme_ctrlr_get_device(struct nvme_controller *ctrlr);
 const struct nvme_controller_data *
 		nvme_ctrlr_get_data(struct nvme_controller *ctrlr);
+static inline bool
+nvme_ctrlr_has_dataset_mgmt(const struct nvme_controller_data *cd)
+{
+	/* Assumes cd was byte swapped by nvme_controller_data_swapbytes() */
+	return ((cd->oncs >> NVME_CTRLR_DATA_ONCS_DSM_SHIFT) &
+		NVME_CTRLR_DATA_ONCS_DSM_MASK);
+}
 
 /* Namespace helper functions */
 uint32_t	nvme_ns_get_max_io_xfer_size(struct nvme_namespace *ns);

Modified: head/sys/dev/nvme/nvme_ns.c
==============================================================================
--- head/sys/dev/nvme/nvme_ns.c	Thu Dec 13 12:58:42 2018	(r342045)
+++ head/sys/dev/nvme/nvme_ns.c	Thu Dec 13 13:25:37 2018	(r342046)
@@ -498,8 +498,6 @@ nvme_ns_construct(struct nvme_namespace *ns, uint32_t 
 	struct nvme_completion_poll_status	status;
 	int                                     res;
 	int					unit;
-	uint16_t				oncs;
-	uint8_t					dsm;
 	uint8_t					flbas_fmt;
 	uint8_t					vwc_present;
 
@@ -569,9 +567,7 @@ nvme_ns_construct(struct nvme_namespace *ns, uint32_t 
 		return (ENXIO);
 	}
 
-	oncs = ctrlr->cdata.oncs;
-	dsm = (oncs >> NVME_CTRLR_DATA_ONCS_DSM_SHIFT) & NVME_CTRLR_DATA_ONCS_DSM_MASK;
-	if (dsm)
+	if (nvme_ctrlr_has_dataset_mgmt(&ctrlr->cdata))
 		ns->flags |= NVME_NS_DEALLOCATE_SUPPORTED;
 
 	vwc_present = (ctrlr->cdata.vwc >> NVME_CTRLR_DATA_VWC_PRESENT_SHIFT) &


More information about the svn-src-all mailing list