xfs copy now uses xfsdump and xfsrestore. icw some hacks in the other 2

* src/Dialog_Partition_Copy.cc,
  src/Win_GParted.cc,
  src/xfs.cc: xfs copy now uses xfsdump and xfsrestore. icw some hacks in the other 2 files, it's now possible to shrink an xfs partition
  while doing the copy. Although i'd rather preffered 'real' (in place) resizing i figured it's better then nothing.
  Also the sourcefilesystem is now checked before the actual copy is performed. If damaged beyond repair, the copy won't start.
* src/Dialog_Partition_Resize_Move.cc: removed commented code.
This commit is contained in:
Bart Hakvoort 2004-12-20 19:09:48 +00:00
parent 8f34efa5d6
commit a54b52ea33
6 changed files with 47 additions and 27 deletions

View File

@ -1,3 +1,12 @@
2004-12-20 Bart Hakvoort <gparted@users.sf.net>
* src/Dialog_Partition_Copy.cc,
src/Win_GParted.cc,
src/xfs.cc: xfs copy now uses xfsdump and xfsrestore. icw some hacks in the other 2 files, it's now possible to shrink an xfs partition
while doing the copy. Although i'd rather preffered 'real' (in place) resizing i figured it's better then nothing.
Also the sourcefilesystem is now checked before the actual copy is performed. If damaged beyond repair, the copy won't start.
* src/Dialog_Partition_Resize_Move.cc: removed commented code.
2004-12-18 Bart Hakvoort <gparted@users.sf.net> 2004-12-18 Bart Hakvoort <gparted@users.sf.net>
* include/Dialog_Filesystems.h, * include/Dialog_Filesystems.h,

View File

@ -36,8 +36,6 @@ Dialog_Partition_Copy::Dialog_Partition_Copy( const FS & fs, Sector cylinder_siz
void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, const Partition & copied_partition ) void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, const Partition & copied_partition )
{ {
GRIP = true ; //prevents on spinbutton_changed from getting activated prematurely
this ->set_title( String::ucompose( _("Paste %1"), copied_partition .partition ) ) ; this ->set_title( String::ucompose( _("Paste %1"), copied_partition .partition ) ) ;
//set partition color //set partition color
@ -48,27 +46,34 @@ void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, cons
total_length = selected_partition .sector_end - selected_partition .sector_start ; total_length = selected_partition .sector_end - selected_partition .sector_start ;
TOTAL_MB = selected_partition .Get_Length_MB( ) ; TOTAL_MB = selected_partition .Get_Length_MB( ) ;
MB_PER_PIXEL = (double) TOTAL_MB / 500 ; MB_PER_PIXEL = (double) TOTAL_MB / 500 ;
long COPIED_LENGTH_MB = copied_partition .Get_Length_MB( ) ;
//now calculate proportional length of partition //now calculate proportional length of partition
frame_resizer_base ->set_x_start( 0 ) ; frame_resizer_base ->set_x_start( 0 ) ;
frame_resizer_base ->set_x_end( ( Round( (double) (copied_partition .sector_end - copied_partition .sector_start) / ( (double)total_length/500) )) ) ; int x_end = Round( COPIED_LENGTH_MB / ( (double)TOTAL_MB/500 ) ) ; //> 500 px only possible with xfs...
frame_resizer_base ->set_used( Round( (double) copied_partition .sectors_used / ( (double)total_length/500) ) ) ; frame_resizer_base ->set_x_end( x_end > 500 ? 500 : x_end ) ;
frame_resizer_base ->set_used( Round( copied_partition .Get_Used_MB( ) / ( (double)TOTAL_MB/500) ) ) ;
fs .MAX = ( ! fs .MAX || fs .MAX > TOTAL_MB ) ? TOTAL_MB : fs .MAX -= BUF ; fs .MAX = ( ! fs .MAX || fs .MAX > TOTAL_MB ) ? TOTAL_MB : fs .MAX -= BUF ;
fs .MIN = copied_partition .Get_Length_MB( ) +1 ; if ( fs .filesystem == "xfs" ) //bit hackisch, but most effective, since it's a unique situation
fs .MIN = copied_partition .Get_Used_MB( ) + (BUF * 2) ;
else
fs .MIN = COPIED_LENGTH_MB +1 ;
GRIP = true ;
//set values of spinbutton_before //set values of spinbutton_before
spinbutton_before .set_range( 0, TOTAL_MB - fs .MIN ) ; spinbutton_before .set_range( 0, TOTAL_MB - fs .MIN ) ;
spinbutton_before .set_value( 0 ) ; spinbutton_before .set_value( 0 ) ;
//set values of spinbutton_size //set values of spinbutton_size
spinbutton_size .set_range( fs .MIN, fs .MAX ) ; spinbutton_size .set_range( fs .MIN, fs .MAX ) ;
spinbutton_size .set_value( fs .MIN ) ; spinbutton_size .set_value( COPIED_LENGTH_MB ) ;
//set values of spinbutton_after //set values of spinbutton_after
spinbutton_after .set_range( 0, TOTAL_MB - fs .MIN ) ; spinbutton_after .set_range( 0, TOTAL_MB - fs .MIN ) ;
spinbutton_after .set_value( TOTAL_MB - fs .MIN ) ; spinbutton_after .set_value( TOTAL_MB - COPIED_LENGTH_MB ) ;
GRIP = false ;
frame_resizer_base ->set_size_limits( (int) ( fs .MIN / MB_PER_PIXEL), (int) (fs .MAX / MB_PER_PIXEL) +1 ) ; frame_resizer_base ->set_size_limits( (int) ( fs .MIN / MB_PER_PIXEL), (int) (fs .MAX / MB_PER_PIXEL) +1 ) ;
@ -79,8 +84,6 @@ void Dialog_Partition_Copy::Set_Data( const Partition & selected_partition, cons
this ->selected_partition = copied_partition ; this ->selected_partition = copied_partition ;
this ->selected_partition .inside_extended = selected_partition .inside_extended ; this ->selected_partition .inside_extended = selected_partition .inside_extended ;
selected_partition .inside_extended ? this ->selected_partition .type = GParted::LOGICAL : this ->selected_partition .type = GParted::PRIMARY ; selected_partition .inside_extended ? this ->selected_partition .type = GParted::LOGICAL : this ->selected_partition .type = GParted::PRIMARY ;
GRIP = false ;
} }
Partition Dialog_Partition_Copy::Get_New_Partition() Partition Dialog_Partition_Copy::Get_New_Partition()

View File

@ -128,8 +128,6 @@ void Dialog_Partition_Resize_Move::Resize_Move_Normal( const std::vector <Partit
else //only grow.. else //only grow..
fs .MIN = selected_partition .Get_Length_MB( ) ; fs .MIN = selected_partition .Get_Length_MB( ) ;
//if ( ! fs .MAX || fs .MAX > TOTAL_MB )
// fs .MAX = TOTAL_MB ;
fs .MAX = ( ! fs .MAX || fs .MAX > TOTAL_MB ) ? TOTAL_MB : fs .MAX -= BUF/2 ; fs .MAX = ( ! fs .MAX || fs .MAX > TOTAL_MB ) ? TOTAL_MB : fs .MAX -= BUF/2 ;
//set values of spinbutton_before //set values of spinbutton_before

View File

@ -431,12 +431,14 @@ bool GParted_Core::Resize( const Glib::ustring & device_path, const Partition &
bool GParted_Core::Copy( const Glib::ustring & dest_device_path, const Glib::ustring & src_part_path, Partition & partition_dest ) bool GParted_Core::Copy( const Glib::ustring & dest_device_path, const Glib::ustring & src_part_path, Partition & partition_dest )
{ {
if ( Create_Empty_Partition( dest_device_path, partition_dest, true ) > 0 ) set_proper_filesystem( partition_dest .filesystem ) ;
{
set_proper_filesystem( partition_dest .filesystem ) ;
return p_filesystem ->Copy( src_part_path, partition_dest .partition ) ; Partition src_partition ;
} src_partition .partition = src_part_path ;
if ( p_filesystem ->Check_Repair( src_partition ) )
if ( Create_Empty_Partition( dest_device_path, partition_dest, true ) > 0 )
return p_filesystem ->Copy( src_part_path, partition_dest .partition ) ;
return false ; return false ;
} }

View File

@ -567,7 +567,9 @@ void Win_GParted::Set_Valid_Operations()
if ( cylinder_size < 1 ) if ( cylinder_size < 1 )
cylinder_size = 1 ; cylinder_size = 1 ;
if ( (copied_partition .Get_Length_MB( ) + cylinder_size) < selected_partition .Get_Length_MB( ) ) if ( (copied_partition .Get_Length_MB( ) + cylinder_size) < selected_partition .Get_Length_MB( ) ||
(copied_partition .filesystem == "xfs" && (copied_partition .Get_Used_MB( ) + cylinder_size) < selected_partition .Get_Length_MB( ) )
)
allow_paste( true ) ; allow_paste( true ) ;
} }

View File

@ -51,7 +51,7 @@ FS xfs::get_filesystem_support( )
input .close( ) ; input .close( ) ;
} }
if ( ! system( "which dd 1>/dev/null 2>/dev/null" ) && fs .grow ) if ( ! system( "which xfsdump xfsrestore mount umount 1>/dev/null 2>/dev/null" ) && fs .check && fs .create )
fs .copy = true ; fs .copy = true ;
fs .MIN = 32 ;//official minsize = 16MB, but the smallest xfs_repair can handle is 32MB... fs .MIN = 32 ;//official minsize = 16MB, but the smallest xfs_repair can handle is 32MB...
@ -111,14 +111,20 @@ bool xfs::Resize( const Partition & partition_new, bool fill_partition )
bool xfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path ) bool xfs::Copy( const Glib::ustring & src_part_path, const Glib::ustring & dest_part_path )
{ {
if ( ! Execute_Command( "LC_NUMERIC=C dd bs=8192 if=" + src_part_path + " of=" + dest_part_path ) ) bool return_value = false ;
{
Partition partition ;
partition .partition = dest_part_path ;
return Resize( partition, true ) ;
}
return false ; system( "mkdir /tmp/gparted_tmp_xfs_src_mountpoint /tmp/gparted_tmp_xfs_dest_mountpoint" ) ;
if ( ! Execute_Command( "mkfs.xfs -f " + dest_part_path ) &&
! Execute_Command( "mount " + src_part_path + " /tmp/gparted_tmp_xfs_src_mountpoint" ) &&
! Execute_Command( "mount " + dest_part_path + " /tmp/gparted_tmp_xfs_dest_mountpoint" )
)
return_value = ! Execute_Command( "xfsdump -J - /tmp/gparted_tmp_xfs_src_mountpoint | xfsrestore -J - /tmp/gparted_tmp_xfs_dest_mountpoint" ) ;
Execute_Command( "umount " + src_part_path + " " + dest_part_path ) ;
system( "rmdir /tmp/gparted_tmp_xfs_src_mountpoint /tmp/gparted_tmp_xfs_dest_mountpoint" ) ;
return return_value ;
} }
bool xfs::Check_Repair( const Partition & partition ) bool xfs::Check_Repair( const Partition & partition )