Display VG export status with an LVM2 PVs busy status (#160787)

Also update to use LVM terminology, such that a Physical Volume is
referred to as a member of a Volume Group.  Status of an LVM2 PV is now
displayed using one of the following messages:
    Not active (Not a member of any volume group)
    VGNAME not active
    VGNAME not active and exported
    VGNAME active

Bug #160787 - lvm support
This commit is contained in:
Mike Fleetwood 2012-02-12 13:41:41 +00:00 committed by Curtis Gedak
parent 3fbdb8055f
commit 6d665d669d
3 changed files with 56 additions and 18 deletions

View File

@ -41,6 +41,7 @@ public:
Glib::ustring get_vg_name( const Glib::ustring & path ) ;
Byte_Value get_free_bytes( const Glib::ustring & path ) ;
bool has_active_lvs( const Glib::ustring & path ) ;
bool is_vg_exported( const Glib::ustring & vgname ) ;
std::vector<Glib::ustring> get_error_messages() ;
private:
void initialize_if_required() ;

View File

@ -17,6 +17,7 @@
*/
#include "../include/Dialog_Partition_Info.h"
#include "../include/LVM2_PV_Info.h"
namespace GParted
{
@ -269,7 +270,7 @@ void Dialog_Partition_Info::Display_Info()
else if ( partition .filesystem == FS_LVM2_PV )
{
/* TO TRANSLATORS: myvgname active
* means that the partition is part of an LVM volume group and that
* means that the partition is a member of an LVM volume group and the
* volume group is active and being used by the operating system.
*/
str_temp = String::ucompose( _("%1 active"), partition .get_mountpoint() ) ;
@ -300,17 +301,26 @@ void Dialog_Partition_Info::Display_Info()
}
else if ( partition .filesystem == FS_LVM2_PV )
{
LVM2_PV_Info lvm2_pv_info ;
Glib::ustring mount_point = partition .get_mountpoint() ;
if ( mount_point .empty() )
/* TO TRANSLATORS: Not active (Not part of any volume group)
* means that the partition is not yet part of an LVM volume
/* TO TRANSLATORS: Not active (Not a member of any volume group)
* means that the partition is not yet a member of an LVM volume
* group and therefore is not active and can not yet be used by
* the operating system.
*/
str_temp = _("Not active (Not part of any volume group)") ;
str_temp = _("Not active (Not a member of any volume group)") ;
else if ( lvm2_pv_info .is_vg_exported( mount_point ) )
/* TO TRANSLATORS: myvgname not active and exported
* means that the partition is a member of an LVM volume group but
* the volume group is not active and not being used by the operating system.
* The volume group has also been exported making the LVM physical volumes
* ready for moving to a different computer system.
*/
str_temp = String::ucompose( _("%1 not active and exported"), mount_point ) ;
else
/* TO TRANSLATORS: myvgname not active
* means that the partition is part of an LVM volume group but
* means that the partition is a member of an LVM volume group but
* the volume group is not active and not being used by the operating system.
*/
str_temp = String::ucompose( _("%1 not active"), mount_point ) ;

View File

@ -25,8 +25,9 @@ enum PV_ATTRIBUTE
PVATTR_PV_NAME = 0,
PVATTR_PV_FREE = 1,
PVATTR_VG_NAME = 2,
PVATTR_LV_NAME = 3,
PVATTR_LV_BITS = 4
PVATTR_VG_BITS = 3,
PVATTR_LV_NAME = 4,
PVATTR_LV_BITS = 5
} ;
//Data model:
@ -35,17 +36,20 @@ enum PV_ATTRIBUTE
// lvm_found - Is the "lvm" command available?
// lvm2_pv_cache - String vector storing attributes of a PV.
// Attributes are: pv_name,pv_free,vg_name,
// lv_name,lv_attr. Pv_free is the number of
// free bytes, see lvs(8) for details of
// lv_attrs.
// vg_attr,lv_name,lv_attr. Pv_free is the
// number of free bytes, see vgs(8) and lvs(8)
// for details of vg_attr and lv_attr
// respectively.
// E.g.
// ["/dev/sda10,2147483648,,,",
// "/dev/sda11,2143289344,GParted-VG1,,",
// "/dev/sda12,1619001344,GParted-VG2,lvol0,-wi---",
// "/dev/sda12,1619001344,GParted-VG2,,",
// "/dev/sda13,830472192,GParted_VG3,lvol0,-wi-a-",
// "/dev/sda13,830472192,GParted_VG3,lvol1,-wi-a-",
// "/dev/sda13,830472192,GParted_VG3,,"]
// ["/dev/sda10,2147483648,,r-----,,",
// "/dev/sda11,2143289344,GParted-VG1,wz--n-,,",
// "/dev/sda12,1619001344,GParted-VG2,wz--n-,lvol0,-wi---",
// "/dev/sda12,1619001344,GParted-VG2,wz--n-,,",
// "/dev/sda13,830472192,GParted_VG3,wz--n-,lvol0,-wi-a-",
// "/dev/sda13,830472192,GParted_VG3,wz--n-,lvol1,-wi-a-",
// "/dev/sda13,830472192,GParted_VG3,wz--n-,,",
// "/dev/sda14,1828716544,GParted-VG4,wzx-n-,lvol0,-wi---",
// "/dev/sda14,1828716544,GParted-VG4,wzx-n-,,"]
// error_messages - String vector storing error messsages.
@ -130,6 +134,29 @@ bool LVM2_PV_Info::has_active_lvs( const Glib::ustring & path )
return false ;
}
//Report if the VG is exported.
bool LVM2_PV_Info::is_vg_exported( const Glib::ustring & vgname )
{
initialize_if_required() ;
for ( unsigned int i = 0 ; i < lvm2_pv_cache .size() ; i ++ )
{
std::vector<Glib::ustring> pv_attrs ;
Utils::split( lvm2_pv_cache [i], pv_attrs, "," ) ;
if ( vgname == get_pv_attr_by_row( i, PVATTR_VG_NAME ) )
{
Glib::ustring vg_bits = get_pv_attr_by_row( i, PVATTR_VG_BITS ) ;
//3rd "bit" is export status. E.g.
// "wz--n-" imported, "wzx-n-" exported.
// Treat any non-hyphen character as exported.
if ( vg_bits .length() >= 3 && vg_bits [2] != '-' )
//VG is exported
return true ;
}
}
return false ;
}
std::vector<Glib::ustring> LVM2_PV_Info::get_error_messages()
{
initialize_if_required() ;
@ -169,7 +196,7 @@ void LVM2_PV_Info::load_lvm2_pv_info_cache()
//Load LVM2 PV attribute cache. Output PV attributes in
// PV_ATTRIBUTE order
Glib::ustring cmd = "lvm pvs --config \"log{command_names=0}\" --nosuffix --noheadings --separator , --units b -o pv_name,pv_free,vg_name,lv_name,lv_attr" ;
Glib::ustring cmd = "lvm pvs --config \"log{command_names=0}\" --nosuffix --noheadings --separator , --units b -o pv_name,pv_free,vg_name,vg_attr,lv_name,lv_attr" ;
if ( ! Utils::execute_command( cmd, output, error, true ) )
{
if ( output != "" )