in host/common/aix/portablehelpersminor.cpp [77:245]
SV_ULONGLONG GetRawVolSize(const std::string sVolume)
{
DebugPrintf(SV_LOG_DEBUG,"ENTERED %s with sVolume = %s\n",FUNCTION_NAME, sVolume.c_str());
SV_ULONGLONG rawsize = 0;
SV_ULONGLONG mulfactor;
unsigned int low, high;
std::stringstream ss;
if(sVolume.empty() == false)
{
ACE_Guard<ACE_Recursive_Thread_Mutex> guard(g_lockforgetbasicvolinfo);
if(guard.locked())
{
std::string sRawVolName = GetRawVolumeName(sVolume);
int fd;
fd = open(sRawVolName.c_str(), O_NDELAY | O_RDONLY);
if(fd != 0)
{
struct devinfo devinfo;
if (ioctl(fd, IOCINFO, &devinfo) != -1)
{
switch(devinfo.devtype)
{
case DD_DISK: /* disk */
if (devinfo.flags & DF_LGDSK)
{
ss << "For DD_DISK, DF_LGDSK is set. "
<< " devinfo.flags = " << (unsigned int)devinfo.flags
<< " bytpsec = " << devinfo.un.dk64.bytpsec
<< " secptrk = " << devinfo.un.dk64.secptrk
<< " trkpcyl = " << devinfo.un.dk64.trkpcyl
<< " lo_numblks = " << devinfo.un.dk64.lo_numblks
<< " segment_size = " << devinfo.un.dk64.segment_size
<< " segment_count = " << devinfo.un.dk64.segment_count
<< " byte_count = " << devinfo.un.dk64.byte_count
<< " hi_numblks = " << devinfo.un.dk64.hi_numblks;
mulfactor = pow(2, sizeof(devinfo.un.dk64.lo_numblks)*8);
low = (unsigned int)devinfo.un.dk64.lo_numblks;
high = (unsigned int)devinfo.un.dk64.hi_numblks;
rawsize = ((mulfactor*high) + low) * devinfo.un.dk64.bytpsec;
}
else
{
ss << "For DD_DISK, DF_LGDSK is not set. "
<< " devinfo.flags = " << (unsigned int)devinfo.flags
<< " bytpsec = " << devinfo.un.dk.bytpsec
<< " secptrk = " << devinfo.un.dk.secptrk
<< " trkpcyl = " << devinfo.un.dk.trkpcyl
<< " numblks = " << devinfo.un.dk.numblks
<< " segment_size = " << devinfo.un.dk.segment_size
<< " segment_count = " << devinfo.un.dk.segment_count
<< " byte_count = " << devinfo.un.dk.byte_count;
low = (unsigned int)devinfo.un.dk.numblks;
rawsize = low * devinfo.un.dk.bytpsec;
}
DebugPrintf(SV_LOG_DEBUG, "For device %s, %s\n", sVolume.c_str(), ss.str().c_str());
break;
case DD_SCDISK: /* scsi disk */
if (devinfo.flags & DF_LGDSK)
{
ss << "For DD_SCDISK, DF_LGDSK is set. "
<< " devinfo.flags = " << (unsigned int)devinfo.flags
<< " blksize = " << devinfo.un.scdk64.blksize
<< " lo_numblks = " << devinfo.un.scdk64.lo_numblks
<< " lo_max_request = " << devinfo.un.scdk64.lo_max_request
<< " segment_size = " << devinfo.un.scdk64.segment_size
<< " segment_count = " << devinfo.un.scdk64.segment_count
<< " byte_count = " << devinfo.un.scdk64.byte_count
<< " hi_numblks = " << devinfo.un.scdk64.hi_numblks
<< " hi_max_request = " << devinfo.un.scdk64.hi_max_request;
mulfactor = pow(2, sizeof(devinfo.un.scdk64.lo_numblks)*8);
low = (unsigned int)devinfo.un.scdk64.lo_numblks;
high = (unsigned int)devinfo.un.scdk64.hi_numblks;
rawsize = ((mulfactor*high) + low) * devinfo.un.scdk64.blksize;
}
else
{
ss << "For DD_SCDISK, DF_LGDSK is not set. "
<< " devinfo.flags = " << (unsigned int)devinfo.flags
<< " blksize = " << devinfo.un.scdk.blksize
<< " numblks = " << devinfo.un.scdk.numblks
<< " max_request = " << devinfo.un.scdk.max_request
<< " segment_size = " << devinfo.un.scdk.segment_size
<< " segment_count = " << devinfo.un.scdk.segment_count
<< " byte_count = " << devinfo.un.scdk.byte_count;
low = (unsigned int)devinfo.un.scdk.numblks;
rawsize = low * devinfo.un.scdk.blksize;
}
DebugPrintf(SV_LOG_DEBUG, "For device %s, %s\n", sVolume.c_str(), ss.str().c_str());
break;
default: /* unknown */
break;
}
}
else
{
DebugPrintf(SV_LOG_ERROR, "ioctl IOCINFO Failed volumepath: %s, error: %s\n", sRawVolName.c_str(), strerror(errno));
}
(void)close(fd);
}
else
{
DebugPrintf(SV_LOG_ERROR, "open() failed for raw volume %s at line %d in file %s with errno = %d\n", sRawVolName.c_str(),
__LINE__, __FILE__, errno);
}
}
else
{
DebugPrintf(SV_LOG_WARNING, "@LINE %d in FILE %s unable to apply lock\n", __LINE__, __FILE__);
}
}
else
{
DebugPrintf(SV_LOG_ERROR, "@ LINE %d in FILE %s, invalid arguement VolumeName\n",
LINE_NO, FILE_NAME);
}
if( rawsize == 0 )
{
std::list<std::string> vgs ;
std::stringstream stream ;
executePipe("lsvg", stream) ;
std::string lvname = sVolume.substr(sVolume.find_last_of("/")+1) ;
while( stream.good() && !stream.eof() )
{
std::string str ;
stream >> str ;
if( str.empty() )
{
break ;
}
vgs.push_back(str) ;
}
stream.clear() ;
stream.str("") ;
int ppsize ;
std::list<std::string>::iterator begIter = vgs.begin() ;
std::list<std::string>::iterator endIter = vgs.end() ;
while(begIter != endIter )
{
std::string cmd = "lsvg -l " ;
cmd += *begIter ;
cmd += " |grep " ;
cmd += lvname ;
executePipe(cmd, stream) ;
if( stream.str().compare("") != 0 )
{
DebugPrintf(SV_LOG_DEBUG, "lv %s belongs to vg %s\n", lvname.c_str(), begIter->c_str()) ;
break ;
}
begIter++ ;
}
stream.str("") ;
stream.clear() ;
executePipe("lsvg " + *begIter+ " |grep 'PP SIZE:' | awk '{print $6}'", stream) ;
stream >> ppsize ;
stream.clear() ;
stream.str("") ;
executePipe("/usr/sbin/lsvg -l " + *begIter+ "| /usr/bin/grep -v " + *begIter+ " | /usr/bin/grep -v 'LV NAME'" + "| /usr/bin/grep " + lvname , stream) ;
std::string name, lvtype, lvstate, mountPt , lps, pps, pvs ;
stream >> name >> lvtype >> lps >> pps >> pvs >> lvstate >> mountPt ;
rawsize = (long)ppsize * boost::lexical_cast<long>(lps) * 1024 * 1024 ;
}
DebugPrintf(SV_LOG_DEBUG,"EXITED %s with rawsize = " ULLSPEC "\n",FUNCTION_NAME, rawsize);
return rawsize;
}