int CDiskBase::GetDiskGeometryInfo(U32 dev_type, U32 disk_id)
{
int iFd = -1, ret = -1 ;
tDISK_INFO *pt = GetDiskInfoPoint(dev_type, disk_id);
if (pt == NULL)
return -1;
iFd = open(pt->disk_name, O_RDWR);
if (iFd == -1)
{
pt->disk_status = DISK_STATUS_OPEN_DEV_ERROR ;
LOG_DEBUG_MSG_ERROR("", "GetDisk GeometryInfo, open disk dev (%s) error !\n", pt->disk_name ) ;
return DISK_STATUS_OPEN_DEV_ERROR;
}
U64 total_byte_size = 0; ///<磁盘的总扇区数, 每个扇区大小512BYTES
ret = ioctl(iFd, BLKGETSIZE64, &total_byte_size);
if (ret != -1)
{
if (total_byte_size == 0)
{
close(iFd);
pt->disk_status = DISK_STATUS_GEOMETRY_INFO_ERROR;
LOG_DEBUG_MSG_ERROR("", "total_sectors == 0, error.\n");
return DISK_STATUS_GEOMETRY_INFO_ERROR;
}
else
{
pt->total_byte_size = total_byte_size;
pt->total_sectors = total_byte_size / SECTOR_SIZE;
}
}
else
{
close(iFd);
pt->disk_status = DISK_STATUS_IOCTL_ERROR;
LOG_DEBUG_MSG_ERROR("", "disk dev (%s) IOCTL BLKGETSIZE64 error .\n", pt->disk_name);
return DISK_STATUS_IOCTL_ERROR;
}
struct hd_geometry geometry;
ret = ioctl(iFd, HDIO_GETGEO, &geometry);
if ( ret != -1 )
{
if (geometry.sectors == 0)
{
close(iFd);
pt->disk_status = DISK_STATUS_GEOMETRY_INFO_ERROR;
LOG_DEBUG_MSG_ERROR("", "geometry.sectors == 0, error.\n" );
return DISK_STATUS_GEOMETRY_INFO_ERROR;
}
else
{
pt->heads_of_disk = geometry.heads;
pt->sectors_per_cylinder = geometry.sectors;
pt->cylinders_of_disk = geometry.cylinders;
}
}
else
{
close(iFd);
pt->disk_status = DISK_STATUS_IOCTL_ERROR;
LOG_DEBUG_MSG_ERROR("", "IOCTL HDIO_GETGEO error.\n" );
return DISK_STATUS_IOCTL_ERROR;
}
close(iFd);
pt->disk_status = DISK_STATUS_OK;
return DISK_STATUS_OK;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。