gparted r1093 - in trunk: . src
- From: gedakc svn gnome org
- To: svn-commits-list gnome org
- Subject: gparted r1093 - in trunk: . src
- Date: Sat, 14 Mar 2009 20:09:28 +0000 (UTC)
Author: gedakc
Date: Sat Mar 14 20:09:28 2009
New Revision: 1093
URL: http://svn.gnome.org/viewvc/gparted?rev=1093&view=rev
Log:
Added initial support for dmraid devices
Modified:
trunk/ChangeLog
trunk/src/GParted_Core.cc
Modified: trunk/src/GParted_Core.cc
==============================================================================
--- trunk/src/GParted_Core.cc (original)
+++ trunk/src/GParted_Core.cc Sat Mar 14 20:09:28 2009
@@ -17,6 +17,7 @@
#include "../include/Win_GParted.h"
#include "../include/GParted_Core.h"
+#include "../include/DMRaid.h"
#include "../include/FS_Info.h"
#include "../include/OperationCopy.h"
#include "../include/OperationCreate.h"
@@ -158,6 +159,7 @@
devices .clear() ;
Device temp_device ;
FS_Info fs_info( true ) ; //Refresh cache of file system information
+ DMRaid dmraid( true ) ; //Refresh cache of dmraid device information
init_maps() ;
@@ -201,6 +203,17 @@
}
}
proc_partitions .close() ;
+
+ //Try to find all dmraid devices
+ if (dmraid .is_dmraid_supported() ) {
+ std::vector<Glib::ustring> dmraid_devices ;
+ dmraid .get_devices( dmraid_devices ) ;
+ for ( unsigned int k=0; k < dmraid_devices .size(); k++ ) {
+ set_thread_status_message( String::ucompose ( _("Scanning %1"), dmraid_devices[k] ) ) ;
+ dmraid .create_dev_map_entries( dmraid_devices[k] ) ;
+ ped_device_get( dmraid_devices[k] .c_str() ) ;
+ }
+ }
}
else
{
@@ -455,7 +468,15 @@
close_device_and_disk() ;
}
-
+
+ //delete and recreate disk entries if dmraid
+ DMRaid dmraid ;
+ if ( return_value && dmraid .is_dmraid_device( device_path ) )
+ {
+ dmraid .purge_dev_map_entries( device_path ) ;
+ dmraid .create_dev_map_entries( device_path ) ;
+ }
+
return return_value ;
}
@@ -564,6 +585,7 @@
fstab_info .clear() ;
read_mountpoints_from_file( "/proc/mounts", mount_info ) ;
+ read_mountpoints_from_file( "/proc/swaps", mount_info ) ;
read_mountpoints_from_file( "/etc/mtab", mount_info ) ;
read_mountpoints_from_file( "/etc/fstab", fstab_info ) ;
@@ -653,7 +675,8 @@
int EXT_INDEX = -1 ;
char * lp_path ;//we have to free the result of ped_partition_get_path()..
FS_Info fs_info ; //Use cache of file system information
-
+ DMRaid dmraid ; //Use cache of dmraid device information
+
//clear partitions
device .partitions .clear() ;
@@ -662,12 +685,26 @@
{
libparted_messages .clear() ;
partition_temp .Reset() ;
-
+ bool partition_is_busy = false ;
+
switch ( lp_partition ->type )
{
case PED_PARTITION_NORMAL:
- case PED_PARTITION_LOGICAL:
+ case PED_PARTITION_LOGICAL:
lp_path = ped_partition_get_path( lp_partition ) ;
+
+ //Handle dmraid devices differently because the minor number might not
+ // match the last number of the partition filename as shown by "ls -l /dev/mapper"
+ // This mismatch causes incorrect identification of busy partitions in ped_partition_is_busy().
+ if ( dmraid .is_dmraid_device( device .get_path() ) )
+ {
+ iter_mp = mount_info .find( lp_path ) ;
+ if ( iter_mp != mount_info .end() )
+ partition_is_busy = true ;
+ }
+ else
+ partition_is_busy = ped_partition_is_busy( lp_partition ) ;
+
partition_temp .Set( device .get_path(),
lp_path,
lp_partition ->num,
@@ -676,7 +713,7 @@
lp_partition ->geom .start,
lp_partition ->geom .end,
lp_partition ->type,
- ped_partition_is_busy( lp_partition ) ) ;
+ partition_is_busy ) ;
free( lp_path ) ;
partition_temp .add_paths( get_alternate_paths( partition_temp .get_path() ) ) ;
@@ -689,6 +726,27 @@
case PED_PARTITION_EXTENDED:
lp_path = ped_partition_get_path( lp_partition ) ;
+
+ //Handle dmraid devices differently because the minor number might not
+ // match the last number of the partition filename as shown by "ls -l /dev/mapper"
+ // This mismatch causes incorrect identification of busy partitions in ped_partition_is_busy().
+ if ( dmraid .is_dmraid_device( device .get_path() ) )
+ {
+ for ( unsigned int k = 5; k < 255; k++ )
+ {
+ //Try device_name + [5 to 255]
+ iter_mp = mount_info .find( device .get_path() + Utils::num_to_str( k ) ) ;
+ if ( iter_mp != mount_info .end() )
+ partition_is_busy = true ;
+ //Try device_name + p + [5 to 255]
+ iter_mp = mount_info .find( device .get_path() + "p" + Utils::num_to_str( k ) ) ;
+ if ( iter_mp != mount_info .end() )
+ partition_is_busy = true ;
+ }
+ }
+ else
+ partition_is_busy = ped_partition_is_busy( lp_partition ) ;
+
partition_temp .Set( device .get_path(),
lp_path,
lp_partition ->num,
@@ -697,7 +755,7 @@
lp_partition ->geom .start,
lp_partition ->geom .end,
false,
- ped_partition_is_busy( lp_partition ) ) ;
+ partition_is_busy ) ;
free( lp_path ) ;
partition_temp .add_paths( get_alternate_paths( partition_temp .get_path() ) ) ;
@@ -1195,16 +1253,16 @@
close_device_and_disk() ;
}
- if ( new_partition .partition_number > 0 && erase_filesystem_signatures( new_partition ) )
- {
- operationdetail .get_last_child() .set_status( STATUS_SUCCES ) ;
- return true ;
- }
- else
- {
- operationdetail .get_last_child() .set_status( STATUS_ERROR ) ;
- return false ;
- }
+ bool succes = new_partition .partition_number > 0 && erase_filesystem_signatures( new_partition ) ;
+
+ //create dev map entries if dmraid
+ DMRaid dmraid ;
+ if ( succes && dmraid .is_dmraid_device( new_partition .device_path ) )
+ succes = dmraid .create_dev_map_entries( new_partition, operationdetail .get_last_child() ) ;
+
+ operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
+
+ return succes ;
}
bool GParted_Core::create_filesystem( const Partition & partition, OperationDetail & operationdetail )
@@ -1259,6 +1317,23 @@
close_device_and_disk() ;
}
+ //delete partition dev mapper entry, and delete and recreate all other affected dev mapper entries if dmraid
+ DMRaid dmraid ;
+ if ( succes && dmraid .is_dmraid_device( partition .device_path ) )
+ {
+ //Open disk handle before and close after to prevent application crash.
+ if ( open_device_and_disk( partition .device_path ) )
+ {
+ if ( ! dmraid .delete_affected_dev_map_entries( partition, operationdetail .get_last_child() ) )
+ succes = false ; //comand failed
+
+ if ( ! dmraid .create_dev_map_entries( partition, operationdetail .get_last_child() ) )
+ succes = false ; //command failed
+
+ close_device_and_disk() ;
+ }
+ }
+
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
return succes ;
}
@@ -1687,6 +1762,18 @@
Utils::format_size( new_end - new_start + 1 ) ),
STATUS_NONE,
FONT_ITALIC ) ) ;
+
+ //update dev mapper entry if partition is dmraid.
+ DMRaid dmraid ;
+ if ( return_value && dmraid .is_dmraid_device( partition_new .device_path ) )
+ {
+ //Open disk handle before and close after to prevent application crash.
+ if ( open_device_and_disk( partition_new .device_path ) )
+ {
+ return_value = dmraid .update_dev_map_entry( partition_new, operationdetail .get_last_child() ) ;
+ close_device_and_disk() ;
+ }
+ }
}
operationdetail .get_last_child() .set_status( return_value ? STATUS_SUCCES : STATUS_ERROR ) ;
@@ -2349,6 +2436,18 @@
Utils::format_size( partition_new .get_length() ) ),
STATUS_NONE,
FONT_ITALIC ) ) ;
+
+ //Update dev mapper entry if partition is dmraid.
+ DMRaid dmraid ;
+ if ( succes && dmraid .is_dmraid_device( partition_new .device_path ) )
+ {
+ //Open disk handle before and close after to prevent application crash.
+ if ( open_device_and_disk( partition_new .device_path ) )
+ {
+ succes = dmraid .update_dev_map_entry( partition_new, operationdetail .get_last_child() ) ;
+ close_device_and_disk() ;
+ }
+ }
}
operationdetail .get_last_child() .set_status( succes ? STATUS_SUCCES : STATUS_ERROR ) ;
@@ -2507,7 +2606,12 @@
bool GParted_Core::commit_to_os( std::time_t timeout )
{
- bool succes = ped_disk_commit_to_os( lp_disk ) ;
+ DMRaid dmraid ;
+ bool succes ;
+ if ( dmraid .is_dmraid_device( lp_disk ->dev ->path ) )
+ succes = true ;
+ else
+ succes = ped_disk_commit_to_os( lp_disk ) ;
if ( Glib::find_program_in_path( "udevsettle" ) .empty() )
sleep( timeout ) ;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]