Add reporting of linux-swap usage (#708107)

For active swap space read the usage from /proc/swaps.  (Linux kernel
uses units of 1 KiB).  By definition inactive swap space is 100% free.

    $ cat /proc/swaps
    Filename                                Type            Size    Used    Priority
    /dev/sda2                               partition       5242876 430552  -1

Always set fs.read = FS::EXTERNAL even if /proc/swaps doesn't exist so
that an attempt is made to open the file generating a specific error, in
addition to the generic error.

    open("/proc/swaps", O_RDONLY): No such file or directory

    Unable to read the contents of this file system!
    Because of this some operations may be unavailable.

    The cause might be a missing software package.
    The following list of software packages is required for linux-
    swap file system support: util-linux.

Closes Bug #708107 - Usage of swap space is not reported
This commit is contained in:
Mike Fleetwood 2013-09-14 14:51:16 +01:00 committed by Curtis Gedak
parent f41bb75495
commit 387b391d6d
3 changed files with 47 additions and 2 deletions

View file

@ -31,6 +31,7 @@ public:
virtual const Glib::ustring get_custom_text( CUSTOM_TEXT ttype, int index = 0 ) ; virtual const Glib::ustring get_custom_text( CUSTOM_TEXT ttype, int index = 0 ) ;
FS get_filesystem_support() ; FS get_filesystem_support() ;
void set_used_sectors( Partition & partition ) ;
void read_label( Partition & partition ) ; void read_label( Partition & partition ) ;
bool write_label( const Partition & partition, OperationDetail & operationdetail ) ; bool write_label( const Partition & partition, OperationDetail & operationdetail ) ;
void read_uuid( Partition & partition ) ; void read_uuid( Partition & partition ) ;

View file

@ -1539,8 +1539,7 @@ void GParted_Core::set_used_sectors( std::vector<Partition> & partitions, PedDis
{ {
for ( unsigned int t = 0 ; t < partitions .size() ; t++ ) for ( unsigned int t = 0 ; t < partitions .size() ; t++ )
{ {
if ( partitions[ t ] .filesystem != GParted::FS_LINUX_SWAP && if ( partitions[ t ] .filesystem != GParted::FS_LUKS &&
partitions[ t ] .filesystem != GParted::FS_LUKS &&
partitions[ t ] .filesystem != GParted::FS_UNKNOWN partitions[ t ] .filesystem != GParted::FS_UNKNOWN
) )
{ {

View file

@ -19,6 +19,8 @@
#include "../include/linux_swap.h" #include "../include/linux_swap.h"
#include <cerrno>
namespace GParted namespace GParted
{ {
@ -43,6 +45,9 @@ FS linux_swap::get_filesystem_support()
FS fs ; FS fs ;
fs .filesystem = GParted::FS_LINUX_SWAP ; fs .filesystem = GParted::FS_LINUX_SWAP ;
fs .read = FS::EXTERNAL ;
fs .online_read = FS::EXTERNAL ;
if ( ! Glib::find_program_in_path( "mkswap" ) .empty() ) if ( ! Glib::find_program_in_path( "mkswap" ) .empty() )
{ {
fs .create = GParted::FS::EXTERNAL ; fs .create = GParted::FS::EXTERNAL ;
@ -65,6 +70,46 @@ FS linux_swap::get_filesystem_support()
return fs ; return fs ;
} }
void linux_swap::set_used_sectors( Partition & partition )
{
if ( partition .busy )
{
T = -1 ; N = -1 ;
std::string line ;
std::ifstream input( "/proc/swaps" ) ;
if ( input )
{
Glib::ustring path = partition .get_path() ;
Glib::ustring::size_type path_len = path.length() ;
while ( getline( input, line ) )
{
if ( line .substr( 0, path_len ) == path )
{
sscanf( line .substr( path_len ) .c_str(), " %*s %Ld %Ld", &T, &N ) ;
break ;
}
}
input .close() ;
}
else
{
partition .messages .push_back( "open(\"/proc/swaps\", O_RDONLY): " + Glib::strerror( errno ) ) ;
}
if ( T > -1 && N > -1 )
{
T = Utils::round( T * ( KIBIBYTE / double(partition .sector_size) ) ) ;
N = Utils::round( N * ( KIBIBYTE / double(partition .sector_size) ) ) ;
partition .set_sector_usage( T, T - N ) ;
}
}
else
{
//By definition inactive swap space is 100% free
Sector size = partition .get_sector_length() ;
partition .set_sector_usage( size, size ) ;
}
}
void linux_swap::read_label( Partition & partition ) void linux_swap::read_label( Partition & partition )
{ {
if ( ! Utils::execute_command( "swaplabel " + partition .get_path(), output, error, true ) ) if ( ! Utils::execute_command( "swaplabel " + partition .get_path(), output, error, true ) )