Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 Mar 2020 06:20:17 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r358662 - head/sys/cam
Message-ID:  <202003050620.0256KHrR053351@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Thu Mar  5 06:20:17 2020
New Revision: 358662
URL: https://svnweb.freebsd.org/changeset/base/358662

Log:
  xpt_async is submitting a CCB, not finishing it up, so use xpt_action() instead
  of xpt_done(). Add the missing XPT_ASYNC case to xpt_action_default. xpt_async
  wants to use the side-effect of the xpt_done() routine to queue this to the
  camisr thread so it can be done in that context. However, this breaks the
  symmetry that you create a ccb and call xpt_action() for it to be
  dispatched. Restore that symmetry by having it go through that path. As far as I
  can tell, this is the only CCB that we create and call xpt_done() on directly.

Modified:
  head/sys/cam/cam_xpt.c

Modified: head/sys/cam/cam_xpt.c
==============================================================================
--- head/sys/cam/cam_xpt.c	Thu Mar  5 06:19:21 2020	(r358661)
+++ head/sys/cam/cam_xpt.c	Thu Mar  5 06:20:17 2020	(r358662)
@@ -3156,6 +3156,10 @@ call_sim:
 		start_ccb->ccb_h.status = CAM_REQ_CMP;
 		xpt_done(start_ccb);
 		break;
+	case XPT_ASYNC:
+		start_ccb->ccb_h.status = CAM_REQ_CMP;
+		xpt_done(start_ccb);
+		break;
 	default:
 	case XPT_SDEV_TYPE:
 	case XPT_TERM_IO:
@@ -4447,7 +4451,7 @@ xpt_async(u_int32_t async_code, struct cam_path *path,
 		xpt_freeze_devq(path, 1);
 	else
 		xpt_freeze_simq(path->bus->sim, 1);
-	xpt_done(ccb);
+	xpt_action(ccb);
 }
 
 static void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202003050620.0256KHrR053351>