Author: mpatelcz Date: Thu Nov 5 17:27:14 2009 New Revision: 59350 URL: http://svn.opensuse.org/viewcvs/yast?rev=59350&view=rev Log: Rework after review Modified: branches/tmp/mpatelcz/SP1-md/libstorage/src/MdPartCo.cc Modified: branches/tmp/mpatelcz/SP1-md/libstorage/src/MdPartCo.cc URL: http://svn.opensuse.org/viewcvs/yast/branches/tmp/mpatelcz/SP1-md/libstorage/src/MdPartCo.cc?rev=59350&r1=59349&r2=59350&view=diff ============================================================================== --- branches/tmp/mpatelcz/SP1-md/libstorage/src/MdPartCo.cc (original) +++ branches/tmp/mpatelcz/SP1-md/libstorage/src/MdPartCo.cc Thu Nov 5 17:27:14 2009 @@ -42,6 +42,7 @@ #include "y2storage/Storage.h" #include "y2storage/StorageDefines.h" #include "y2storage/Regex.h" +#include "y2storage/EtcRaidtab.h" namespace storage @@ -60,7 +61,7 @@ getMajorMinor(); - active = del_ptable = false; + del_ptable = false; disk = NULL; /* First Initialize RAID properties. */ @@ -68,13 +69,6 @@ /* Initialize 'disk' part, partitions.*/ init( ppart ); - is_copy = false; - if( sto->instsys() == false ) - { - handlingMd = true; - } - devHandled.push_back(name); - y2mil("MdPartCo (nm=" << nm << ", dev=" << dev << ", level=" << md_type << ", disks=" << devs << ") ready."); } @@ -87,23 +81,6 @@ disk = NULL; } y2deb("destructed MdPartCo : " << dev); - - if( is_copy == false ) - { - for(list<string>::iterator i = devHandled.begin(); - i != devHandled.end(); - i++) - { - if( nm == undevName(*i) ) - { - devHandled.remove((*i)); - } - } - if( devHandled.empty() && !sto->instsys() ) - { - handlingMd = false; - } - } } bool MdPartCo::isMdPart(const string& name) @@ -372,7 +349,6 @@ y2mil( " nm: " << nm << " size_k: " << size_k); createDisk( ppart ); getVolumes( ppart ); - active = true; } void @@ -504,17 +480,25 @@ } // Makes complete partition name (like md125p5) -string MdPartCo::numToName( unsigned num ) const +string MdPartCo::numToName( unsigned mdNum ) const { string ret = nm; - if( num>0 ) + if( mdNum>0 ) { ret += "p"; - ret += decString(num); + ret += decString(mdNum); } return( ret ); } +int MdPartCo::nr() +{ + int n; + nm.erase(0,2) >> n; + return n; +} + + // // Assumption is that we're using /dev not /dev/md // directory. @@ -1050,12 +1034,12 @@ info.spares += " "; } info.level = md_type; - info.state = md_state; info.nr = mnr; info.parity = md_parity; info.uuid = md_uuid; info.sb_ver = sb_ver; info.chunk = chunk_size; + info.md_name = md_name; tinfo = info; } @@ -1082,7 +1066,8 @@ std::ostream& operator<< (std::ostream& s, const MdPartCo& d ) { s << *((Container*)&d); - s << " MdNr:" << d.mnr + s << " Name:" << d.md_name + << " MdNr:" << d.mnr << " PNum:" << d.num_part; if( !d.udev_id.empty() ) s << " UdevId:" << d.udev_id; @@ -1134,6 +1119,10 @@ log += " SbVer:" + sb_ver + "-->" + d.sb_ver; if( md_uuid!=d.md_uuid ) log += " MD-UUID:" + md_uuid + "-->" + d.md_uuid; + if( md_name!=d.md_name ) + { + log += " MDName:" + md_uuid + "-->" + d.md_uuid; + } if( destrSb!=d.destrSb ) { if( d.destrSb ) @@ -1212,8 +1201,14 @@ spare == mdp->spare && md_uuid == mdp->md_uuid && destrSb == mdp->destrSb && - parent_container == mdp->parent_container); - + md_name == mdp->md_name); + if( ret ) + { + if( sb_ver == "imsm" || sb_ver == "ddf" ) + { + ret = ret && (parent_container == mdp->parent_container); + } + } if( ret ) { ConstMdPartPair pp = mdpartPair(); @@ -1247,6 +1242,7 @@ destrSb = rhs.destrSb; devs = rhs.devs; spare = rhs.spare; + md_name = rhs.md_name; udev_path = rhs.udev_path; udev_id = rhs.udev_id; @@ -1263,7 +1259,6 @@ } updatePointers(true); num_part = rhs.num_part; - is_copy = true; } bool MdPartCo::isMdName(const string& name) @@ -1714,24 +1709,9 @@ void MdPartCo::activate( bool val, const string& tmpDir ) { - y2milestone( "old active:%d val:%d tmp:%s", active, val, tmpDir.c_str() ); if( active!=val ) { - SystemCmd c; - if( val ) - { - string mdconf = tmpDir + "/mdadm.conf"; - string cmd = "echo 1 > /sys/module/md_mod/parameters/start_ro"; - c.execute( cmd ); - cmd = MDADMBIN " --examine --scan --config=partitions >" + mdconf; - c.execute( cmd ); - cmd = MDADMBIN " --assemble --scan --config=" + mdconf; - c.execute( cmd ); - } - else - { - c.execute(MDADMBIN " --stop --scan"); - } + MdCo::activate(val,tmpDir); active = val; } } @@ -1924,64 +1904,94 @@ } -// No '/dev/' please. -bool MdPartCo::isHandled(const string& name) -{ - if( devHandled.empty() ) + + +void +MdPartCo::initTab() { - return false; + if( tab==NULL && !getStorage()->instsys() ) + tab = new EtcRaidtab( getStorage()->root() ); } - string dev; - string::size_type pos; - // Check who called it. Md or Dm. - if( name.find("md") == 0 ) +void +MdPartCo::syncRaidtab() { - // Md Device. - dev = name; + delete tab; + string d = getStorage()->root()+"/etc"; + if( !checkDir( d ) ) + createPath( d ); + tab = new EtcRaidtab( getStorage()->root() ); + updateEntry(); } - else if ( (pos=name.find("isw_")) == 0 ) + +void MdPartCo::updateEntry( void ) { - // DM raid is asking. - // isw_xxxxxxx_Name - Name will be link in /dev/md/Name to /dev/mdXXX - dev = name; - dev.erase(0,4); - pos = dev.find("_"); - if( pos == string::npos ) - { - return false; - } - dev.erase(0,pos+1); - string link = "/dev/md/" + dev; - string tmpDev; + initTab(); + if( tab ) + { + list<string> lines; + list<string> devices; + raidtabLines(lines); + getDevs( devices ); + tab->updateEntry( nr(), lines, mdadmLine(), devices ); + } + } - if( readlink(link,tmpDev) == -1 ) - { - return false; - } - pos = tmpDev.find_last_of("/"); - if( pos != string::npos ) - { - tmpDev.erase(0,pos+1); - dev = tmpDev; - } - else - { - dev = tmpDev; - } +string MdPartCo::mdadmLine() const + { + string line = "ARRAY " + device() + " level=" + pName(); + line += " UUID=" + md_uuid; + y2mil("line:" << line); + return( line ); } - for( list<string>::const_iterator i = devHandled.begin(); - i != devHandled.end(); - i++) +void MdPartCo::raidtabLines( list<string>& lines ) const { - if( *i == dev) - { - return true; - } + lines.clear(); + lines.push_back( "raiddev " + device() ); + string tmp = " raid-level "; + switch( md_type ) + { + case RAID1: + tmp += "1"; + break; + case RAID5: + tmp += "5"; + break; + case RAID6: + tmp += "6"; + break; + case RAID10: + tmp += "10"; + break; + case MULTIPATH: + tmp += "multipath"; + break; + default: + tmp += "0"; + break; + } + lines.push_back( tmp ); + lines.push_back( " nr-raid-disks " + decString(devs.size())); + lines.push_back( " nr-spare-disks " + decString(spare.size())); + lines.push_back( " persistent-superblock 1" ); + if( md_parity!=PAR_NONE ) + lines.push_back( " parity-algorithm " + ptName()); + if( chunk_size>0 ) + lines.push_back( " chunk-size " + decString(chunk_size)); + unsigned cnt = 0; + for( list<string>::const_iterator i=devs.begin(); i!=devs.end(); ++i ) + { + lines.push_back( " device " + *i); + lines.push_back( " raid-disk " + decString(cnt++)); + } + cnt = 0; + for( list<string>::const_iterator i=spare.begin(); i!=spare.end(); ++i ) + { + lines.push_back( " device " + *i); + lines.push_back( " spare-disk " + decString(cnt++)); + } } - return false; -} string MdPartCo::md_names[] = { "unknown", "raid0", "raid1", "raid5", "raid6", @@ -2004,9 +2014,12 @@ bool MdPartCo::handlingMd = false; -list<string> MdPartCo::devHandled; +void MdPartCo::logData( const string& Dir ) {} +<<<<<<< .mine +======= void MdPartCo::logData( const string& Dir ) {} +>>>>>>> .r59349 } -- To unsubscribe, e-mail: yast-commit+unsubscribe@opensuse.org For additional commands, e-mail: yast-commit+help@opensuse.org