[gparted] Report space usage of LVM2 PVs (#160787)



commit abd0dd04268c873f101c5850f16399d7e5b903b4
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Mon Nov 28 12:33:51 2011 +0000

    Report space usage of LVM2 PVs (#160787)
    
    Add minimal support for just reporting the space usage of LVM2 PVs.
    Accept libparted / blkid detection of LVM2 PVs first, falling back on
    GParted's specific detection code otherwise.  Maintain LVM not supported
    warning message.
    
    Bug #160787 - lvm support

 include/Makefile.am |    1 +
 include/lvm2_pv.h   |   50 +++++++++++++++++++++++++
 po/POTFILES.in      |    1 +
 src/GParted_Core.cc |   22 +++++++----
 src/Makefile.am     |    1 +
 src/lvm2_pv.cc      |  103 +++++++++++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 170 insertions(+), 8 deletions(-)
---
diff --git a/include/Makefile.am b/include/Makefile.am
index 2d6ed7b..0544fec 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -49,6 +49,7 @@ EXTRA_DIST = \
 	i18n.h				\
 	jfs.h 				\
 	linux_swap.h 			\
+	lvm2_pv.h			\
 	nilfs2.h			\
 	ntfs.h  			\
 	reiser4.h   			\
diff --git a/include/lvm2_pv.h b/include/lvm2_pv.h
new file mode 100644
index 0000000..a6fca3b
--- /dev/null
+++ b/include/lvm2_pv.h
@@ -0,0 +1,50 @@
+/* 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.
+ */
+
+
+#ifndef LVM2_PV_H_
+#define LVM2_PV_H_
+
+#include "../include/FileSystem.h"
+
+namespace GParted
+{
+
+class lvm2_pv : public FileSystem
+{
+public:
+	FS get_filesystem_support() ;
+	void set_used_sectors( Partition & partition ) ;
+	void read_label( Partition & partition ) ;
+	bool write_label( const Partition & partition, OperationDetail & operationdetail ) ;
+	void read_uuid( Partition & partition ) ;
+	bool write_uuid( const Partition & partition, OperationDetail & operationdetail ) ;
+	bool create( const Partition & new_partition, OperationDetail & operationdetail ) ;
+	bool resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition = false ) ;
+	bool move( const Partition & partition_new
+	         , const Partition & partition_old
+	         , OperationDetail & operationdetail
+	         ) ;
+	bool copy( const Glib::ustring & src_part_path
+	         , const Glib::ustring & dest_part_path
+	         , OperationDetail & operationdetail ) ;
+	bool check_repair( const Partition & partition, OperationDetail & operationdetail ) ;
+};
+
+} //GParted
+
+#endif /*LVM2_PV_H_*/
diff --git a/po/POTFILES.in b/po/POTFILES.in
index f89f5af..35cd984 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -39,6 +39,7 @@ src/hfs.cc
 src/hfsplus.cc
 src/jfs.cc
 src/linux_swap.cc
+src/lvm2_pv.cc
 src/main.cc
 src/ntfs.cc
 src/nilfs2.cc
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 9e11770..d740ae4 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -38,6 +38,7 @@
 #include "../include/fat16.h"
 #include "../include/fat32.h"
 #include "../include/linux_swap.h"
+#include "../include/lvm2_pv.h"
 #include "../include/reiserfs.h"
 #include "../include/nilfs2.h"
 #include "../include/ntfs.h"
@@ -127,6 +128,9 @@ void GParted_Core::find_supported_filesystems()
 	linux_swap fs_linux_swap;
 	FILESYSTEMS .push_back( fs_linux_swap .get_filesystem_support() ) ;
 
+	lvm2_pv fs_lvm2_pv;
+	FILESYSTEMS .push_back( fs_lvm2_pv .get_filesystem_support() ) ;
+
 	nilfs2 fs_nilfs2;
 	FILESYSTEMS .push_back( fs_nilfs2 .get_filesystem_support() ) ;
 
@@ -145,10 +149,6 @@ void GParted_Core::find_supported_filesystems()
 	xfs fs_xfs;
 	FILESYSTEMS .push_back( fs_xfs .get_filesystem_support() ) ;
 
-	//lvm2 physical volume -- not a file system
-	fs_notsupp .filesystem = GParted::FS_LVM2_PV ;
-	FILESYSTEMS .push_back( fs_notsupp ) ;
-
 	//luks encryption-- not a file system
 	fs_notsupp .filesystem = GParted::FS_LUKS ;
 	FILESYSTEMS .push_back( fs_notsupp ) ;
@@ -1102,6 +1102,9 @@ GParted::FILESYSTEM GParted_Core::get_filesystem()
 		fs_type = fs_info.get_fs_type( get_partition_path( lp_partition ) ) ;
 	}
 
+	Glib::ustring lvm_warning = _( "Logical Volume Management is not yet supported." ) ;
+	lvm_warning += "\n" ;
+
 	if ( ! fs_type .empty() )
 	{
 		if ( fs_type == "extended" )
@@ -1124,6 +1127,11 @@ GParted::FILESYSTEM GParted_Core::get_filesystem()
 		          fs_type == "linux-swap(old)" ||
 		          fs_type == "swap" )
 			return GParted::FS_LINUX_SWAP ;
+		else if ( fs_type == "LVM2_member" )
+		{
+			partition_temp .messages .push_back( lvm_warning ) ;
+			return GParted::FS_LVM2_PV ;
+		}
 		else if ( fs_type == "fat16" )
 			return GParted::FS_FAT16 ;
 		else if ( fs_type == "fat32" )
@@ -1194,9 +1202,7 @@ GParted::FILESYSTEM GParted_Core::get_filesystem()
 		if (    0 == memcmp( magic1, "LABELONE", 8 )
 		     && 0 == memcmp( magic2, "LVM2", 4 ) )
 		{
-			temp = _( "Logical Volume Management is not yet supported." ) ;
-			temp += "\n" ;
-			partition_temp .messages .push_back( temp ) ;
+			partition_temp .messages .push_back( lvm_warning ) ;
 			return GParted::FS_LVM2_PV ;
 		}
 	}
@@ -1412,7 +1418,6 @@ void GParted_Core::set_used_sectors( std::vector<Partition> & partitions )
 	{
 		if ( partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP &&
 		     partitions[ t ] .filesystem != GParted::FS_LUKS       &&
-		     partitions[ t ] .filesystem != GParted::FS_LVM2_PV    &&
 		     partitions[ t ] .filesystem != GParted::FS_UNKNOWN
 		   )
 		{
@@ -3007,6 +3012,7 @@ bool GParted_Core::set_proper_filesystem( const FILESYSTEM & filesystem )
 		case FS_EXT3		: p_filesystem = new ext3() ; 		break ;
 		case FS_EXT4		: p_filesystem = new ext4() ; 		break ;
 		case FS_LINUX_SWAP	: p_filesystem = new linux_swap() ; 	break ;
+		case FS_LVM2_PV		: p_filesystem = new lvm2_pv() ;	break ;
 		case FS_FAT16		: p_filesystem = new fat16() ; 		break ;
 		case FS_FAT32		: p_filesystem = new fat32() ; 		break ;
 		case FS_NILFS2		: p_filesystem = new nilfs2() ;		break ;
diff --git a/src/Makefile.am b/src/Makefile.am
index 5d0ab02..66a8e53 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -58,6 +58,7 @@ gpartedbin_SOURCES = \
 	hfsplus.cc			\
 	jfs.cc				\
 	linux_swap.cc			\
+	lvm2_pv.cc			\
 	main.cc				\
 	nilfs2.cc			\
 	ntfs.cc				\
diff --git a/src/lvm2_pv.cc b/src/lvm2_pv.cc
new file mode 100644
index 0000000..f022145
--- /dev/null
+++ b/src/lvm2_pv.cc
@@ -0,0 +1,103 @@
+/* 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.
+ */
+
+
+#include "../include/lvm2_pv.h"
+
+namespace GParted
+{
+
+FS lvm2_pv::get_filesystem_support()
+{
+	FS fs ;
+	fs .filesystem = GParted::FS_LVM2_PV ;
+
+	if ( ! Glib::find_program_in_path( "lvm" ) .empty() )
+	{
+		fs .read = GParted::FS::EXTERNAL ;
+	}
+
+	return fs ;
+}
+
+void lvm2_pv::set_used_sectors( Partition & partition )
+{
+	if ( ! Utils::execute_command( "lvm pvs --units b --noheadings --nosuffix -o pv_free " + partition .get_path(), output, error, true ) )
+	{
+		gdouble free_bytes = g_ascii_strtod( output .c_str(), NULL ) ;
+		partition .Set_Unused( Utils::round( free_bytes / double(partition .sector_size) ) ) ;
+	}
+	else
+	{
+		if ( ! output .empty() )
+			partition .messages .push_back( output ) ;
+
+		if ( ! error .empty() )
+			partition .messages .push_back( error ) ;
+	}
+}
+
+void lvm2_pv::read_label( Partition & partition )
+{
+	return ;
+}
+
+bool lvm2_pv::write_label( const Partition & partition, OperationDetail & operationdetail )
+{
+	return true ;
+}
+
+void lvm2_pv::read_uuid( Partition & partition )
+{
+}
+
+bool lvm2_pv::write_uuid( const Partition & partition, OperationDetail & operationdetail )
+{
+	return true ;
+}
+
+bool lvm2_pv::create( const Partition & new_partition, OperationDetail & operationdetail )
+{
+	return true ;
+}
+
+bool lvm2_pv::resize( const Partition & partition_new, OperationDetail & operationdetail, bool fill_partition )
+{
+	return true ;
+}
+
+bool lvm2_pv::move( const Partition & partition_new
+                  , const Partition & partition_old
+                  , OperationDetail & operationdetail
+               )
+{
+	return true ;
+}
+
+bool lvm2_pv::copy( const Glib::ustring & src_part_path
+                  , const Glib::ustring & dest_part_path
+                  , OperationDetail & operationdetail )
+{
+	return true ;
+}
+
+bool lvm2_pv::check_repair( const Partition & partition, OperationDetail & operationdetail )
+{
+	return true ;
+}
+
+} //GParted



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]