00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef MD_CO_H
00024 #define MD_CO_H
00025
00026 #include "storage/Container.h"
00027 #include "storage/Md.h"
00028
00029 namespace storage
00030 {
00031
00032 class EtcMdadm;
00033
00034 class MdCo : public Container
00035 {
00036 friend class Storage;
00037
00038 public:
00039
00040 MdCo(Storage * const s);
00041 MdCo(Storage * const s, SystemInfo& systeminfo);
00042 MdCo(const MdCo& c);
00043 virtual ~MdCo();
00044
00045 static storage::CType staticType() { return storage::MD; }
00046 friend std::ostream& operator<< (std::ostream&, const MdCo& );
00047
00048 int createMd(unsigned num, MdType type, const list<string>& devs, const list<string>& spares);
00049 int removeMd( unsigned num, bool destroySb=true );
00050 int extendMd(unsigned num, const list<string>& devs, const list<string>& spares);
00051 int updateMd(unsigned num, const list<string>& devs, const list<string>& spares);
00052 int shrinkMd(unsigned num, const list<string>& devs, const list<string>& spares);
00053 int changeMdType( unsigned num, storage::MdType ptype );
00054 int changeMdChunk( unsigned num, unsigned long chunk );
00055 int changeMdParity( unsigned num, storage::MdParity ptype );
00056 int checkMd( unsigned num );
00057 int getMdState(unsigned num, MdStateInfo& info);
00058 bool equalContent( const Container& rhs ) const;
00059
00060 virtual void logDifferenceWithVolumes(std::ostream& log, const Container& rhs) const;
00061
00062 void syncMdadm(EtcMdadm* mdadm) const;
00063
00064 void changeDeviceName( const string& old, const string& nw );
00065
00066 static void activate(bool val, const string& tmpDir);
00067 int removeVolume( Volume* v );
00068
00069
00070 list<unsigned> usedNumbers() const;
00071
00072 protected:
00073
00074
00075 typedef CastIterator<VIter, Md *> MdInter;
00076 typedef CastIterator<CVIter, const Md *> MdCInter;
00077 template< class Pred >
00078 struct MdPI { typedef ContainerIter<Pred, MdInter> type; };
00079 template< class Pred >
00080 struct MdCPI { typedef ContainerIter<Pred, MdCInter> type; };
00081 typedef CheckFnc<const Md> CheckFncMd;
00082 typedef CheckerIterator< CheckFncMd, MdPI<CheckFncMd>::type,
00083 MdInter, Md > MdPIterator;
00084 typedef CheckerIterator< CheckFncMd, MdCPI<CheckFncMd>::type,
00085 MdCInter, const Md > MdCPIterator;
00086 typedef DerefIterator<MdPIterator,Md> MdIter;
00087 typedef DerefIterator<MdCPIterator,const Md> ConstMdIter;
00088 typedef IterPair<MdIter> MdPair;
00089 typedef IterPair<ConstMdIter> ConstMdPair;
00090
00091 MdPair mdPair( bool (* Check)( const Md& )=NULL)
00092 {
00093 return( MdPair( mdBegin( Check ), mdEnd( Check ) ));
00094 }
00095 MdIter mdBegin( bool (* Check)( const Md& )=NULL)
00096 {
00097 IterPair<MdInter> p( (MdInter(begin())), (MdInter(end())) );
00098 return( MdIter( MdPIterator( p, Check )) );
00099 }
00100 MdIter mdEnd( bool (* Check)( const Md& )=NULL)
00101 {
00102 IterPair<MdInter> p( (MdInter(begin())), (MdInter(end())) );
00103 return( MdIter( MdPIterator( p, Check, true )) );
00104 }
00105
00106 ConstMdPair mdPair( bool (* Check)( const Md& )=NULL) const
00107 {
00108 return( ConstMdPair( mdBegin( Check ), mdEnd( Check ) ));
00109 }
00110 ConstMdIter mdBegin( bool (* Check)( const Md& )=NULL) const
00111 {
00112 IterPair<MdCInter> p( (MdCInter(begin())), (MdCInter(end())) );
00113 return( ConstMdIter( MdCPIterator( p, Check )) );
00114 }
00115 ConstMdIter mdEnd( bool (* Check)( const Md& )=NULL) const
00116 {
00117 IterPair<MdCInter> p( (MdCInter(begin())), (MdCInter(end())) );
00118 return( ConstMdIter( MdCPIterator( p, Check, true )) );
00119 }
00120
00121 bool findMd( unsigned num, MdIter& i );
00122 bool findMd( unsigned num );
00123 bool findMd( const string& dev, MdIter& i );
00124 bool findMd( const string& dev );
00125 int checkUse(const list<string>& dev, const list<string>& spares) const;
00126 void addMd( Md* m );
00127
00128 virtual void print( std::ostream& s ) const { s << *this; }
00129 virtual Container* getCopy() const { return( new MdCo( *this ) ); }
00130
00131 int doCreate( Volume* v );
00132 int doRemove( Volume* v );
00133
00134
00135 bool isHandledByMdPart(const string& name) const;
00136
00137 static bool active;
00138
00139 private:
00140
00141 MdCo& operator=(const MdCo&);
00142
00143 };
00144
00145 }
00146
00147 #endif