svn commit: r213843 - stable/7/sys/cam/scsi
Jaakko Heinonen
jh at FreeBSD.org
Thu Oct 14 18:02:32 UTC 2010
Author: jh
Date: Thu Oct 14 18:02:31 2010
New Revision: 213843
URL: http://svn.freebsd.org/changeset/base/213843
Log:
MFC r200036 by scottl:
Fix several cases where the periph lock was held over malloc.
PR: kern/130735
Modified:
stable/7/sys/cam/scsi/scsi_cd.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/cam/scsi/scsi_cd.c
==============================================================================
--- stable/7/sys/cam/scsi/scsi_cd.c Thu Oct 14 17:57:52 2010 (r213842)
+++ stable/7/sys/cam/scsi/scsi_cd.c Thu Oct 14 18:02:31 2010 (r213843)
@@ -2666,12 +2666,10 @@ cdioctl(struct disk *dp, u_long cmd, voi
authinfo = (struct dvd_authinfo *)addr;
- cam_periph_lock(periph);
if (cmd == DVDIOCREPORTKEY)
error = cdreportkey(periph, authinfo);
else
error = cdsendkey(periph, authinfo);
- cam_periph_unlock(periph);
break;
}
case DVDIOCREADSTRUCTURE: {
@@ -2679,9 +2677,7 @@ cdioctl(struct disk *dp, u_long cmd, voi
dvdstruct = (struct dvd_struct *)addr;
- cam_periph_lock(periph);
error = cdreaddvdstructure(periph, dvdstruct);
- cam_periph_unlock(periph);
break;
}
@@ -3726,8 +3722,6 @@ cdreportkey(struct cam_periph *periph, s
databuf = NULL;
lba = 0;
- ccb = cdgetccb(periph, /* priority */ 1);
-
switch (authinfo->format) {
case DVD_REPORT_AGID:
length = sizeof(struct scsi_report_key_data_agid);
@@ -3753,9 +3747,7 @@ cdreportkey(struct cam_periph *periph, s
length = 0;
break;
default:
- error = EINVAL;
- goto bailout;
- break; /* NOTREACHED */
+ return (EINVAL);
}
if (length != 0) {
@@ -3763,6 +3755,8 @@ cdreportkey(struct cam_periph *periph, s
} else
databuf = NULL;
+ cam_periph_lock(periph);
+ ccb = cdgetccb(periph, /* priority */ 1);
scsi_report_key(&ccb->csio,
/* retries */ 1,
@@ -3863,12 +3857,14 @@ cdreportkey(struct cam_periph *periph, s
goto bailout;
break; /* NOTREACHED */
}
+
bailout:
+ xpt_release_ccb(ccb);
+ cam_periph_unlock(periph);
+
if (databuf != NULL)
free(databuf, M_DEVBUF);
- xpt_release_ccb(ccb);
-
return(error);
}
@@ -3883,8 +3879,6 @@ cdsendkey(struct cam_periph *periph, str
error = 0;
databuf = NULL;
- ccb = cdgetccb(periph, /* priority */ 1);
-
switch(authinfo->format) {
case DVD_SEND_CHALLENGE: {
struct scsi_report_key_data_challenge *challenge_data;
@@ -3936,11 +3930,12 @@ cdsendkey(struct cam_periph *periph, str
break;
}
default:
- error = EINVAL;
- goto bailout;
- break; /* NOTREACHED */
+ return (EINVAL);
}
+ cam_periph_lock(periph);
+ ccb = cdgetccb(periph, /* priority */ 1);
+
scsi_send_key(&ccb->csio,
/* retries */ 1,
/* cbfcnp */ cddone,
@@ -3955,13 +3950,12 @@ cdsendkey(struct cam_periph *periph, str
error = cdrunccb(ccb, cderror, /*cam_flags*/CAM_RETRY_SELTO,
/*sense_flags*/SF_RETRY_UA);
-bailout:
+ xpt_release_ccb(ccb);
+ cam_periph_unlock(periph);
if (databuf != NULL)
free(databuf, M_DEVBUF);
- xpt_release_ccb(ccb);
-
return(error);
}
@@ -3979,8 +3973,6 @@ cdreaddvdstructure(struct cam_periph *pe
/* The address is reserved for many of the formats */
address = 0;
- ccb = cdgetccb(periph, /* priority */ 1);
-
switch(dvdstruct->format) {
case DVD_STRUCT_PHYSICAL:
length = sizeof(struct scsi_read_dvd_struct_data_physical);
@@ -3998,13 +3990,7 @@ cdreaddvdstructure(struct cam_periph *pe
length = sizeof(struct scsi_read_dvd_struct_data_manufacturer);
break;
case DVD_STRUCT_CMI:
- error = ENODEV;
- goto bailout;
-#ifdef notyet
- length = sizeof(struct scsi_read_dvd_struct_data_copy_manage);
- address = dvdstruct->address;
-#endif
- break; /* NOTREACHED */
+ return (ENODEV);
case DVD_STRUCT_PROTDISCID:
length = sizeof(struct scsi_read_dvd_struct_data_prot_discid);
break;
@@ -4021,21 +4007,9 @@ cdreaddvdstructure(struct cam_periph *pe
length = sizeof(struct scsi_read_dvd_struct_data_spare_area);
break;
case DVD_STRUCT_RMD_LAST:
- error = ENODEV;
- goto bailout;
-#ifdef notyet
- length = sizeof(struct scsi_read_dvd_struct_data_rmd_borderout);
- address = dvdstruct->address;
-#endif
- break; /* NOTREACHED */
+ return (ENODEV);
case DVD_STRUCT_RMD_RMA:
- error = ENODEV;
- goto bailout;
-#ifdef notyet
- length = sizeof(struct scsi_read_dvd_struct_data_rmd);
- address = dvdstruct->address;
-#endif
- break; /* NOTREACHED */
+ return (ENODEV);
case DVD_STRUCT_PRERECORDED:
length = sizeof(struct scsi_read_dvd_struct_data_leadin);
break;
@@ -4043,13 +4017,7 @@ cdreaddvdstructure(struct cam_periph *pe
length = sizeof(struct scsi_read_dvd_struct_data_disc_id);
break;
case DVD_STRUCT_DCB:
- error = ENODEV;
- goto bailout;
-#ifdef notyet
- length = sizeof(struct scsi_read_dvd_struct_data_dcb);
- address = dvdstruct->address;
-#endif
- break; /* NOTREACHED */
+ return (ENODEV);
case DVD_STRUCT_LIST:
/*
* This is the maximum allocation length for the READ DVD
@@ -4061,9 +4029,7 @@ cdreaddvdstructure(struct cam_periph *pe
length = 65535;
break;
default:
- error = EINVAL;
- goto bailout;
- break; /* NOTREACHED */
+ return (EINVAL);
}
if (length != 0) {
@@ -4071,6 +4037,9 @@ cdreaddvdstructure(struct cam_periph *pe
} else
databuf = NULL;
+ cam_periph_lock(periph);
+ ccb = cdgetccb(periph, /* priority */ 1);
+
scsi_read_dvd_structure(&ccb->csio,
/* retries */ 1,
/* cbfcnp */ cddone,
@@ -4158,13 +4127,14 @@ cdreaddvdstructure(struct cam_periph *pe
min(sizeof(dvdstruct->data), dvdstruct->length));
break;
}
+
bailout:
+ xpt_release_ccb(ccb);
+ cam_periph_unlock(periph);
if (databuf != NULL)
free(databuf, M_DEVBUF);
- xpt_release_ccb(ccb);
-
return(error);
}
More information about the svn-src-stable-7
mailing list