svn commit: r364907 - stable/12/sys/cam

Andriy Gapon avg at FreeBSD.org
Fri Aug 28 10:01:04 UTC 2020


Author: avg
Date: Fri Aug 28 10:01:03 2020
New Revision: 364907
URL: https://svnweb.freebsd.org/changeset/base/364907

Log:
  MFC r358864 by imp: Eliminate xpt_copy_path.

Modified:
  stable/12/sys/cam/cam_xpt.c
  stable/12/sys/cam/cam_xpt.h
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/cam/cam_xpt.c
==============================================================================
--- stable/12/sys/cam/cam_xpt.c	Fri Aug 28 08:54:27 2020	(r364906)
+++ stable/12/sys/cam/cam_xpt.c	Fri Aug 28 10:01:03 2020	(r364907)
@@ -804,7 +804,8 @@ static void
 xpt_scanner_thread(void *dummy)
 {
 	union ccb	*ccb;
-	struct cam_path	 path;
+	struct mtx	*mtx;
+	struct cam_ed	*device;
 
 	xpt_lock_buses();
 	for (;;) {
@@ -816,15 +817,22 @@ xpt_scanner_thread(void *dummy)
 			xpt_unlock_buses();
 
 			/*
-			 * Since lock can be dropped inside and path freed
-			 * by completion callback even before return here,
-			 * take our own path copy for reference.
+			 * We need to lock the device's mutex which we use as
+			 * the path mutex. We can't do it directly because the
+			 * cam_path in the ccb may wind up going away because
+			 * the path lock may be dropped and the path retired in
+			 * the completion callback. We do this directly to keep
+			 * the reference counts in cam_path sane. We also have
+			 * to copy the device pointer because ccb_h.path may
+			 * be freed in the callback.
 			 */
-			xpt_copy_path(&path, ccb->ccb_h.path);
-			xpt_path_lock(&path);
+			mtx = xpt_path_mtx(ccb->ccb_h.path);
+			device = ccb->ccb_h.path->device;
+			xpt_acquire_device(device);
+			mtx_lock(mtx);
 			xpt_action(ccb);
-			xpt_path_unlock(&path);
-			xpt_release_path(&path);
+			mtx_unlock(mtx);
+			xpt_release_device(device);
 
 			xpt_lock_buses();
 		}
@@ -3701,15 +3709,6 @@ xpt_clone_path(struct cam_path **new_path_ptr, struct 
 	new_path = (struct cam_path *)malloc(sizeof(*path), M_CAMPATH, M_NOWAIT);
 	if (new_path == NULL)
 		return(CAM_RESRC_UNAVAIL);
-	xpt_copy_path(new_path, path);
-	*new_path_ptr = new_path;
-	return (CAM_REQ_CMP);
-}
-
-void
-xpt_copy_path(struct cam_path *new_path, struct cam_path *path)
-{
-
 	*new_path = *path;
 	if (path->bus != NULL)
 		xpt_acquire_bus(path->bus);
@@ -3717,6 +3716,8 @@ xpt_copy_path(struct cam_path *new_path, struct cam_pa
 		xpt_acquire_target(path->target);
 	if (path->device != NULL)
 		xpt_acquire_device(path->device);
+	*new_path_ptr = new_path;
+	return (CAM_REQ_CMP);
 }
 
 void

Modified: stable/12/sys/cam/cam_xpt.h
==============================================================================
--- stable/12/sys/cam/cam_xpt.h	Fri Aug 28 08:54:27 2020	(r364906)
+++ stable/12/sys/cam/cam_xpt.h	Fri Aug 28 10:01:03 2020	(r364907)
@@ -140,8 +140,6 @@ cam_status		xpt_compile_path(struct cam_path *new_path
 					 lun_id_t lun_id);
 cam_status		xpt_clone_path(struct cam_path **new_path,
 				      struct cam_path *path);
-void			xpt_copy_path(struct cam_path *new_path,
-				      struct cam_path *path);
 
 void			xpt_release_path(struct cam_path *path);
 


More information about the svn-src-stable-12 mailing list