yast2-storage

MdPartCo.h

Go to the documentation of this file.
00001 /*
00002  * File: MdPartCo.cc
00003  *
00004  * Declaration of MdPartCo class which represents single MD Device (RAID
00005  * Volume) like md126 which is a Container for partitions.
00006  *
00007  * Copyright (c) 2009, Intel Corporation.
00008  * Copyright (c) [2009-2010] Novell, Inc.
00009  *
00010  * This program is free software; you can redistribute it and/or modify it
00011  * under the terms and conditions of the GNU General Public License,
00012  * version 2, as published by the Free Software Foundation.
00013  *
00014  * This program is distributed in the hope it will be useful, but WITHOUT
00015  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00016  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
00017  * more details.
00018  *
00019  * You should have received a copy of the GNU General Public License along with
00020  * this program; if not, write to the Free Software Foundation, Inc.,
00021  * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
00022  */
00023 
00024 #ifndef MD_PART_CO_H
00025 #define MD_PART_CO_H
00026 
00027 #include <list>
00028 
00029 #include "storage/Container.h"
00030 #include "storage/Disk.h"
00031 #include "storage/Md.h"
00032 #include "storage/MdPart.h"
00033 
00034 namespace storage
00035 {
00036     class Storage;
00037     class SystemInfo;
00038     class Region;
00039 
00040 
00047 class MdPartCo : public Container
00048     {
00049     friend class Storage;
00050         friend class Md;
00051 
00052     public:
00053 
00054         MdPartCo(Storage* s, const string& name, const string& device, SystemInfo& systeminfo);
00055     MdPartCo(const MdPartCo& c);
00056     virtual ~MdPartCo();
00057 
00058     const string& labelName() const { return disk->labelName(); }
00059         virtual list<string> udevId() const { return udev_id; }
00060     unsigned numPartitions() const { return disk->numPartitions(); }
00061     static storage::CType staticType() { return storage::MDPART; }
00062     friend std::ostream& operator<< (std::ostream&, const MdPartCo& );
00063 
00064         void setUdevData(SystemInfo& systeminfo);
00065 
00066         virtual string procName() const { return nm; }
00067         virtual string sysfsPath() const;
00068 
00069         static bool notDeleted(const MdPartCo& c) { return !c.deleted(); }
00070 
00071         int getMdPartCoState(MdPartCoStateInfo& info) const;
00072 
00073     int createPartition( storage::PartitionType type, long unsigned start,
00074         long unsigned len, string& device,
00075         bool checkRelaxed=false );
00076     int createPartition( long unsigned len, string& device,
00077         bool checkRelaxed=false );
00078     int createPartition( storage::PartitionType type, string& device );
00079     int removePartition( unsigned nr );
00080     int changePartitionId( unsigned nr, unsigned id );
00081     int forgetChangePartitionId( unsigned nr );
00082         int changePartitionArea(unsigned nr, const Region& cylRegion, bool checkRelaxed = false);
00083     int nextFreePartition(storage::PartitionType type, unsigned& nr,
00084         string& device) const;
00085     int destroyPartitionTable( const string& new_label );
00086         int freeCylindersAroundPartition(const MdPart* p, unsigned long& freeCylsBefore,
00087                                          unsigned long& freeCylsAfter) const;
00088     int resizePartition( MdPart* p, unsigned long newCyl );
00089     int resizeVolume( Volume* v, unsigned long long newSize );
00090     int removeVolume( Volume* v );
00091     int removeMdPart();
00092 
00093     unsigned maxPrimary() const { return disk->maxPrimary(); }
00094     bool extendedPossible() const { return disk->extendedPossible(); }
00095     unsigned maxLogical() const { return disk->maxLogical(); }
00096 
00097     unsigned int numPrimary() const { return disk->numPrimary(); }
00098     bool hasExtended() const { return disk->hasExtended(); }
00099     unsigned int numLogical() const { return disk->numLogical(); }
00100 
00101     void getUnusedSpace(std::list<Region>& free, bool all = true, bool logical = false) const
00102     { disk->getUnusedSpace(free, all, logical); }
00103 
00104     unsigned long long cylinderToKb( unsigned long val ) const
00105     { return disk->cylinderToKb( val ); }
00106     unsigned long kbToCylinder( unsigned long long val ) const
00107     { return disk->kbToCylinder( val ); }
00108 
00109         string getPartName(unsigned nr) const;
00110         string getPartDevice(unsigned nr) const;
00111 
00112     virtual void getCommitActions(list<commitAction>& l) const;
00113     virtual void getToCommit(CommitStage stage, list<const Container*>& col,
00114                              list<const Volume*>& vol) const;
00115     virtual int commitChanges( storage::CommitStage stage );
00116     int commitChanges( storage::CommitStage stage, Volume* vol );
00117 
00118     Partition* getPartition( unsigned nr, bool del );
00119 
00120         virtual list<string> getUsing() const;
00121 
00122     void getInfo( storage::MdPartCoInfo& info ) const;
00123     bool equalContent( const Container& rhs ) const;
00124 
00125         void logDifference(std::ostream& log, const MdPartCo& rhs) const;
00126         virtual void logDifferenceWithVolumes(std::ostream& log, const Container& rhs) const;
00127 
00128     MdPartCo& operator= ( const MdPartCo& rhs );
00129     static string undevName( const string& name );
00130 
00131         static list<string> getMdRaids(SystemInfo& systeminfo);
00132 
00133         void syncMdadm(EtcMdadm* mdadm) const;
00134 
00135     /* Returns Md number. */
00136     unsigned nr() const { return mnr; }
00137 
00138         unsigned long chunkSizeK() const { return chunk_k; }
00139 
00140     storage::MdType personality() const { return md_type; }
00141 
00142         const string& getMdUuid() const { return md_uuid; }
00143 
00144     /* Devices from which RAID is composed. */
00145         list<string> getDevs(bool all = true, bool spare = false) const;
00146 
00147     static void activate( bool val, const string& tmpDir  );
00148 
00149     static bool isActive() { return active; }
00150 
00151         static bool hasPartitionTable(const string& name, SystemInfo& systeminfo);
00152         static bool hasFileSystem(const string& name, SystemInfo& systeminfo);
00153 
00154     static bool matchRegex( const string& dev );
00155     static bool mdStringNum( const string& name, unsigned& num );
00156 
00157     // This function will scan for MD RAIDs and will return
00158     // list with detected RAID names.
00159     static bool scanForRaid(list<string>& raidNames);
00160 
00161     /* filterMdPartCo
00162      * Get list of detected MD RAIDs and filters them for
00163      * those which can be handled by MdPartCo.
00164      */
00165         static list<string> filterMdPartCo(const list<string>& raidList, SystemInfo& systeminfo,
00166                                            bool instsys);
00167 
00168     protected:
00169     // iterators over partitions
00170     // protected typedefs for iterators over partitions
00171     typedef CastIterator<VIter, MdPart *> MdPartInter;
00172     typedef CastIterator<CVIter, const MdPart *> MdPartCInter;
00173     template< class Pred >
00174         struct MdPartPI { typedef ContainerIter<Pred, MdPartInter> type; };
00175     template< class Pred >
00176         struct MdPartCPI { typedef ContainerIter<Pred, MdPartCInter> type; };
00177     typedef CheckFnc<const MdPart> CheckFncMdPart;
00178     typedef CheckerIterator< CheckFncMdPart, MdPartPI<CheckFncMdPart>::type,
00179                              MdPartInter, MdPart > MdPartPIterator;
00180     typedef CheckerIterator< CheckFncMdPart, MdPartCPI<CheckFncMdPart>::type,
00181                              MdPartCInter, const MdPart > MdPartCPIterator;
00182     typedef DerefIterator<MdPartPIterator,MdPart> MdPartIter;
00183     typedef DerefIterator<MdPartCPIterator,const MdPart> ConstMdPartIter;
00184     typedef IterPair<MdPartIter> MdPartPair;
00185     typedef IterPair<ConstMdPartIter> ConstMdPartPair;
00186 
00187     MdPartPair mdpartPair( bool (* CheckMdPart)( const MdPart& )=NULL)
00188         {
00189         return( MdPartPair( mdpartBegin( CheckMdPart ), mdpartEnd( CheckMdPart ) ));
00190         }
00191     MdPartIter mdpartBegin( bool (* CheckMdPart)( const MdPart& )=NULL)
00192         {
00193         IterPair<MdPartInter> p( (MdPartInter(begin())), (MdPartInter(end())) );
00194         return( MdPartIter( MdPartPIterator( p, CheckMdPart )) );
00195         }
00196     MdPartIter mdpartEnd( bool (* CheckMdPart)( const MdPart& )=NULL)
00197         {
00198         IterPair<MdPartInter> p( (MdPartInter(begin())), (MdPartInter(end())) );
00199         return( MdPartIter( MdPartPIterator( p, CheckMdPart, true )) );
00200         }
00201 
00202     ConstMdPartPair mdpartPair( bool (* CheckMdPart)( const MdPart& )=NULL) const
00203         {
00204         return( ConstMdPartPair( mdpartBegin( CheckMdPart ), mdpartEnd( CheckMdPart ) ));
00205         }
00206     ConstMdPartIter mdpartBegin( bool (* CheckMdPart)( const MdPart& )=NULL) const
00207         {
00208         IterPair<MdPartCInter> p( (MdPartCInter(begin())), (MdPartCInter(end())) );
00209         return( ConstMdPartIter( MdPartCPIterator( p, CheckMdPart )) );
00210         }
00211     ConstMdPartIter mdpartEnd( bool (* CheckMdPart)( const MdPart& )=NULL) const
00212         {
00213         IterPair<MdPartCInter> p( (MdPartCInter(begin())), (MdPartCInter(end())) );
00214         return( ConstMdPartIter( MdPartCPIterator( p, CheckMdPart, true )) );
00215         }
00216 
00217     virtual void print( std::ostream& s ) const { s << *this; }
00218     virtual Container* getCopy() const { return( new MdPartCo( *this ) ); }
00219     void activate_part( bool val );
00220     void init(SystemInfo& systeminfo);
00221     void createDisk(SystemInfo& systeminfo);
00222     void getVolumes(const ProcParts& ppart);
00223     void updatePointers( bool invalid=false );
00224     void updateMinor();
00225     virtual void newP( MdPart*& dm, unsigned num, Partition* p );
00226     int addNewDev( string& device );
00227     int updateDelDev();
00228     void handleWholeDevice();
00229     void removeFromMemory();
00230     void removePresentPartitions();
00231     bool validPartition( const Partition* p );
00232     bool findMdPart( unsigned nr, MdPartIter& i );
00233 
00234         bool updateEntry(EtcMdadm* mdadm) const;
00235 
00236     int doCreate( Volume* v );
00237     int doRemove( Volume* v );
00238     int doResize( Volume* v );
00239     int doSetType( MdPart* v );
00240     int doCreateLabel();
00241     virtual int doRemove();
00242     virtual Text removeText( bool doing ) const;
00243     virtual Text setDiskLabelText( bool doing ) const;
00244 
00245     /* Initialize the MD part of object.*/
00246         void initMd(SystemInfo& systeminfo);
00247 
00248     void setSize(unsigned long long size );
00249 
00250     bool isMdPart(const string& name) const;
00251 
00252     void getPartNum(const string& device, unsigned& num) const;
00253 
00254         void unuseDevs() const;
00255 
00256     Disk* disk;
00257 
00258     //Input: 'mdXXX' device.
00259     static CType envSelection(const string& name);
00260     static bool havePartsInProc(const string& name, SystemInfo& systeminfo);
00261 
00262         MdType md_type;
00263         MdParity md_parity;
00264         unsigned long chunk_k;
00265         string md_uuid;
00266         string md_name;         // line in /dev/md/*
00267         string sb_ver;
00268         bool destrSb;
00269         list<string> devs;
00270         list<string> spare;
00271 
00272         list<string> udev_id;
00273 
00274         // In case of IMSM and DDF raids there is 'container'.
00275         bool has_container;
00276         string parent_container;
00277         string parent_uuid;
00278         string parent_md_name;
00279         string parent_metadata;
00280         string parent_member;
00281 
00282     mutable storage::MdPartCoInfo info; // workaround for broken ycp bindings
00283 
00284     static bool active;
00285 
00286     };
00287 }
00288 
00289 #endif