Mercurial > illumos > illumos-gate
changeset 3618:b218ea84704e
6509575 sd(7d) un_f_mmc_writable_media flag not updated after media change
contributed by Juergen Keil<jk@tools.de>
author | cg149915 |
---|---|
date | Wed, 07 Feb 2007 20:48:10 -0800 |
parents | 4b744d361365 |
children | efc467cfdb71 |
files | usr/src/uts/common/io/scsi/targets/sd.c |
diffstat | 1 files changed, 35 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/io/scsi/targets/sd.c Wed Feb 07 16:54:58 2007 -0800 +++ b/usr/src/uts/common/io/scsi/targets/sd.c Wed Feb 07 20:48:10 2007 -0800 @@ -1407,10 +1407,10 @@ static int sd_send_scsi_SYNCHRONIZE_CACHE_biodone(struct buf *bp); static int sd_send_scsi_GET_CONFIGURATION(struct sd_lun *un, struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen, - uchar_t *bufaddr, uint_t buflen); + uchar_t *bufaddr, uint_t buflen, int path_flag); static int sd_send_scsi_feature_GET_CONFIGURATION(struct sd_lun *un, struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen, - uchar_t *bufaddr, uint_t buflen, char feature); + uchar_t *bufaddr, uint_t buflen, char feature, int path_flag); static int sd_send_scsi_MODE_SENSE(struct sd_lun *un, int cdbsize, uchar_t *bufaddr, size_t buflen, uchar_t page_code, int path_flag); static int sd_send_scsi_MODE_SELECT(struct sd_lun *un, int cdbsize, @@ -1499,7 +1499,7 @@ /* * Function Prototype for the non-512 support (DVDRAM, MO etc.) functions. */ -static void sd_check_for_writable_cd(struct sd_lun *un); +static void sd_check_for_writable_cd(struct sd_lun *un, int path_flag); static int sd_wm_cache_constructor(void *wm, void *un, int flags); static void sd_wm_cache_destructor(void *wm, void *un); static struct sd_w_map *sd_range_lock(struct sd_lun *un, daddr_t startb, @@ -3185,7 +3185,7 @@ rtn = sd_send_scsi_feature_GET_CONFIGURATION(un, &com, rqbuf_rw, SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN, - RANDOM_WRITABLE); + RANDOM_WRITABLE, SD_PATH_STANDARD); if (rtn != 0) { kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); kmem_free(rqbuf_rw, SENSE_LENGTH); @@ -3197,7 +3197,7 @@ rtn = sd_send_scsi_feature_GET_CONFIGURATION(un, &com, rqbuf_hd, SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN, - HARDWARE_DEFECT_MANAGEMENT); + HARDWARE_DEFECT_MANAGEMENT, SD_PATH_STANDARD); if (rtn == 0) { /* * We have good information, check for random writable @@ -3223,12 +3223,17 @@ * to determine if the media is writable * * Arguments: un - driver soft state (unit) structure + * path_flag - SD_PATH_DIRECT to use the USCSI "direct" + * chain and the normal command waitq, or + * SD_PATH_DIRECT_PRIORITY to use the USCSI + * "direct" chain and bypass the normal command + * waitq. * * Context: Never called at interrupt context. */ static void -sd_check_for_writable_cd(struct sd_lun *un) +sd_check_for_writable_cd(struct sd_lun *un, int path_flag) { struct uscsi_cmd com; uchar_t *out_data; @@ -3256,7 +3261,7 @@ rqbuf = kmem_zalloc(SENSE_LENGTH, KM_SLEEP); rtn = sd_send_scsi_GET_CONFIGURATION(un, &com, rqbuf, SENSE_LENGTH, - out_data, SD_PROFILE_HEADER_LEN); + out_data, SD_PROFILE_HEADER_LEN, path_flag); mutex_enter(SD_MUTEX(un)); if (rtn == 0) { @@ -3280,7 +3285,7 @@ mutex_exit(SD_MUTEX(un)); buf = kmem_zalloc(BUFLEN_MODE_CDROM_CAP, KM_SLEEP); status = sd_send_scsi_MODE_SENSE(un, CDB_GROUP1, (uchar_t *)buf, - BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, SD_PATH_DIRECT); + BUFLEN_MODE_CDROM_CAP, MODEPAGE_CDROM_CAP, path_flag); mutex_enter(SD_MUTEX(un)); if (status != 0) { /* command failed; just return */ @@ -3326,7 +3331,7 @@ rtn = sd_send_scsi_feature_GET_CONFIGURATION(un, &com, rqbuf_rw, SENSE_LENGTH, out_data_rw, SD_CURRENT_FEATURE_LEN, - RANDOM_WRITABLE); + RANDOM_WRITABLE, path_flag); if (rtn != 0) { kmem_free(out_data_rw, SD_CURRENT_FEATURE_LEN); kmem_free(rqbuf_rw, SENSE_LENGTH); @@ -3339,7 +3344,7 @@ rtn = sd_send_scsi_feature_GET_CONFIGURATION(un, &com, rqbuf_hd, SENSE_LENGTH, out_data_hd, SD_CURRENT_FEATURE_LEN, - HARDWARE_DEFECT_MANAGEMENT); + HARDWARE_DEFECT_MANAGEMENT, path_flag); mutex_enter(SD_MUTEX(un)); if (rtn == 0) { /* @@ -9280,7 +9285,7 @@ * Check if the media in the device is writable or not. */ if (!is_valid && ISCD(un)) { - sd_check_for_writable_cd(un); + sd_check_for_writable_cd(un, SD_PATH_DIRECT); } } else { @@ -17217,6 +17222,12 @@ (uint64_t)un->un_tgt_blocksize); } + + /* + * Check if the media in the device is writable or not + */ + sd_check_for_writable_cd(un, SD_PATH_DIRECT_PRIORITY); + /* * Note: Maybe let the strategy/partitioning chain worry about getting * valid geometry. @@ -18507,6 +18518,7 @@ * rqbuflen * bufaddr * buflen + * path_flag * * Return Code: 0 - Success * errno return code from sd_send_scsi_cmd() @@ -18517,7 +18529,8 @@ static int sd_send_scsi_GET_CONFIGURATION(struct sd_lun *un, struct uscsi_cmd *ucmdbuf, - uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen) + uchar_t *rqbuf, uint_t rqbuflen, uchar_t *bufaddr, uint_t buflen, + int path_flag) { char cdb[CDB_GROUP1]; int status; @@ -18552,7 +18565,7 @@ ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; status = sd_send_scsi_cmd(SD_GET_DEV(un), ucmdbuf, FKIOCTL, - UIO_SYSSPACE, SD_PATH_STANDARD); + UIO_SYSSPACE, path_flag); switch (status) { case 0: @@ -18605,7 +18618,7 @@ static int sd_send_scsi_feature_GET_CONFIGURATION(struct sd_lun *un, struct uscsi_cmd *ucmdbuf, uchar_t *rqbuf, uint_t rqbuflen, - uchar_t *bufaddr, uint_t buflen, char feature) + uchar_t *bufaddr, uint_t buflen, char feature, int path_flag) { char cdb[CDB_GROUP1]; int status; @@ -18641,7 +18654,7 @@ ucmdbuf->uscsi_flags = USCSI_RQENABLE|USCSI_SILENT|USCSI_READ; status = sd_send_scsi_cmd(SD_GET_DEV(un), ucmdbuf, FKIOCTL, - UIO_SYSSPACE, SD_PATH_STANDARD); + UIO_SYSSPACE, path_flag); switch (status) { case 0: @@ -20261,7 +20274,8 @@ /* Allow SCMD_GET_CONFIGURATION to MMC devices only */ if (un->un_f_mmc_cap == TRUE) { rtn = sd_send_scsi_GET_CONFIGURATION(un, &com, rqbuf, - SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN); + SENSE_LENGTH, out_data, SD_PROFILE_HEADER_LEN, + SD_PATH_STANDARD); if (rtn) { /* @@ -20511,6 +20525,11 @@ sd_update_block_info(un, lbasize, capacity); + /* + * Check if the media in the device is writable or not + */ + sd_check_for_writable_cd(un, SD_PATH_DIRECT); + mutex_exit(SD_MUTEX(un)); cmlb_invalidate(un->un_cmlbhandle, (void *)SD_PATH_DIRECT); if ((cmlb_validate(un->un_cmlbhandle, 0,