Display usage of encrypted file systems (#760080)
There is already the set of methods in the Partition class to report the file system usage. Virtualise them and provide PartitionLUKS specific implementations to calculate the usage of a file system wrapped in LUKS encryption. See the ascii art and comment in PartitionLUKS.cc for the details of those calculations. Bug 760080 - Implement read-only LUKS support
This commit is contained in:
parent
38a790d745
commit
cb24aa4be1
|
@ -82,11 +82,11 @@ public:
|
||||||
bool busy );
|
bool busy );
|
||||||
|
|
||||||
void set_sector_usage( Sector sectors_fs_size, Sector sectors_fs_unused ) ;
|
void set_sector_usage( Sector sectors_fs_size, Sector sectors_fs_unused ) ;
|
||||||
bool sector_usage_known() const ;
|
virtual bool sector_usage_known() const;
|
||||||
Sector estimated_min_size() const ;
|
virtual Sector estimated_min_size() const;
|
||||||
Sector get_sectors_used() const ;
|
virtual Sector get_sectors_used() const;
|
||||||
Sector get_sectors_unused() const ;
|
virtual Sector get_sectors_unused() const;
|
||||||
Sector get_sectors_unallocated() const ;
|
virtual Sector get_sectors_unallocated() const;
|
||||||
void get_usage_triple( int imax, int & i1, int & i2, int & i3 ) const ;
|
void get_usage_triple( int imax, int & i1, int & i2, int & i3 ) const ;
|
||||||
|
|
||||||
void Set_Unallocated( const Glib::ustring & device_path,
|
void Set_Unallocated( const Glib::ustring & device_path,
|
||||||
|
|
|
@ -34,6 +34,11 @@ public:
|
||||||
Partition & get_encrypted() { return encrypted; };
|
Partition & get_encrypted() { return encrypted; };
|
||||||
const Partition & get_encrypted() const { return encrypted; };
|
const Partition & get_encrypted() const { return encrypted; };
|
||||||
|
|
||||||
|
virtual bool sector_usage_known() const;
|
||||||
|
virtual Sector estimated_min_size() const;
|
||||||
|
virtual Sector get_sectors_used() const;
|
||||||
|
virtual Sector get_sectors_unused() const;
|
||||||
|
virtual Sector get_sectors_unallocated() const;
|
||||||
virtual Glib::ustring get_filesystem_label() const;
|
virtual Glib::ustring get_filesystem_label() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -37,6 +37,110 @@ PartitionLUKS * PartitionLUKS::clone() const
|
||||||
return new PartitionLUKS( *this );
|
return new PartitionLUKS( *this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool PartitionLUKS::sector_usage_known() const
|
||||||
|
{
|
||||||
|
if ( busy )
|
||||||
|
// For an open dm-crypt mapping the usage of both the LUKS and encrypted
|
||||||
|
// file system must be known.
|
||||||
|
return Partition::sector_usage_known() && encrypted.sector_usage_known();
|
||||||
|
return Partition::sector_usage_known();
|
||||||
|
}
|
||||||
|
|
||||||
|
// An encrypted partition is laid out, and usage figures calculated like this:
|
||||||
|
//
|
||||||
|
// Partition
|
||||||
|
// |<---------------------------------------->| <- this PartitionLUKS object
|
||||||
|
// LUKS LUKS
|
||||||
|
// Header Mapping
|
||||||
|
// |<--->||<----------------------->| <- encrypted Partition object member
|
||||||
|
// 1111111111111111111111111111111111uuuuuuuuuu <- this->sectors_{used,unused,unallocated}
|
||||||
|
// Encrypted file system
|
||||||
|
// |<----------------->|
|
||||||
|
// 111111111111110000000uuuuuu <- encrypted.sectors_{used,unused,unallocated}
|
||||||
|
// ^ ^
|
||||||
|
// | `------------- encrypted.sector_end
|
||||||
|
// `--------------------------------------- encrypted.sector_start (== size of LUKS header)
|
||||||
|
// 1111111111111111111110000000uuuuuuuuuuuuuuuu <- Overall usage figures as used in the following
|
||||||
|
// usage related methods.
|
||||||
|
// Legend:
|
||||||
|
// 1 - used sectors
|
||||||
|
// 0 - unused sectors
|
||||||
|
// u - unallocated sectors
|
||||||
|
//
|
||||||
|
// Calculations:
|
||||||
|
// total_used = LUKS Header size + Encrypted file system used
|
||||||
|
// = encrypted.sector_start + encrypted.sectors_used
|
||||||
|
// total_unallocated = LUKS unallocated + Encrypted file system unallocated
|
||||||
|
// = this->sectors_unallocated + encrypted_unallocated
|
||||||
|
// total_unused = LUKS unused + Encrypted file system unused
|
||||||
|
// = 0 + encrypted.sectors_unused
|
||||||
|
//
|
||||||
|
// By definition LUKS unused is 0 (See luks::set_used_sectors()).
|
||||||
|
|
||||||
|
// Return estimated minimum size to which the partition can be resized.
|
||||||
|
// See Partition::estimated_min_size() for unallocated threshold reasoning.
|
||||||
|
Sector PartitionLUKS::estimated_min_size() const
|
||||||
|
{
|
||||||
|
if ( busy )
|
||||||
|
{
|
||||||
|
// For an open dm-crypt mapping work with above described totals.
|
||||||
|
if ( sectors_used >= 0 && encrypted.sectors_used >= 0 )
|
||||||
|
{
|
||||||
|
Sector total_used = encrypted.sector_start + encrypted.sectors_used;
|
||||||
|
Sector total_unallocated = sectors_unallocated + encrypted.sectors_unallocated;
|
||||||
|
return total_used + std::min( total_unallocated, significant_threshold );
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return Partition::estimated_min_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return user displayable used sectors.
|
||||||
|
// See Partition::get_sectors_used() for unallocated threshold reasoning.
|
||||||
|
Sector PartitionLUKS::get_sectors_used() const
|
||||||
|
{
|
||||||
|
if ( busy )
|
||||||
|
{
|
||||||
|
// For an open dm-crypt mapping work with above described totals.
|
||||||
|
if ( sectors_used >= 0 && encrypted.sectors_used >= 0 )
|
||||||
|
{
|
||||||
|
Sector total_used = encrypted.sector_start + encrypted.sectors_used;
|
||||||
|
Sector total_unallocated = sectors_unallocated + encrypted.sectors_unallocated;
|
||||||
|
if ( total_unallocated < significant_threshold )
|
||||||
|
return total_used + total_unallocated;
|
||||||
|
else
|
||||||
|
return total_used;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return Partition::get_sectors_used();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return user displayable unused sectors.
|
||||||
|
// See above described totals.
|
||||||
|
Sector PartitionLUKS::get_sectors_unused() const
|
||||||
|
{
|
||||||
|
if ( busy )
|
||||||
|
return encrypted.get_sectors_unused();
|
||||||
|
return Partition::get_sectors_unused();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return user displayable unallocated sectors.
|
||||||
|
// See Partition::get_sectors_unallocated() for unallocated threshold reasoning.
|
||||||
|
Sector PartitionLUKS::get_sectors_unallocated() const
|
||||||
|
{
|
||||||
|
if ( busy )
|
||||||
|
{
|
||||||
|
// For an open dm-crypt mapping work with above described totals.
|
||||||
|
Sector total_unallocated = sectors_unallocated + encrypted.sectors_unallocated;
|
||||||
|
if ( total_unallocated < significant_threshold )
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return total_unallocated;
|
||||||
|
}
|
||||||
|
return Partition::get_sectors_unallocated();
|
||||||
|
}
|
||||||
|
|
||||||
// Return the label of the encrypted file system within, or "" if no open mapping.
|
// Return the label of the encrypted file system within, or "" if no open mapping.
|
||||||
Glib::ustring PartitionLUKS::get_filesystem_label() const
|
Glib::ustring PartitionLUKS::get_filesystem_label() const
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue