Changeset 24144 in vbox
- Timestamp:
- Oct 28, 2009 4:00:44 PM (15 years ago)
- File:
-
- 1 edited
-
trunk/src/VBox/Devices/Storage/ISCSIHDDCore.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/ISCSIHDDCore.cpp
r23594 r24144 309 309 /** Number of re-login retries when a connection fails. */ 310 310 uint32_t cISCSIRetries; 311 /** Size of volume in sectors. */312 uint32_t cVolume;313 311 /** Sector size on volume. */ 314 312 uint32_t cbSector; 313 /** Size of volume in sectors. */ 314 uint64_t cVolume; 315 315 /** Total volume size in bytes. Easiert that multiplying the above values all the time. */ 316 316 uint64_t cbSize; … … 2463 2463 uint8_t sense[32]; 2464 2464 uint8_t data8[8]; 2465 uint8_t data12[12]; 2465 2466 2466 2467 /* … … 2588 2589 * Determine sector size and capacity of the volume immediately. 2589 2590 */ 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 */ 2602 2596 2603 2597 sr.enmXfer = SCSIXFER_FROM_TARGET; … … 2606 2600 sr.cbI2TData = 0; 2607 2601 sr.pcvI2TData = NULL; 2608 sr.cbT2IData = sizeof(data 8);2609 sr.pvT2IData = data 8;2602 sr.cbT2IData = sizeof(data12); 2603 sr.pvT2IData = data12; 2610 2604 sr.cbSense = sizeof(sense); 2611 2605 sr.pvSense = sense; … … 2614 2608 if (RT_SUCCESS(rc)) 2615 2609 { 2616 pImage->cVolume = (data8[0] << 24) | (data8[1] << 16) | (data8[2] << 8) | data8[3];2610 pImage->cVolume = RT_BE2H_U64(*(uint64_t *)&data12[0]); 2617 2611 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; 2620 2614 if (pImage->cVolume == 0 || pImage->cbSector == 0) 2621 2615 { … … 2628 2622 else 2629 2623 { 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 } 2632 2667 } 2633 2668
Note:
See TracChangeset
for help on using the changeset viewer.

