Enable resize/move for encrypted file systems (#774818)

A partition containing LUKS encryption can only be moved when closed and
the Device Mapper encryption mapping only exists to be resized when
open.  As GParted can't yet open or close LUKS encryption these
restrictions have to be adhered to when composing operations.  Also as
encrypted partitions are only being resized when open, additionally
libparted and the kernel have to both be capable of resizing a partition
while in use.

Bug 774818 - Implement LUKS read-write actions NOT requiring a
             passphrase
This commit is contained in:
Mike Fleetwood 2016-11-09 17:59:02 +00:00 committed by Curtis Gedak
parent 89540fedd8
commit e2c70d5639
2 changed files with 48 additions and 10 deletions

View File

@ -1080,9 +1080,9 @@ void Win_GParted::set_valid_operations()
// Reference to the Partition object directly containing the file system. // Reference to the Partition object directly containing the file system.
const Partition & selected_filesystem = selected_partition_ptr->get_filesystem_partition(); const Partition & selected_filesystem = selected_partition_ptr->get_filesystem_partition();
// Get filesystem capabilities // Get file system and LUKS encryption capabilities
fs = gparted_core.get_fs( selected_partition_ptr->filesystem );
const FS & fs_cap = gparted_core.get_fs( selected_filesystem.filesystem ); const FS & fs_cap = gparted_core.get_fs( selected_filesystem.filesystem );
const FS & enc_cap = gparted_core.get_fs( FS_LUKS );
//if there's something, there's some info ;) //if there's something, there's some info ;)
allow_info( true ) ; allow_info( true ) ;
@ -1137,11 +1137,21 @@ void Win_GParted::set_valid_operations()
allow_manage_flags( true ); allow_manage_flags( true );
#ifdef ENABLE_ONLINE_RESIZE #ifdef ENABLE_ONLINE_RESIZE
// Find out if online resizing is possible // Online resizing always required the ability to update the partition table ...
if ( selected_partition_ptr->busy ) if ( ! devices[current_device].readonly &&
selected_filesystem.busy )
{ {
if ( ( fs .online_grow || fs .online_shrink ) && ! devices[ current_device ] .readonly ) // Can the plain file system be online resized?
allow_resize( true ) ; if ( selected_partition_ptr->filesystem != FS_LUKS &&
( fs_cap.online_grow || fs_cap.online_shrink ) )
allow_resize( true );
// Is resizing an open LUKS mapping and the online file system within
// supported?
if ( selected_partition_ptr->filesystem == FS_LUKS &&
selected_partition_ptr->busy &&
( ( enc_cap.online_grow && fs_cap.online_grow ) ||
( enc_cap.online_shrink && fs_cap.online_shrink ) ) )
allow_resize( true );
} }
#endif #endif
@ -1238,9 +1248,27 @@ void Win_GParted::set_valid_operations()
if ( ! selected_partition_ptr->whole_device ) if ( ! selected_partition_ptr->whole_device )
allow_delete( true ); allow_delete( true );
//find out if resizing/moving is possible // Resizing/moving always requires the ability to update the partition
if ( (fs .grow || fs .shrink || fs .move ) && ! devices[ current_device ] .readonly ) // table ...
allow_resize( true ) ; if ( ! devices[current_device].readonly )
{
// Can the plain file system be resized or moved?
if ( selected_partition_ptr->filesystem != FS_LUKS &&
( fs_cap.grow || fs_cap.shrink || fs_cap.move ) )
allow_resize( true );
// Is moving this closed LUKS mapping permitted?
if ( selected_partition_ptr->filesystem == FS_LUKS &&
! selected_partition_ptr->busy &&
enc_cap.move )
allow_resize( true );
// Is resizing an open LUKS mapping and the file system within
// supported?
if ( selected_partition_ptr->filesystem == FS_LUKS &&
selected_partition_ptr->busy &&
( ( enc_cap.online_grow && fs_cap.grow ) ||
( enc_cap.online_shrink && fs_cap.shrink ) ) )
allow_resize( true );
}
// Only allow copying of real partitions, excluding closed encryption // Only allow copying of real partitions, excluding closed encryption
// (which are only copied while open). // (which are only copied while open).

View File

@ -34,6 +34,16 @@ FS luks::get_filesystem_support()
fs.copy = FS::GPARTED; fs.copy = FS::GPARTED;
fs.online_read = FS::EXTERNAL; fs.online_read = FS::EXTERNAL;
fs.move = FS::GPARTED;
#ifdef ENABLE_ONLINE_RESIZE
if ( ! Glib::find_program_in_path( "cryptsetup" ).empty() &&
Utils::kernel_version_at_least( 3, 6, 0 ) )
{
fs.online_grow = FS::EXTERNAL;
fs.online_shrink = FS::EXTERNAL;
}
#endif
return fs; return fs;
} }