VirtualBox

Changeset 64152 in vbox


Ignore:
Timestamp:
Oct 5, 2016 12:05:35 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
111128
Message:

DrvSCSI,VSCSI: Fix detection of new media, need to recalculate the number of sectors when the medium has changed

Location:
trunk/src/VBox/Devices/Storage
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DrvSCSI.cpp

    r64150 r64152  
    12421242    if (pThis->pDrvMount)
    12431243    {
    1244         if (pThis->pDrvMedia->pfnGetSize(pThis->pDrvMedia))
     1244        if (pThis->pDrvMount->pfnIsMounted(pThis->pDrvMount))
    12451245        {
    12461246            rc = VINF_SUCCESS; VSCSILunMountNotify(pThis->hVScsiLun);
     
    12741274    pThis->pDrvMediaEx = NULL;
    12751275    pThis->pDrvMount = NULL;
     1276
     1277    VSCSILunUnmountNotify(pThis->hVScsiLun);
    12761278}
    12771279
     
    14921494    if (pThis->pDrvMount)
    14931495    {
    1494         if (pThis->pDrvMedia->pfnGetSize(pThis->pDrvMedia))
     1496        if (pThis->pDrvMount->pfnIsMounted(pThis->pDrvMount))
    14951497        {
    14961498            rc = VINF_SUCCESS; VSCSILunMountNotify(pThis->hVScsiLun);
  • trunk/src/VBox/Devices/Storage/VSCSI/VSCSILunMmc.cpp

    r64132 r64152  
    747747    RT_ZERO(aReply);
    748748
     749    LogFlowFunc(("pVScsiLunMmc=%#p pVScsiReq=%#p cbMaxTransfer=%zu\n",
     750                 pVScsiLunMmc, pVScsiReq, cbMaxTransfer));
     751
    749752    do
    750753    {
     
    763766                aReply[6] = 0x00;
    764767                aReply[7] = 0x00;
     768                pVScsiLunMmc->Core.fReady = true;
    765769                break;
    766770
     
    800804                break;
    801805        }
     806
     807        LogFlowFunc(("OldStatus=%u NewStatus=%u\n", OldStatus, NewStatus));
     808
    802809    } while (!ASMAtomicCmpXchgU32((volatile uint32_t *)&pVScsiLunMmc->MediaEventStatus, NewStatus, OldStatus));
    803810
     
    838845    unsigned        uCmd = pVScsiReq->pbCDB[0];
    839846
     847    LogFlowFunc(("pVScsiLun=%#p{.fReady=%RTbool, .fMediaPresent=%RTbool} pVScsiReq=%#p{.pbCdb[0]=%#x}\n",
     848                 pVScsiLun, pVScsiLun->fReady, pVScsiLun->fMediaPresent, pVScsiReq, uCmd));
     849
    840850    /*
    841851     * GET CONFIGURATION, GET EVENT/STATUS NOTIFICATION, INQUIRY, and REQUEST SENSE commands
     
    843853     * needs to report CHECK CONDITION in that case.
    844854     */
    845     if (!pVScsiLunMmc->Core.fReady && uCmd != SCSI_INQUIRY)
     855    if (   !pVScsiLunMmc->Core.fReady
     856        && uCmd != SCSI_INQUIRY
     857        && uCmd != SCSI_GET_CONFIGURATION
     858        && uCmd != SCSI_GET_EVENT_STATUS_NOTIFICATION)
    846859    {
    847860        /*
     
    12601273{
    12611274    PVSCSILUNMMC pVScsiLunMmc = (PVSCSILUNMMC)pVScsiLun;
    1262 
    1263     uint32_t OldStatus, NewStatus;
    1264     do
    1265     {
    1266         OldStatus = ASMAtomicReadU32((volatile uint32_t *)&pVScsiLunMmc->MediaEventStatus);
    1267         switch (OldStatus)
     1275    uint64_t cbDisk = 0;
     1276    int rc = vscsiLunMediumGetSize(pVScsiLun, &cbDisk);
     1277    if (RT_SUCCESS(rc))
     1278    {
     1279        pVScsiLunMmc->cSectors = cbDisk / pVScsiLunMmc->cbSector;
     1280
     1281        uint32_t OldStatus, NewStatus;
     1282        do
    12681283        {
    1269             case MMCEVENTSTATUSTYPE_MEDIA_CHANGED:
    1270             case MMCEVENTSTATUSTYPE_MEDIA_REMOVED:
    1271                 /* no change, we will send "medium removed" + "medium inserted" */
    1272                 NewStatus = MMCEVENTSTATUSTYPE_MEDIA_CHANGED;
    1273                 break;
    1274             default:
    1275                 NewStatus = MMCEVENTSTATUSTYPE_MEDIA_NEW;
    1276                 break;
    1277         }
    1278     } while (!ASMAtomicCmpXchgU32((volatile uint32_t *)&pVScsiLunMmc->MediaEventStatus,
    1279                                   NewStatus, OldStatus));
    1280 
    1281     ASMAtomicXchgU32(&pVScsiLunMmc->u32MediaTrackType, MMC_MEDIA_TYPE_UNKNOWN);
    1282     return VINF_SUCCESS;
     1284            OldStatus = ASMAtomicReadU32((volatile uint32_t *)&pVScsiLunMmc->MediaEventStatus);
     1285            switch (OldStatus)
     1286            {
     1287                case MMCEVENTSTATUSTYPE_MEDIA_CHANGED:
     1288                case MMCEVENTSTATUSTYPE_MEDIA_REMOVED:
     1289                    /* no change, we will send "medium removed" + "medium inserted" */
     1290                    NewStatus = MMCEVENTSTATUSTYPE_MEDIA_CHANGED;
     1291                    break;
     1292                default:
     1293                    NewStatus = MMCEVENTSTATUSTYPE_MEDIA_NEW;
     1294                    break;
     1295            }
     1296        } while (!ASMAtomicCmpXchgU32((volatile uint32_t *)&pVScsiLunMmc->MediaEventStatus,
     1297                                      NewStatus, OldStatus));
     1298
     1299        ASMAtomicXchgU32(&pVScsiLunMmc->u32MediaTrackType, MMC_MEDIA_TYPE_UNKNOWN);
     1300    }
     1301
     1302    return rc;
    12831303}
    12841304
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette