2012-01-28 07:25:31 -07:00
|
|
|
/* Copyright (C) 2012 Mike Fleetwood
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
/* LVM2_PV_Info
|
|
|
|
*
|
|
|
|
* A persistent cache of information about LVM2 PVs that helps to
|
|
|
|
* minimize the number of executions of lvm commands used to query
|
|
|
|
* their attributes.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef LVM2_PV_INFO_H_
|
|
|
|
#define LVM2_PV_INFO_H_
|
|
|
|
|
|
|
|
#include "../include/Utils.h"
|
|
|
|
|
|
|
|
namespace GParted
|
|
|
|
{
|
|
|
|
|
|
|
|
class LVM2_PV_Info
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
LVM2_PV_Info() ;
|
|
|
|
LVM2_PV_Info( bool do_refresh ) ;
|
|
|
|
~LVM2_PV_Info() ;
|
|
|
|
bool is_lvm2_pv_supported() ;
|
|
|
|
Glib::ustring get_vg_name( const Glib::ustring & path ) ;
|
2012-03-08 08:37:31 -07:00
|
|
|
Byte_Value get_size_bytes( const Glib::ustring & path ) ;
|
2012-01-28 07:25:31 -07:00
|
|
|
Byte_Value get_free_bytes( const Glib::ustring & path ) ;
|
|
|
|
bool has_active_lvs( const Glib::ustring & path ) ;
|
2012-02-12 06:41:41 -07:00
|
|
|
bool is_vg_exported( const Glib::ustring & vgname ) ;
|
2012-07-01 02:57:52 -06:00
|
|
|
std::vector<Glib::ustring> get_vg_members( const Glib::ustring & vgname ) ;
|
2012-02-12 07:44:50 -07:00
|
|
|
std::vector<Glib::ustring> get_error_messages( const Glib::ustring & path ) ;
|
2012-01-28 07:25:31 -07:00
|
|
|
private:
|
2011-12-11 16:17:52 -07:00
|
|
|
void initialize_if_required() ;
|
Switch to using lvs to identify active LVM LVs (#160787)
Previously used "dmsetup info" to directly list device-mapper mapping
names in the kernel to identify active Logical Volumes. However GParted
failed to recognise active LVs if the VGNAME contains any hyphens (-).
This is because LVM encodes hyphens as double hyphens in the mapping
name.
To avoid having to duplicate the LVM hyphen encoding in GParted, switch
to using "lvm lvs" to list LVs.
# dmsetup info --columns --noheadings --separator , -o name
GParted_VG1-lvol_00
GParted--VG2-lvol--00
# lvm lvs --noheadings --separator , -o lv_name,vg_name,lv_attr
lvol_00,GParted_VG1,-wi-a-
lvol-00,GParted-VG2,-wi-a-
lvol-01,GParted-VG3,-wi---
.^.
(-) not active, (a) or any other character considered active. Reference
lvs(8).
Bug #160787 - lvm support
2012-02-02 06:22:46 -07:00
|
|
|
void set_command_found() ;
|
2012-01-28 07:25:31 -07:00
|
|
|
void load_lvm2_pv_info_cache() ;
|
Prevent crash in the LVM2 PV information cache (#160787)
GParted would crash if there were any embeded spaces in the output from
the command used to query LVM2 PVs. There aren't normally any embeded
spaces, but they can occur in certain degrated situations. For example
if one of the PVs in a VG spanning two PVs is lost the PV is displayed
as "unknown device" rather than its actual device name:
# lvm pvs --nosuffix --units b --separator , -o pv_name,pv_free,vg_name,lv_name,lv_attr
Couldn't find device with uuid DMEi8r-9Vvy-w0Ok-CSSn-oLmY-YrY3-1PBznz.
PV,PFree,VG,LV,Attr
/dev/sda11,2143289344,GParted-VG1,,
unknown device,1619001344,GParted-VG1,lvol0,-wi---
unknown device,1619001344,GParted-VG1,,
This was loaded into the cache as:
["/dev/sda11,2143289344,GParted-VG1,,",
"unknown",
"device,1619001344,GParted-VG1,lvol0,-wi---",
"unknown",
"device,1619001344,GParted-VG1,,"]
The crash would happen when trying to access the VG name or LV flags on
a line without enough comma separated fields.
Improve parsing of the output from "lvm pvs" so that lines are not split
on embeded spaces. Don't crash on lines without without enough comma
separated fields.
Bug #160787 - lvm support
2012-02-11 07:09:22 -07:00
|
|
|
Glib::ustring get_pv_attr_by_path( const Glib::ustring & path, unsigned int entry ) ;
|
|
|
|
Glib::ustring get_pv_attr_by_row( unsigned int row, unsigned int entry ) ;
|
2012-03-08 08:37:31 -07:00
|
|
|
Byte_Value lvm2_pv_attr_to_num( const Glib::ustring str ) ;
|
2012-01-28 07:25:31 -07:00
|
|
|
static bool lvm2_pv_info_cache_initialized ;
|
|
|
|
static bool lvm_found ;
|
|
|
|
static std::vector<Glib::ustring> lvm2_pv_cache ;
|
2012-02-09 13:58:55 -07:00
|
|
|
static std::vector<Glib::ustring> error_messages ;
|
2012-01-28 07:25:31 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
}//GParted
|
|
|
|
|
|
|
|
#endif /*LVM2_PV_INFO_H_*/
|