SV_ULONGLONG GetRawVolSize()

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;
}