[gparted] Enhance copy_filesystem method to work with sector sizes
- From: Curtis Gedak <gedakc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gparted] Enhance copy_filesystem method to work with sector sizes
- Date: Mon, 26 Apr 2010 17:55:07 +0000 (UTC)
commit 896dab719285c25e3343d7103973e257d4e862d2
Author: Curtis Gedak <gedakc gmail com>
Date: Mon Apr 26 11:35:30 2010 -0600
Enhance copy_filesystem method to work with sector sizes
This change is in preparation for supporting sectors sizes > 512 bytes.
include/GParted_Core.h | 2 ++
src/GParted_Core.cc | 47 ++++++++++++++++++++++++++++-------------------
2 files changed, 30 insertions(+), 19 deletions(-)
---
diff --git a/include/GParted_Core.h b/include/GParted_Core.h
index f06e82c..ddcfa5c 100644
--- a/include/GParted_Core.h
+++ b/include/GParted_Core.h
@@ -134,6 +134,8 @@ private:
const Glib::ustring & dst_device,
Sector src_start,
Sector dst_start,
+ Byte_Value src_sector_size,
+ Byte_Value dst_sector_size,
Byte_Value src_length,
OperationDetail & operationdetail,
bool readonly,
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 358044e..ec802b0 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -2094,6 +2094,8 @@ bool GParted_Core::copy_filesystem( const Partition & partition_src,
partition_dst .device_path,
partition_src .sector_start,
partition_dst .sector_start,
+ partition_src .sector_size,
+ partition_dst .sector_size,
partition_src .get_length() * DEFAULT_SECTOR_SIZE,
operationdetail,
readonly,
@@ -2109,6 +2111,8 @@ bool GParted_Core::copy_filesystem( const Partition & partition_src,
partition_dst .device_path,
partition_src .sector_start,
partition_dst .sector_start,
+ partition_src .sector_size,
+ partition_dst .sector_size,
partition_src .get_length() * DEFAULT_SECTOR_SIZE,
operationdetail,
false,
@@ -2119,6 +2123,8 @@ bool GParted_Core::copy_filesystem( const Glib::ustring & src_device,
const Glib::ustring & dst_device,
Sector src_start,
Sector dst_start,
+ Byte_Value src_sector_size,
+ Byte_Value dst_sector_size,
Byte_Value src_length,
OperationDetail & operationdetail,
bool readonly,
@@ -2145,9 +2151,9 @@ bool GParted_Core::copy_filesystem( const Glib::ustring & src_device,
// with the end of the partition and finishing with the start.
if ( dst_start > src_start )
{
- offset_read += (src_length/DEFAULT_SECTOR_SIZE) - (N/DEFAULT_SECTOR_SIZE) ;
+ offset_read += (src_length/src_sector_size) - (N/src_sector_size) ;
/* Handle situation where src sector size is smaller than dst sector size and an additional partial dst sector is required. */
- offset_write += ((src_length + (DEFAULT_SECTOR_SIZE - 1))/DEFAULT_SECTOR_SIZE) - (N/DEFAULT_SECTOR_SIZE) ;
+ offset_write += ((src_length + (dst_sector_size - 1))/dst_sector_size) - (N/dst_sector_size) ;
}
total_done = 0 ;
@@ -2164,8 +2170,8 @@ bool GParted_Core::copy_filesystem( const Glib::ustring & src_device,
timer .reset() ;
succes = copy_blocks( src_device,
dst_device,
- offset_read + (done / DEFAULT_SECTOR_SIZE),
- offset_write + (done / DEFAULT_SECTOR_SIZE),
+ offset_read + (done / src_sector_size),
+ offset_write + (done / dst_sector_size),
N,
benchmark_blocksize,
operationdetail .get_last_child(),
@@ -2199,8 +2205,8 @@ bool GParted_Core::copy_filesystem( const Glib::ustring & src_device,
if ( succes )
succes = copy_blocks( src_device,
dst_device,
- src_start + ( dst_start > src_start ? 0 : (done / DEFAULT_SECTOR_SIZE) ),
- dst_start + ( dst_start > src_start ? 0 : (done / DEFAULT_SECTOR_SIZE) ),
+ src_start + ( dst_start > src_start ? 0 : (done / src_sector_size) ),
+ dst_start + ( dst_start > src_start ? 0 : (done / dst_sector_size) ),
src_length - llabs( done ),
optimal_blocksize,
operationdetail,
@@ -2388,23 +2394,26 @@ bool GParted_Core::copy_blocks( const Glib::ustring & src_device,
Byte_Value done = length % blocksize ;
- //Handle situation where we need to perform the copy beginning
- // with the end of the partition and finishing with the start.
- if ( dst_start > src_start )
- {
- blocksize -= 2*blocksize ;
- done -= 2*done ;
- src_start += ( (length / DEFAULT_SECTOR_SIZE) - 1 ) ;
- /* Handle situation where src sector size is smaller than dst sector size and an additional partial dst sector is required. */
- dst_start += ( ((length + (DEFAULT_SECTOR_SIZE - 1))/ DEFAULT_SECTOR_SIZE) - 1 ) ;
- }
-
bool succes = false ;
PedDevice *lp_device_src = ped_device_get( src_device .c_str() );
PedDevice *lp_device_dst = src_device != dst_device ? ped_device_get( dst_device .c_str() ) : lp_device_src ;
if ( lp_device_src && lp_device_dst && ped_device_open( lp_device_src ) && ped_device_open( lp_device_dst ) )
{
+ Byte_Value src_sector_size = lp_device_src ->sector_size ;
+ Byte_Value dst_sector_size = lp_device_dst ->sector_size ;
+
+ //Handle situation where we need to perform the copy beginning
+ // with the end of the partition and finishing with the start.
+ if ( dst_start > src_start )
+ {
+ blocksize -= 2*blocksize ;
+ done -= 2*done ;
+ src_start += ( (length / src_sector_size) - 1 ) ;
+ /* Handle situation where src sector size is smaller than dst sector size and an additional partial dst sector is required. */
+ dst_start += ( ((length + (dst_sector_size - 1))/ dst_sector_size) - 1 ) ;
+ }
+
Glib::ustring error_message ;
buf = static_cast<char *>( malloc( llabs( blocksize ) ) ) ;
if ( buf )
@@ -2431,8 +2440,8 @@ bool GParted_Core::copy_blocks( const Glib::ustring & src_device,
{
succes = copy_block( lp_device_src,
lp_device_dst,
- src_start + (done / DEFAULT_SECTOR_SIZE),
- dst_start + (done / DEFAULT_SECTOR_SIZE),
+ src_start + (done / src_sector_size),
+ dst_start + (done / dst_sector_size),
blocksize,
error_message,
readonly ) ;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]