Improved swap and dmraid mountpoint detection

svn path=/trunk/; revision=1097
This commit is contained in:
Curtis Gedak 2009-03-16 22:55:24 +00:00
parent 9cc21e2eec
commit eda5bf16aa
3 changed files with 64 additions and 6 deletions

View File

@ -1,3 +1,8 @@
2009-03-16 Curtis Gedak <gedakc@gmail.com>
* include/GParted_Core.h,
src/GParted_Core.cc: Improved swap and dmraid mountpoint detection.
2009-03-14 Curtis Gedak <gedakc@gmail.com> 2009-03-14 Curtis Gedak <gedakc@gmail.com>
* src/GParted_Core.cc: Added initial support for dmraid devices. * src/GParted_Core.cc: Added initial support for dmraid devices.

View File

@ -59,6 +59,9 @@ private:
void set_thread_status_message( Glib::ustring msg ) ; void set_thread_status_message( Glib::ustring msg ) ;
void read_mountpoints_from_file( const Glib::ustring & filename, void read_mountpoints_from_file( const Glib::ustring & filename,
std::map< Glib::ustring, std::vector<Glib::ustring> > & map ) ; std::map< Glib::ustring, std::vector<Glib::ustring> > & map ) ;
void read_mountpoints_from_file_swaps(
const Glib::ustring & filename,
std::map< Glib::ustring, std::vector<Glib::ustring> > & map ) ;
std::vector<Glib::ustring> get_alternate_paths( const Glib::ustring & path ) ; std::vector<Glib::ustring> get_alternate_paths( const Glib::ustring & path ) ;
void set_device_partitions( Device & device ) ; void set_device_partitions( Device & device ) ;
GParted::FILESYSTEM get_filesystem() ; GParted::FILESYSTEM get_filesystem() ;

View File

@ -585,7 +585,7 @@ void GParted_Core::init_maps()
fstab_info .clear() ; fstab_info .clear() ;
read_mountpoints_from_file( "/proc/mounts", mount_info ) ; read_mountpoints_from_file( "/proc/mounts", mount_info ) ;
read_mountpoints_from_file( "/proc/swaps", mount_info ) ; read_mountpoints_from_file_swaps( "/proc/swaps", mount_info ) ;
read_mountpoints_from_file( "/etc/mtab", mount_info ) ; read_mountpoints_from_file( "/etc/mtab", mount_info ) ;
read_mountpoints_from_file( "/etc/fstab", fstab_info ) ; read_mountpoints_from_file( "/etc/fstab", fstab_info ) ;
@ -659,6 +659,26 @@ void GParted_Core::read_mountpoints_from_file( const Glib::ustring & filename,
} }
} }
void GParted_Core::read_mountpoints_from_file_swaps(
const Glib::ustring & filename,
std::map< Glib::ustring, std::vector<Glib::ustring> > & map )
{
std::string line ;
std::string node ;
std::ifstream file( filename .c_str() ) ;
if ( file )
{
while ( getline( file, line ) )
{
node = Utils::regexp_label( line, "^(/[^ ]+)" ) ;
if ( node .size() > 0 )
map[ node ] .push_back( "" /* no mountpoint for swap */ ) ;
}
file .close() ;
}
}
std::vector<Glib::ustring> GParted_Core::get_alternate_paths( const Glib::ustring & path ) std::vector<Glib::ustring> GParted_Core::get_alternate_paths( const Glib::ustring & path )
{ {
std::vector<Glib::ustring> paths ; std::vector<Glib::ustring> paths ;
@ -698,7 +718,12 @@ void GParted_Core::set_device_partitions( Device & device )
// This mismatch causes incorrect identification of busy partitions in ped_partition_is_busy(). // This mismatch causes incorrect identification of busy partitions in ped_partition_is_busy().
if ( dmraid .is_dmraid_device( device .get_path() ) ) if ( dmraid .is_dmraid_device( device .get_path() ) )
{ {
iter_mp = mount_info .find( lp_path ) ; //Try device_name + partition_number
iter_mp = mount_info .find( device .get_path() + Utils::num_to_str( lp_partition ->num ) ) ;
if ( iter_mp != mount_info .end() )
partition_is_busy = true ;
//Try device_name + p + partition_number
iter_mp = mount_info .find( device .get_path() + "p" + Utils::num_to_str( lp_partition ->num ) ) ;
if ( iter_mp != mount_info .end() ) if ( iter_mp != mount_info .end() )
partition_is_busy = true ; partition_is_busy = true ;
} }
@ -1012,6 +1037,7 @@ void GParted_Core::insert_unallocated( const Glib::ustring & device_path,
void GParted_Core::set_mountpoints( std::vector<Partition> & partitions ) void GParted_Core::set_mountpoints( std::vector<Partition> & partitions )
{ {
DMRaid dmraid ; //Use cache of dmraid device information
for ( unsigned int t = 0 ; t < partitions .size() ; t++ ) for ( unsigned int t = 0 ; t < partitions .size() ; t++ )
{ {
if ( ( partitions[ t ] .type == GParted::TYPE_PRIMARY || if ( ( partitions[ t ] .type == GParted::TYPE_PRIMARY ||
@ -1027,11 +1053,35 @@ void GParted_Core::set_mountpoints( std::vector<Partition> & partitions )
{ {
for ( unsigned int i = 0 ; i < partitions[ t ] .get_paths() .size() ; i++ ) for ( unsigned int i = 0 ; i < partitions[ t ] .get_paths() .size() ; i++ )
{ {
iter_mp = mount_info .find( partitions[ t ] .get_paths()[ i ] ) ; //Handle dmraid devices differently because there may be more
if ( iter_mp != mount_info .end() ) // than one partition name.
// E.g., there might be names with and/or without a 'p' between
// the device name and partition number.
if ( dmraid .is_dmraid_device( partitions[ t ] .device_path ) )
{ {
partitions[ t ] .add_mountpoints( iter_mp ->second ) ; //Try device_name + partition_number
break ; iter_mp = mount_info .find( partitions[ t ] .device_path + Utils::num_to_str( partitions[ t ] .partition_number ) ) ;
if ( iter_mp != mount_info .end() )
{
partitions[ t ] .add_mountpoints( iter_mp ->second ) ;
break ;
}
//Try device_name + p + partition_number
iter_mp = mount_info .find( partitions[ t ] .device_path + "p" + Utils::num_to_str( partitions[ t ] .partition_number ) ) ;
if ( iter_mp != mount_info .end() )
{
partitions[ t ] .add_mountpoints( iter_mp ->second ) ;
break ;
}
}
else
{
iter_mp = mount_info .find( partitions[ t ] .get_paths()[ i ] ) ;
if ( iter_mp != mount_info .end() )
{
partitions[ t ] .add_mountpoints( iter_mp ->second ) ;
break ;
}
} }
} }