svn commit: r186371 - head/sys/cam/scsi
Ganbold
ganbold at micom.mng.net
Sun Dec 21 07:22:47 UTC 2008
Scott Long wrote:
> Author: scottl
> Date: Sun Dec 21 06:20:11 2008
> New Revision: 186371
> URL: http://svn.freebsd.org/changeset/base/186371
>
> Log:
> Fix refcount locking in cd, pass, and sg periphs.
>
> Modified:
> head/sys/cam/scsi/scsi_cd.c
> head/sys/cam/scsi/scsi_pass.c
> head/sys/cam/scsi/scsi_sg.c
>
> Modified: head/sys/cam/scsi/scsi_cd.c
> ==============================================================================
> --- head/sys/cam/scsi/scsi_cd.c Sun Dec 21 04:40:02 2008 (r186370)
> +++ head/sys/cam/scsi/scsi_cd.c Sun Dec 21 06:20:11 2008 (r186371)
> @@ -996,12 +996,6 @@ cdopen(struct disk *dp)
> return (error);
> }
>
> - /* Closes aren't symmetrical with opens, so fix up the refcounting. */
> - if (softc->flags & CD_FLAG_OPEN)
> - cam_periph_release(periph);
> - else
> - softc->flags |= CD_FLAG_OPEN;
> -
> /*
> * Check for media, and set the appropriate flags. We don't bail
> * if we don't have media, but then we don't allow anything but the
> @@ -1011,7 +1005,15 @@ cdopen(struct disk *dp)
>
> CAM_DEBUG(periph->path, CAM_DEBUG_TRACE, ("leaving cdopen\n"));
> cam_periph_unhold(periph);
> - cam_periph_unlock(periph);
> +
> + /* Closes aren't symmetrical with opens, so fix up the refcounting. */
> + if ((softc->flags & CD_FLAG_OPEN) == 0) {
> + softc->flags |= CD_FLAG_OPEN;
> + cam_periph_unlock(periph);
> + } else {
> + cam_periph_unlock(periph);
> + cam_periph_release(periph);
> + }
>
> return (0);
> }
>
> Modified: head/sys/cam/scsi/scsi_pass.c
> ==============================================================================
> --- head/sys/cam/scsi/scsi_pass.c Sun Dec 21 04:40:02 2008 (r186370)
> +++ head/sys/cam/scsi/scsi_pass.c Sun Dec 21 06:20:11 2008 (r186371)
> @@ -346,13 +346,13 @@ passopen(struct cdev *dev, int flags, in
>
> if ((softc->flags & PASS_FLAG_OPEN) == 0) {
> softc->flags |= PASS_FLAG_OPEN;
> + cam_periph_unlock(periph);
> } else {
> /* Device closes aren't symmertical, so fix up the refcount */
> + cam_periph_unlock(periph);
> cam_periph_release(periph);
> }
>
> - cam_periph_unlock(periph);
> -
> return (error);
> }
>
>
> Modified: head/sys/cam/scsi/scsi_sg.c
> ==============================================================================
> --- head/sys/cam/scsi/scsi_sg.c Sun Dec 21 04:40:02 2008 (r186370)
> +++ head/sys/cam/scsi/scsi_sg.c Sun Dec 21 06:20:11 2008 (r186371)
> @@ -399,13 +399,13 @@ sgopen(struct cdev *dev, int flags, int
>
> if ((softc->flags & SG_FLAG_OPEN) == 0) {
> softc->flags |= SG_FLAG_OPEN;
> + cam_periph_unlock(periph);
> } else {
> /* Device closes aren't symmetrical, fix up the refcount. */
> + cam_periph_unlock(periph);
> cam_periph_release(periph);
> }
>
> - cam_periph_unlock(periph);
> -
> return (error);
> }
>
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"
>
>
Thanks a lot.
Ganbold
>
>
--
Writing is easy; all you do is sit staring at the blank sheet of paper
until drops of blood form on your forehead. -- Gene Fowler
More information about the svn-src-all
mailing list