Author: mav
Date: Mon Oct  5 11:05:56 2015
New Revision: 288803
URL: https://svnweb.freebsd.org/changeset/base/288803

Log:
  MFC r288239: Properly lock LUN in ctl_failover_lun().

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 11:05:04 2015        (r288802)
+++ stable/10/sys/cam/ctl/ctl.c Mon Oct  5 11:05:56 2015        (r288803)
@@ -426,7 +426,7 @@ static int ctl_check_blocked(struct ctl_
 static int ctl_scsiio_lun_check(struct ctl_lun *lun,
                                const struct ctl_cmd_entry *entry,
                                struct ctl_scsiio *ctsio);
-static void ctl_failover_lun(struct ctl_lun *lun);
+static void ctl_failover_lun(union ctl_io *io);
 static int ctl_scsiio_precheck(struct ctl_softc *ctl_softc,
                               struct ctl_scsiio *ctsio);
 static int ctl_scsiio(struct ctl_scsiio *ctsio);
@@ -11201,12 +11201,31 @@ ctl_failover_io(union ctl_io *io, int ha
 }
 
 static void
-ctl_failover_lun(struct ctl_lun *lun)
+ctl_failover_lun(union ctl_io *rio)
 {
-       struct ctl_softc *softc = lun->ctl_softc;
+       struct ctl_softc *softc = control_softc;
+       struct ctl_lun *lun;
        struct ctl_io_hdr *io, *next_io;
+       uint32_t targ_lun;
+
+       targ_lun = rio->io_hdr.nexus.targ_mapped_lun;
+       CTL_DEBUG_PRINT(("FAILOVER for lun %ju\n", targ_lun));
+
+       /* Find and lock the LUN. */
+       mtx_lock(&softc->ctl_lock);
+       if ((targ_lun < CTL_MAX_LUNS) &&
+           ((lun = softc->ctl_luns[targ_lun]) != NULL)) {
+               mtx_lock(&lun->lun_lock);
+               mtx_unlock(&softc->ctl_lock);
+               if (lun->flags & CTL_LUN_DISABLED) {
+                       mtx_unlock(&lun->lun_lock);
+                       return;
+               }
+       } else {
+               mtx_unlock(&softc->ctl_lock);
+               return;
+       }
 
-       CTL_DEBUG_PRINT(("FAILOVER for lun %ju\n", lun->lun));
        if (softc->ha_mode == CTL_HA_MODE_XFER) {
                TAILQ_FOREACH_SAFE(io, &lun->ooa_queue, ooa_links, next_io) {
                        /* We are master */
@@ -11264,6 +11283,7 @@ ctl_failover_lun(struct ctl_lun *lun)
                }
                ctl_check_blocked(lun);
        }
+       mtx_unlock(&lun->lun_lock);
 }
 
 static int
@@ -12196,9 +12216,7 @@ ctl_handle_isc(union ctl_io *io)
                io->scsiio.be_move_done(io);
                break;
        case CTL_MSG_FAILOVER:
-               mtx_lock(&lun->lun_lock);
-               ctl_failover_lun(lun);
-               mtx_unlock(&lun->lun_lock);
+               ctl_failover_lun(io);
                free_io = 1;
                break;
        default:
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to