Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Oct 2015 09:20:58 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r288758 - stable/10/sys/cam/ctl
Message-ID:  <201510050920.t959Kw6O041946@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Mon Oct  5 09:20:57 2015
New Revision: 288758
URL: https://svnweb.freebsd.org/changeset/base/288758

Log:
  MFC r287816: Close potential race between datamove and HA failover.

Modified:
  stable/10/sys/cam/ctl/ctl.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/cam/ctl/ctl.c
==============================================================================
--- stable/10/sys/cam/ctl/ctl.c	Mon Oct  5 09:20:09 2015	(r288757)
+++ stable/10/sys/cam/ctl/ctl.c	Mon Oct  5 09:20:57 2015	(r288758)
@@ -10952,6 +10952,7 @@ ctl_failover_lun(struct ctl_lun *lun)
 			if (io->flags & CTL_FLAG_FROM_OTHER_SC) {
 				if (io->flags & CTL_FLAG_IO_ACTIVE) {
 					io->flags |= CTL_FLAG_ABORT;
+					io->flags |= CTL_FLAG_FAILOVER;
 				} else { /* This can be only due to DATAMOVE */
 					io->msg_type = CTL_MSG_DATAMOVE_DONE;
 					io->flags |= CTL_FLAG_IO_ACTIVE;
@@ -12104,12 +12105,14 @@ ctl_datamove_timer_wakeup(void *arg)
 void
 ctl_datamove(union ctl_io *io)
 {
+	struct ctl_lun *lun;
 	void (*fe_datamove)(union ctl_io *io);
 
 	mtx_assert(&control_softc->ctl_lock, MA_NOTOWNED);
 
 	CTL_DEBUG_PRINT(("ctl_datamove\n"));
 
+	lun = (struct ctl_lun *)io->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
 #ifdef CTL_TIME_IO
 	if ((time_uptime - io->io_hdr.start_time) > ctl_time_io_secs) {
 		char str[256];
@@ -12150,9 +12153,6 @@ ctl_datamove(union ctl_io *io)
 	if (io->io_hdr.flags & CTL_FLAG_DELAY_DONE) {
 		io->io_hdr.flags &= ~CTL_FLAG_DELAY_DONE;
 	} else {
-		struct ctl_lun *lun;
-
-		lun =(struct ctl_lun *)io->io_hdr.ctl_private[CTL_PRIV_LUN].ptr;
 		if ((lun != NULL)
 		 && (lun->delay_info.datamove_delay > 0)) {
 
@@ -12328,7 +12328,24 @@ ctl_datamove(union ctl_io *io)
 
 			msg.dt.sent_sg_entries = sg_entries_sent;
 		}
+
+		/*
+		 * Officially handover the request from us to peer.
+		 * If failover has just happened, then we must return error.
+		 * If failover happen just after, then it is not our problem.
+		 */
+		if (lun)
+			mtx_lock(&lun->lun_lock);
+		if (io->io_hdr.flags & CTL_FLAG_FAILOVER) {
+			if (lun)
+				mtx_unlock(&lun->lun_lock);
+			io->io_hdr.port_status = 31342;
+			io->scsiio.be_move_done(io);
+			return;
+		}
 		io->io_hdr.flags &= ~CTL_FLAG_IO_ACTIVE;
+		if (lun)
+			mtx_unlock(&lun->lun_lock);
 	} else {
 
 		/*



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