Date: Tue, 17 Aug 2010 11:59:57 -0600 From: Scott Long <scottl@samsco.org> To: Matt Jacob <mjacob@FreeBSD.org> Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r211434 - head/sys/cam/scsi Message-ID: <810BE039-72EA-4020-8B42-8D1274E888AA@samsco.org> In-Reply-To: <201008171711.o7HHBFce039173@svn.freebsd.org> References: <201008171711.o7HHBFce039173@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
This is violates the policy that CAM has effectively had for a long time = that separates protocol error handling in the periph from transport = error recovery in the SIM. I think it's better to encourage SIMs to = register an AC_LOST_DEVICE event and handle command aborts themselves. = Most drivers have a busy queue and know what outstanding CCBs belong to = what devices/targets. And in the age of SAS, the SIMs are going to know = about dead devices long before the periph will, and should already be in = the process of aborting the outstanding commands and returning the CCBs. = SIMs that don't probably don't even properly timeout outstanding = commands, so they'll have much deeper problems than this. I'm in the middle of working on this for the mps driver. Your change = may or may not get in the way of the design I already have, where the = SIM autonomously dequeues and completes all outstanding CCBs to dead = devices. I'll hopefully have an answer in the coming weeks and let you = know. Please don't MFC before then. Scott On Aug 17, 2010, at 11:11 AM, Matt Jacob wrote: > Author: mjacob > Date: Tue Aug 17 17:11:15 2010 > New Revision: 211434 > URL: http://svn.freebsd.org/changeset/base/211434 >=20 > Log: > Now is as good a time as any to find out if we induce breakage > by issueing aborts for any pending commands when we're decommssioning > a disk. >=20 > MFC after: 3 months >=20 > Modified: > head/sys/cam/scsi/scsi_da.c >=20 > Modified: head/sys/cam/scsi/scsi_da.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- head/sys/cam/scsi/scsi_da.c Tue Aug 17 16:41:16 2010 = (r211433) > +++ head/sys/cam/scsi/scsi_da.c Tue Aug 17 17:11:15 2010 = (r211434) > @@ -958,6 +958,8 @@ dainit(void) > static void > daoninvalidate(struct cam_periph *periph) > { > + struct ccb_abort cab; > + struct ccb_hdr *ccb_h, *ccb_h_t; > struct da_softc *softc; >=20 > softc =3D (struct da_softc *)periph->softc; > @@ -967,15 +969,29 @@ daoninvalidate(struct cam_periph *periph > */ > xpt_register_async(0, daasync, periph, periph->path); >=20 > + /* > + * Invalidate the pack label > + */ > softc->flags |=3D DA_FLAG_PACK_INVALID; >=20 > /* > * Return all queued I/O with ENXIO. > - * XXX Handle any transactions queued to the card > - * with XPT_ABORT_CCB. > */ > bioq_flush(&softc->bio_queue, NULL, ENXIO); >=20 > + /* > + * Issue aborts for any pending commands. > + */ > + xpt_setup_ccb(&cab.ccb_h, periph->path, CAM_PRIORITY_NORMAL+1); > + cab.ccb_h.func_code =3D XPT_ABORT; > + LIST_FOREACH_SAFE(ccb_h, &softc->pending_ccbs, periph_links.le, = ccb_h_t) { > + cab.abort_ccb =3D (union ccb *)ccb_h; > + xpt_action((union ccb *)&cab); > + } > + > + /* > + * This disk is *history*.... > + */ > disk_gone(softc->disk); > xpt_print(periph->path, "lost device\n"); > }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?810BE039-72EA-4020-8B42-8D1274E888AA>