svn commit: r360508 - head/sys/cam/nvme

Warner Losh imp at FreeBSD.org
Thu Apr 30 21:08:59 UTC 2020


Author: imp
Date: Thu Apr 30 21:08:59 2020
New Revision: 360508
URL: https://svnweb.freebsd.org/changeset/base/360508

Log:
  Fix three bugs highlighted by review:
  
  - maxio should be dp->d_maxsize. This is often MAXPHYS, but not always
    (especially if MAXPHYS is > 1MB).
  - Unlock the periph before returning. We don't need to relock it to
    release the ccb.
  - Make sure we release the ccb in error paths.
  
  Reviewed by: cperciva

Modified:
  head/sys/cam/nvme/nvme_da.c

Modified: head/sys/cam/nvme/nvme_da.c
==============================================================================
--- head/sys/cam/nvme/nvme_da.c	Thu Apr 30 21:08:22 2020	(r360507)
+++ head/sys/cam/nvme/nvme_da.c	Thu Apr 30 21:08:59 2020	(r360508)
@@ -402,7 +402,7 @@ ndaioctl(struct disk *dp, u_long cmd, void *data, int 
 		struct nvme_pt_command *pt;
 		union ccb *ccb;
 		struct cam_periph_map_info mapinfo;
-		u_int maxmap = MAXPHYS;	/* XXX is this right */
+		u_int maxmap = dp->d_maxsize;
 		int error;
 
 		/*
@@ -426,8 +426,10 @@ ndaioctl(struct disk *dp, u_long cmd, void *data, int 
 		 */
 		memset(&mapinfo, 0, sizeof(mapinfo));
 		error = cam_periph_mapmem(ccb, &mapinfo, maxmap);
-		if (error)
+		if (error) {
+			xpt_release_ccb(ccb);
 			return (error);
+		}
 
 		/*
 		 * Lock the periph and run the command. XXX do we need
@@ -442,7 +444,6 @@ ndaioctl(struct disk *dp, u_long cmd, void *data, int 
 		 * Tear down mapping and return status.
 		 */
 		cam_periph_unmapmem(ccb, &mapinfo);
-		cam_periph_lock(periph);
 		error = (ccb->ccb_h.status == CAM_REQ_CMP) ? 0 : EIO;
 		xpt_release_ccb(ccb);
 		return (error);


More information about the svn-src-all mailing list