VirtualBox

Changeset 24144 in vbox


Ignore:
Timestamp:
Oct 28, 2009 4:00:44 PM (15 years ago)
Author:
vboxsync
Message:

Storage/iSCSI: try to get the capacity with a command that supports 64bit sector numbers, and fall back to the old one which does only 32bit if that fails

File:
1 edited

Legend:

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

    r23594 r24144  
    309309    /** Number of re-login retries when a connection fails. */
    310310    uint32_t            cISCSIRetries;
    311     /** Size of volume in sectors. */
    312     uint32_t            cVolume;
    313311    /** Sector size on volume. */
    314312    uint32_t            cbSector;
     313    /** Size of volume in sectors. */
     314    uint64_t            cVolume;
    315315    /** Total volume size in bytes. Easiert that multiplying the above values all the time. */
    316316    uint64_t            cbSize;
     
    24632463    uint8_t sense[32];
    24642464    uint8_t data8[8];
     2465    uint8_t data12[12];
    24652466
    24662467    /*
     
    25882589     * Determine sector size and capacity of the volume immediately.
    25892590     */
    2590     uint8_t cdb_cap[10];
    2591 
    2592     cdb_cap[0] = SCSI_READ_CAPACITY;
    2593     cdb_cap[1] = 0;         /* reserved */
    2594     cdb_cap[2] = 0;         /* reserved */
    2595     cdb_cap[3] = 0;         /* reserved */
    2596     cdb_cap[4] = 0;         /* reserved */
    2597     cdb_cap[5] = 0;         /* reserved */
    2598     cdb_cap[6] = 0;         /* reserved */
    2599     cdb_cap[7] = 0;         /* reserved */
    2600     cdb_cap[8] = 0;         /* reserved */
    2601     cdb_cap[9] = 0;         /* control */
     2591    uint8_t cdb_cap[16];
     2592
     2593    memset(cdb_cap, '\0', sizeof(cdb_cap));
     2594    cdb_cap[0] = SCSI_SERVICE_ACTION_IN_16;
     2595    cdb_cap[1] = SCSI_SVC_ACTION_IN_READ_CAPACITY_16;   /* subcommand */
    26022596
    26032597    sr.enmXfer = SCSIXFER_FROM_TARGET;
     
    26062600    sr.cbI2TData = 0;
    26072601    sr.pcvI2TData = NULL;
    2608     sr.cbT2IData = sizeof(data8);
    2609     sr.pvT2IData = data8;
     2602    sr.cbT2IData = sizeof(data12);
     2603    sr.pvT2IData = data12;
    26102604    sr.cbSense = sizeof(sense);
    26112605    sr.pvSense = sense;
     
    26142608    if (RT_SUCCESS(rc))
    26152609    {
    2616         pImage->cVolume = (data8[0] << 24) | (data8[1] << 16) | (data8[2] << 8) | data8[3];
     2610        pImage->cVolume = RT_BE2H_U64(*(uint64_t *)&data12[0]);
    26172611        pImage->cVolume++;
    2618         pImage->cbSector = (data8[4] << 24) | (data8[5] << 16) | (data8[6] << 8) | data8[7];
    2619         pImage->cbSize = (uint64_t)(pImage->cVolume) * pImage->cbSector;
     2612        pImage->cbSector = RT_BE2H_U32(*(uint32_t *)&data12[8]);
     2613        pImage->cbSize = pImage->cVolume * pImage->cbSector;
    26202614        if (pImage->cVolume == 0 || pImage->cbSector == 0)
    26212615        {
     
    26282622    else
    26292623    {
    2630         LogRel(("iSCSI: Could not determine capacity of target %s, rc=%Rrc\n", pImage->pszTargetName, rc));
    2631         goto out;
     2624        uint8_t cdb_capfb[10];
     2625
     2626        cdb_capfb[0] = SCSI_READ_CAPACITY;
     2627        cdb_capfb[1] = 0;   /* reserved */
     2628        cdb_capfb[2] = 0;   /* reserved */
     2629        cdb_capfb[3] = 0;   /* reserved */
     2630        cdb_capfb[4] = 0;   /* reserved */
     2631        cdb_capfb[5] = 0;   /* reserved */
     2632        cdb_capfb[6] = 0;   /* reserved */
     2633        cdb_capfb[7] = 0;   /* reserved */
     2634        cdb_capfb[8] = 0;   /* reserved */
     2635        cdb_capfb[9] = 0;   /* control */
     2636
     2637        sr.enmXfer = SCSIXFER_FROM_TARGET;
     2638        sr.cbCmd = sizeof(cdb_capfb);
     2639        sr.pvCmd = cdb_capfb;
     2640        sr.cbI2TData = 0;
     2641        sr.pcvI2TData = NULL;
     2642        sr.cbT2IData = sizeof(data8);
     2643        sr.pvT2IData = data8;
     2644        sr.cbSense = sizeof(sense);
     2645        sr.pvSense = sense;
     2646
     2647        rc = iscsiCommand(pImage, &sr);
     2648        if (RT_SUCCESS(rc))
     2649        {
     2650            pImage->cVolume = (data8[0] << 24) | (data8[1] << 16) | (data8[2] << 8) | data8[3];
     2651            pImage->cVolume++;
     2652            pImage->cbSector = (data8[4] << 24) | (data8[5] << 16) | (data8[6] << 8) | data8[7];
     2653            pImage->cbSize = pImage->cVolume * pImage->cbSector;
     2654            if (pImage->cVolume == 0 || pImage->cbSector == 0)
     2655            {
     2656                rc = iscsiError(pImage, VERR_VD_ISCSI_INVALID_TYPE,
     2657                                RT_SRC_POS, N_("iSCSI: fallback capacity detectio for target address %s, target name %s, SCSI LUN %lld reports media sector count=%lu sector size=%lu"),
     2658                                pImage->pszTargetAddress, pImage->pszTargetName,
     2659                                pImage->LUN, pImage->cVolume, pImage->cbSector);
     2660            }
     2661        }
     2662        else
     2663        {
     2664            LogRel(("iSCSI: Could not determine capacity of target %s, rc=%Rrc\n", pImage->pszTargetName, rc));
     2665            goto out;
     2666        }
    26322667    }
    26332668
Note: See TracChangeset for help on using the changeset viewer.

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