Author: mav
Date: Sat Sep 14 09:52:30 2013
New Revision: 255559
URL: http://svnweb.freebsd.org/changeset/base/255559

Log:
  MFC r255118:
  Fix targbh crash on XPT_IMMED_NOTIFY error during attach.

Modified:
  stable/9/sys/cam/scsi/scsi_targ_bh.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/cam/scsi/scsi_targ_bh.c
==============================================================================
--- stable/9/sys/cam/scsi/scsi_targ_bh.c        Sat Sep 14 09:50:45 2013        
(r255558)
+++ stable/9/sys/cam/scsi/scsi_targ_bh.c        Sat Sep 14 09:52:30 2013        
(r255559)
@@ -283,16 +283,13 @@ targbhenlun(struct cam_periph *periph)
                xpt_setup_ccb(&atio->ccb_h, periph->path, CAM_PRIORITY_NORMAL);
                atio->ccb_h.func_code = XPT_ACCEPT_TARGET_IO;
                atio->ccb_h.cbfcnp = targbhdone;
-               xpt_action((union ccb *)atio);
-               status = atio->ccb_h.status;
-               if (status != CAM_REQ_INPROG) {
-                       targbhfreedescr(atio->ccb_h.ccb_descr);
-                       free(atio, M_SCSIBH);
-                       break;
-               }
                ((struct targbh_cmd_desc*)atio->ccb_h.ccb_descr)->atio_link =
                    softc->accept_tio_list;
                softc->accept_tio_list = atio;
+               xpt_action((union ccb *)atio);
+               status = atio->ccb_h.status;
+               if (status != CAM_REQ_INPROG)
+                       break;
        }
 
        if (i == 0) {
@@ -321,14 +318,12 @@ targbhenlun(struct cam_periph *periph)
                xpt_setup_ccb(&inot->ccb_h, periph->path, CAM_PRIORITY_NORMAL);
                inot->ccb_h.func_code = XPT_IMMED_NOTIFY;
                inot->ccb_h.cbfcnp = targbhdone;
+               SLIST_INSERT_HEAD(&softc->immed_notify_slist, &inot->ccb_h,
+                                 periph_links.sle);
                xpt_action((union ccb *)inot);
                status = inot->ccb_h.status;
-               if (status != CAM_REQ_INPROG) {
-                       free(inot, M_SCSIBH);
+               if (status != CAM_REQ_INPROG)
                        break;
-               }
-               SLIST_INSERT_HEAD(&softc->immed_notify_slist, &inot->ccb_h,
-                                 periph_links.sle);
        }
 
        if (i == 0) {
@@ -413,7 +408,9 @@ targbhctor(struct cam_periph *periph, vo
        periph->softc = softc;
        softc->init_level++;
 
-       return (targbhenlun(periph));
+       if (targbhenlun(periph) != CAM_REQ_CMP)
+               cam_periph_invalidate(periph);
+       return (CAM_REQ_CMP);
 }
 
 static void
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "[email protected]"

Reply via email to