00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef BTRFS_CO_H
00024 #define BTRFS_CO_H
00025
00026 #include "storage/Container.h"
00027 #include "storage/Btrfs.h"
00028
00029
00030 namespace storage
00031 {
00032 class SystemInfo;
00033
00034
00035 class BtrfsCo : public Container
00036 {
00037 friend class Storage;
00038
00039 public:
00040
00041 BtrfsCo(Storage * const s);
00042 BtrfsCo(Storage * const s, SystemInfo& systeminfo);
00043 BtrfsCo(const BtrfsCo& c);
00044 virtual ~BtrfsCo();
00045
00046 void addFromVolume( const Volume& v, string& uuid );
00047 void eraseVolume( Volume* v );
00048
00049 bool existSubvolume( const string& device, const string& name );
00050 int createSubvolume( const string& device, const string& name );
00051 int removeSubvolume( const string& device, const string& name );
00052 int extendVolume( const string& device, const string& dev );
00053 int extendVolume( const string& device, const list<string>& devs );
00054 int shrinkVolume( const string& device, const string& dev );
00055 int shrinkVolume( const string& device, const list<string>& devs );
00056 bool deviceToUuid( const string& device, string& uuid );
00057
00058 int doRemove( Volume* v );
00059
00060 void changeDeviceName( const string& old, const string& nw );
00061
00062 static storage::CType staticType() { return storage::BTRFSC; }
00063 friend std::ostream& operator<< (std::ostream&, const BtrfsCo& );
00064
00065 int commitChanges( CommitStage stage, Volume* vol );
00066 void getToCommit( storage::CommitStage stage, list<const Container*>& col,
00067 list<const Volume*>& vo ) const;
00068
00069 int resizeVolume( Volume* v, Container* r_co, Volume* r_v,
00070 unsigned long long newSize );
00071 int removeVolume( Volume* v );
00072 int removeVolume( Volume* v, bool quiet );
00073 int removeUuid( const string& uuid );
00074 bool equalContent( const Container& rhs ) const;
00075 void saveData(xmlNode* node) const;
00076 string fakeUuid();
00077
00078 virtual void logDifferenceWithVolumes(std::ostream& log, const Container& rhs) const;
00079 virtual void logData(const string& Dir) const;
00080
00081
00082 protected:
00083
00084
00085 typedef CastIterator<VIter, Btrfs *> BtrfsInter;
00086 typedef CastIterator<CVIter, const Btrfs *> BtrfsCInter;
00087 template< class Pred >
00088 struct BtrfsPI { typedef ContainerIter<Pred, BtrfsInter> type; };
00089 template< class Pred >
00090 struct BtrfsCPI { typedef ContainerIter<Pred, BtrfsCInter> type; };
00091 typedef CheckFnc<const Btrfs> CheckFncBtrfs;
00092 typedef CheckerIterator< CheckFncBtrfs, BtrfsPI<CheckFncBtrfs>::type,
00093 BtrfsInter, Btrfs > BtrfsPIterator;
00094 typedef CheckerIterator< CheckFncBtrfs, BtrfsCPI<CheckFncBtrfs>::type,
00095 BtrfsCInter, const Btrfs > BtrfsCPIterator;
00096 typedef DerefIterator<BtrfsPIterator,Btrfs> BtrfsIter;
00097 typedef DerefIterator<BtrfsCPIterator,const Btrfs> ConstBtrfsIter;
00098 typedef IterPair<BtrfsIter> BtrfsPair;
00099 typedef IterPair<ConstBtrfsIter> ConstBtrfsPair;
00100
00101 BtrfsPair btrfsPair( bool (* Check)( const Btrfs& )=NULL)
00102 {
00103 return( BtrfsPair( btrfsBegin( Check ), btrfsEnd( Check ) ));
00104 }
00105 BtrfsIter btrfsBegin( bool (* Check)( const Btrfs& )=NULL)
00106 {
00107 IterPair<BtrfsInter> p( (BtrfsInter(begin())), (BtrfsInter(end())) );
00108 return( BtrfsIter( BtrfsPIterator( p, Check )) );
00109 }
00110 BtrfsIter btrfsEnd( bool (* Check)( const Btrfs& )=NULL)
00111 {
00112 IterPair<BtrfsInter> p( (BtrfsInter(begin())), (BtrfsInter(end())) );
00113 return( BtrfsIter( BtrfsPIterator( p, Check, true )) );
00114 }
00115
00116 ConstBtrfsPair btrfsPair( bool (* Check)( const Btrfs& )=NULL) const
00117 {
00118 return( ConstBtrfsPair( btrfsBegin( Check ), btrfsEnd( Check ) ));
00119 }
00120 ConstBtrfsIter btrfsBegin( bool (* Check)( const Btrfs& )=NULL) const
00121 {
00122 IterPair<BtrfsCInter> p( (BtrfsCInter(begin())), (BtrfsCInter(end())) );
00123 return( ConstBtrfsIter( BtrfsCPIterator( p, Check )) );
00124 }
00125 ConstBtrfsIter btrfsEnd( bool (* Check)( const Btrfs& )=NULL) const
00126 {
00127 IterPair<BtrfsCInter> p( (BtrfsCInter(begin())), (BtrfsCInter(end())) );
00128 return( ConstBtrfsIter( BtrfsCPIterator( p, Check, true )) );
00129 }
00130
00131 void getBtrfsData(SystemInfo& systeminfo);
00132 bool findBtrfs( const string& uuid, BtrfsIter& i );
00133 void addBtrfs( Btrfs* m );
00134
00135 virtual void print( std::ostream& s ) const { s << *this; }
00136 virtual Container* getCopy() const { return( new BtrfsCo( *this ) ); }
00137
00138 private:
00139
00140 BtrfsCo& operator=(const BtrfsCo&);
00141
00142 };
00143
00144 }
00145
00146 #endif