Changeset 38530 in vbox
- Timestamp:
- Aug 25, 2011 2:26:49 PM (14 years ago)
- svn:sync-xref-src-repo-rev:
- 73677
- Location:
- trunk/src/VBox/Devices/Storage/VSCSI
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIDevice.cpp
r32983 r38530 67 67 ScsiInquiryReply.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED; 68 68 cbData = vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, (uint8_t *)&ScsiInquiryReply, sizeof(SCSIINQUIRYDATA)); 69 *prcReq = vscsiReqSenseOkSet( pVScsiReq);69 *prcReq = vscsiReqSenseOkSet(&pVScsiDevice->VScsiSense, pVScsiReq); 70 70 } 71 71 else … … 81 81 */ 82 82 if (vscsiBE2HU32(&pVScsiReq->pbCDB[6]) < 16) 83 *prcReq = vscsiReqSenseErrorSet( pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);83 *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 84 84 else 85 85 { … … 91 91 cbData = vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 92 92 if (cbData < 16) 93 *prcReq = vscsiReqSenseErrorSet( pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);93 *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 94 94 else 95 *prcReq = vscsiReqSenseOkSet( pVScsiReq);95 *prcReq = vscsiReqSenseOkSet(&pVScsiDevice->VScsiSense, pVScsiReq); 96 96 } 97 97 break; … … 99 99 case SCSI_TEST_UNIT_READY: 100 100 { 101 *prcReq = vscsiReqSenseOkSet( pVScsiReq);101 *prcReq = vscsiReqSenseOkSet(&pVScsiDevice->VScsiSense, pVScsiReq); 102 102 break; 103 } 104 case SCSI_REQUEST_SENSE: 105 { 106 /* Descriptor format sense data is not supported and results in an error. */ 107 if ((pVScsiReq->pbCDB[1] & 0x1) != 0) 108 *prcReq = vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 109 else 110 *prcReq = vscsiReqSenseCmd(&pVScsiDevice->VScsiSense, pVScsiReq); 103 111 } 104 112 default: … … 140 148 pVScsiDevice->cLunsMax = 0; 141 149 pVScsiDevice->papVScsiLun = NULL; 150 vscsiSenseInit(&pVScsiDevice->VScsiSense); 142 151 143 152 rc = RTMemCacheCreate(&pVScsiDevice->hCacheReq, sizeof(VSCSIREQINT), 0, UINT32_MAX, … … 282 291 { 283 292 /* LUN not present, report error. */ 284 vscsiReqSenseErrorSet( pVScsiReq,293 vscsiReqSenseErrorSet(&pVScsiDevice->VScsiSense, pVScsiReq, 285 294 SCSI_SENSE_ILLEGAL_REQUEST, 286 295 SCSI_ASC_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION); -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIInternal.h
r33540 r38530 36 36 /** Pointer to a virtual SCSI I/O request. */ 37 37 typedef VSCSIIOREQINT *PVSCSIIOREQINT; 38 /** Pointer to virtual SCSI sense data state. */ 39 typedef struct VSCSISENSE *PVSCSISENSE; 40 41 /** 42 * Virtual SCSI sense data handling. 43 */ 44 typedef struct VSCSISENSE 45 { 46 /** Buffer holding the sense data. */ 47 uint8_t abSenseBuf[32]; 48 } VSCSISENSE; 38 49 39 50 /** … … 52 63 /** Request cache */ 53 64 RTMEMCACHE hCacheReq; 65 /** Sense data handling. */ 66 VSCSISENSE VScsiSense; 54 67 /** Pointer to the array of LUN handles. 55 68 * The index is the LUN id. */ … … 241 254 242 255 /** 256 * Init the sense data state. 257 * 258 * @returns nothing. 259 * @param pVScsiSense The SCSI sense data state to init. 260 */ 261 void vscsiSenseInit(PVSCSISENSE pVScsiSense); 262 263 /** 243 264 * Sets a ok sense code. 244 265 * 245 266 * @returns SCSI status code. 267 * @param pVScsiSense The SCSI sense state to use. 246 268 * @param pVScsiReq The SCSI request. 247 269 */ 248 int vscsiReqSenseOkSet(PVSCSI REQINT pVScsiReq);270 int vscsiReqSenseOkSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq); 249 271 250 272 /** … … 252 274 * 253 275 * @returns SCSI status code. 276 * @param pVScsiSense The SCSI sense state to use. 254 277 * @param pVScsiReq The SCSI request. 255 * @param uSCSISenseKey The SCS isense key to set.278 * @param uSCSISenseKey The SCSI sense key to set. 256 279 * @param uSCSIASC The ASC value. 257 280 */ 258 int vscsiReqSenseErrorSet(PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC); 281 int vscsiReqSenseErrorSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC); 282 283 /** 284 * Process a request sense command. 285 * 286 * @returns SCSI status code. 287 * @param pVScsiSense The SCSI sense state to use. 288 * @param pVScsiReq The SCSI request. 289 */ 290 int vscsiReqSenseCmd(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq); 259 291 260 292 /** … … 289 321 uint32_t vscsiIoReqOutstandingCountGet(PVSCSILUNINT pVScsiLun); 290 322 323 /** 324 * Wrapper for the get medium size I/O callback. 325 * 326 * @returns VBox status code. 327 * @param pVScsiLun The LUN. 328 * @param pcbSize Where to store the size on success. 329 */ 291 330 DECLINLINE(int) vscsiLunMediumGetSize(PVSCSILUNINT pVScsiLun, uint64_t *pcbSize) 292 331 { … … 296 335 } 297 336 337 /** 338 * Wrapper for the I/O request enqueue I/O callback. 339 * 340 * @returns VBox status code. 341 * @param pVScsiLun The LUN. 342 * @param pVScsiIoReq The I/O request to enqueue. 343 */ 298 344 DECLINLINE(int) vscsiLunReqTransferEnqueue(PVSCSILUNINT pVScsiLun, PVSCSIIOREQINT pVScsiIoReq) 299 345 { … … 303 349 } 304 350 351 /** 352 * Wrapper around vscsiReqSenseOkSet() 353 */ 354 DECLINLINE(int) vscsiLunReqSenseOkSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq) 355 { 356 return vscsiReqSenseOkSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq); 357 } 358 359 /** 360 * Wrapper around vscsiReqSenseErrorSet() 361 */ 362 DECLINLINE(int) vscsiLunReqSenseErrorSet(PVSCSILUNINT pVScsiLun, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC) 363 { 364 return vscsiReqSenseErrorSet(&pVScsiLun->pVScsiDevice->VScsiSense, pVScsiReq, uSCSISenseKey, uSCSIASC); 365 } 366 367 305 368 #endif /* ___VSCSIInternal_h */ 306 369 -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSIIoReq.cpp
r32983 r38530 114 114 /** @todo error reporting */ 115 115 if (RT_SUCCESS(rcIoReq)) 116 rcReq = vscsi ReqSenseOkSet(pVScsiReq);116 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 117 117 else if (!fRedoPossible) 118 118 { 119 119 /** @todo Not 100% correct for the write case as the 0x00 ASCQ for write errors 120 120 * is not used for SBC devices. */ 121 rcReq = vscsi ReqSenseErrorSet(pVScsiReq, SCSI_SENSE_MEDIUM_ERROR,122 pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_READ123 ? SCSI_ASC_READ_ERROR124 : SCSI_ASC_WRITE_ERROR);121 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_MEDIUM_ERROR, 122 pVScsiIoReq->enmTxDir == VSCSIIOREQTXDIR_READ 123 ? SCSI_ASC_READ_ERROR 124 : SCSI_ASC_WRITE_ERROR); 125 125 } 126 126 else -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunSbc.cpp
r32983 r38530 91 91 92 92 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, (uint8_t *)&ScsiInquiryReply, sizeof(SCSIINQUIRYDATA)); 93 rcReq = vscsi ReqSenseOkSet(pVScsiReq);93 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 94 94 break; 95 95 } … … 109 109 vscsiH2BEU32(&aReply[4], 512); 110 110 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 111 rcReq = vscsi ReqSenseOkSet(pVScsiReq);111 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 112 112 break; 113 113 } … … 135 135 136 136 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 137 rcReq = vscsi ReqSenseOkSet(pVScsiReq);137 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 138 138 break; 139 139 } … … 222 222 223 223 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 224 rcReq = vscsi ReqSenseOkSet(pVScsiReq);224 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 225 225 break; 226 226 } … … 236 236 case SCSI_START_STOP_UNIT: 237 237 { 238 rcReq = vscsi ReqSenseOkSet(pVScsiReq);238 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 239 239 break; 240 240 } … … 258 258 aReply[3] = 0; 259 259 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 260 rcReq = vscsi ReqSenseOkSet(pVScsiReq);260 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 261 261 break; 262 262 } 263 263 } 264 264 default: 265 rcReq = vscsi ReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET);265 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); 266 266 } 267 267 break; … … 281 281 282 282 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, aReply, sizeof(aReply)); 283 rcReq = vscsi ReqSenseOkSet(pVScsiReq);283 rcReq = vscsiLunReqSenseOkSet(pVScsiLun, pVScsiReq); 284 284 break; 285 285 } 286 286 default: 287 rcReq = vscsi ReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); /* Don't know if this is correct */287 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_INV_FIELD_IN_CMD_PACKET); /* Don't know if this is correct */ 288 288 } 289 289 break; … … 291 291 default: 292 292 //AssertMsgFailed(("Command %#x [%s] not implemented\n", pRequest->pbCDB[0], SCSICmdText(pRequest->pbCDB[0]))); 293 rcReq = vscsi ReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE);293 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_ILLEGAL_OPCODE); 294 294 } 295 295 … … 301 301 if (RT_UNLIKELY(uLbaStart + cSectorTransfer > pVScsiLunSbc->cSectors)) 302 302 { 303 rcReq = vscsi ReqSenseErrorSet(pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR);303 rcReq = vscsiLunReqSenseErrorSet(pVScsiLun, pVScsiReq, SCSI_SENSE_ILLEGAL_REQUEST, SCSI_ASC_LOGICAL_BLOCK_OOR); 304 304 vscsiDeviceReqComplete(pVScsiLun->pVScsiDevice, pVScsiReq, rcReq, false, VINF_SUCCESS); 305 305 } -
trunk/src/VBox/Devices/Storage/VSCSI/VSCSISense.cpp
r28800 r38530 22 22 #include "VSCSIInternal.h" 23 23 24 int vscsiReqSenseOkSet(PVSCSIREQINT pVScsiReq)24 void vscsiSenseInit(PVSCSISENSE pVScsiSense) 25 25 { 26 if (pVScsiReq->cbSense < 14)27 return SCSI_STATUS_OK; 26 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf)); 27 } 28 28 29 AssertMsgReturn(pVScsiReq->pbSense, ("Sense buffer pointer is NULL\n"), SCSI_STATUS_OK); 30 memset(pVScsiReq->pbSense, 0, pVScsiReq->cbSense); 29 int vscsiReqSenseOkSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq) 30 { 31 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf)); 31 32 32 pVScsiReq->pbSense[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */ 33 pVScsiReq->pbSense[2] = SCSI_SENSE_NONE; 34 pVScsiReq->pbSense[7] = 10; 35 pVScsiReq->pbSense[12] = SCSI_ASC_NONE; 36 pVScsiReq->pbSense[13] = SCSI_ASC_NONE; /* Should be ASCQ but it has the same value for success. */ 33 pVScsiSense->abSenseBuf[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */ 34 pVScsiSense->abSenseBuf[2] = SCSI_SENSE_NONE; 35 pVScsiSense->abSenseBuf[7] = 10; 36 pVScsiSense->abSenseBuf[12] = SCSI_ASC_NONE; 37 pVScsiSense->abSenseBuf[13] = SCSI_ASC_NONE; /* Should be ASCQ but it has the same value for success. */ 38 39 if (pVScsiReq->pbSense && pVScsiReq->cbSense) 40 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense)); 37 41 38 42 return SCSI_STATUS_OK; 39 43 } 40 44 41 int vscsiReqSenseErrorSet(PVSCSI REQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC)45 int vscsiReqSenseErrorSet(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq, uint8_t uSCSISenseKey, uint8_t uSCSIASC) 42 46 { 43 AssertMsgReturn(pVScsiReq->cbSense >= 18, ("Sense buffer is not big enough\n"), SCSI_STATUS_OK); 44 AssertMsgReturn(pVScsiReq->pbSense, ("Sense buffer pointer is NULL\n"), SCSI_STATUS_OK); 45 memset(pVScsiReq->pbSense, 0, pVScsiReq->cbSense); 46 pVScsiReq->pbSense[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */ 47 pVScsiReq->pbSense[2] = uSCSISenseKey; 48 pVScsiReq->pbSense[7] = 10; 49 pVScsiReq->pbSense[12] = uSCSIASC; 50 pVScsiReq->pbSense[13] = 0x00; /** @todo: Provide more info. */ 47 memset(pVScsiSense->abSenseBuf, 0, sizeof(pVScsiSense->abSenseBuf)); 48 pVScsiSense->abSenseBuf[0] = (1 << 7) | SCSI_SENSE_RESPONSE_CODE_CURR_FIXED; /* Fixed format */ 49 pVScsiSense->abSenseBuf[2] = uSCSISenseKey; 50 pVScsiSense->abSenseBuf[7] = 10; 51 pVScsiSense->abSenseBuf[12] = uSCSIASC; 52 pVScsiSense->abSenseBuf[13] = 0x00; /** @todo: Provide more info. */ 53 54 if (pVScsiReq->pbSense && pVScsiReq->cbSense) 55 memcpy(pVScsiReq->pbSense, pVScsiSense->abSenseBuf, RT_MIN(sizeof(pVScsiSense->abSenseBuf), pVScsiReq->cbSense)); 56 51 57 return SCSI_STATUS_CHECK_CONDITION; 52 58 } 53 59 60 int vscsiReqSenseCmd(PVSCSISENSE pVScsiSense, PVSCSIREQINT pVScsiReq) 61 { 62 /* Copy the current sense data to the buffer. */ 63 vscsiCopyToIoMemCtx(&pVScsiReq->IoMemCtx, pVScsiSense->abSenseBuf, sizeof(pVScsiSense->abSenseBuf)); 64 return vscsiReqSenseOkSet(pVScsiSense, pVScsiReq); 65 } 66
Note:
See TracChangeset
for help on using the changeset viewer.