Implement offline grow of encryption volumes (#774818)

While a device-mapper encryption mapping can only be resized while
active, a LUKS volume can inherently be grown while offline because it
doesn't store a size and when started fills the partition.  This doesn't
even need the cryptsetup command to do the resizing (just to open the
LUKS volume afterwards which GParted doesn't yet support).  Implement
offline growing of LUKS volumes.

Bug 774818 - Implement LUKS read-write actions NOT requiring a
             passphrase
This commit is contained in:
Mike Fleetwood 2016-12-08 23:11:18 +00:00 committed by Curtis Gedak
parent a1c1401285
commit e2aff7ba66
3 changed files with 40 additions and 9 deletions

View File

@ -2586,17 +2586,35 @@ bool GParted_Core::resize_encryption( const Partition & partition_old,
const Partition & partition_new,
OperationDetail & operationdetail )
{
if ( ! ( partition_old.filesystem == FS_LUKS && partition_old.busy ) )
if ( partition_old.filesystem != FS_LUKS )
{
operationdetail.add_child( OperationDetail(
GPARTED_BUG + ": " + _("partition does not contain open LUKS encryption for a resize encryption only step"),
GPARTED_BUG + ": " + _("partition does not contain LUKS encryption for a resize encryption only step"),
STATUS_ERROR, FONT_ITALIC ) );
return false;
}
const Partition & filesystem_ptn_new = partition_new.get_filesystem_partition();
Sector delta = partition_new.get_sector_length() - partition_old.get_sector_length();
if ( ! partition_old.busy && delta < 0LL )
{
operationdetail.add_child( OperationDetail(
GPARTED_BUG + ": " + _("impossible to shrink a closed LUKS encryption volume"),
STATUS_ERROR, FONT_ITALIC ) );
return false;
}
if ( ! partition_old.busy )
{
// grow closed LUKS.
// maximize_encryption() is only called to display no action needed
// operation message generated in luks::resize() for this case.
return resize_move_partition( partition_old, partition_new, operationdetail )
&& maximize_encryption( partition_new, operationdetail );
}
const Partition & filesystem_ptn_new = partition_new.get_filesystem_partition();
if ( filesystem_ptn_new.filesystem == FS_LINUX_SWAP )
{
// LUKS is resized, but linux-swap is recreated, not resized
@ -2893,10 +2911,10 @@ bool GParted_Core::shrink_encryption( const Partition & partition_old,
bool GParted_Core::maximize_encryption( const Partition & partition, OperationDetail & operationdetail )
{
if ( ! ( partition.filesystem == FS_LUKS && partition.busy ) )
if ( partition.filesystem != FS_LUKS )
{
operationdetail.add_child( OperationDetail(
GPARTED_BUG + ": " + _("partition does not contain open LUKS encryption for a maximize encryption only step"),
GPARTED_BUG + ": " + _("partition does not contain LUKS encryption for a maximize encryption only step"),
STATUS_ERROR, FONT_ITALIC ) );
return false;
}

View File

@ -1256,10 +1256,10 @@ void Win_GParted::set_valid_operations()
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?
// Is growing or moving this closed LUKS mapping permitted?
if ( selected_partition_ptr->filesystem == FS_LUKS &&
! selected_partition_ptr->busy &&
enc_cap.move )
( enc_cap.grow || enc_cap.move ) )
allow_resize( true );
// Is resizing an open LUKS mapping and the file system within
// supported?

View File

@ -28,6 +28,7 @@ FS luks::get_filesystem_support()
fs.busy = FS::EXTERNAL;
fs.read = FS::EXTERNAL;
fs.grow = FS::EXTERNAL;
// Setting .copy is just for displaying in the File System Support dialog.
// (Copying of encrypted content is only performed while open).
@ -105,8 +106,20 @@ bool luks::resize( const Partition & partition_new, OperationDetail & operationd
{
LUKS_Mapping mapping = LUKS_Info::get_cache_entry( partition_new.get_path() );
if ( mapping.name.empty() )
// Only active device-mapper encryption mappings can be resized.
return false;
{
if ( ! fill_partition )
{
// Can't shrink closed LUKS encryption.
return false;
}
else
{
operationdetail.add_child( OperationDetail(
_("Maximize closed LUKS encryption skipped because it will automatically fill the partition when opened"),
STATUS_NONE, FONT_ITALIC ) ) ;
return true;
}
}
Glib::ustring size = "";
if ( ! fill_partition )