[gparted] Use BlockSpecial in FS_Info module cache (#767842)



commit ce8fb1dd91c045991d196fde300a419f00356c84
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Thu Jul 7 15:34:57 2016 +0100

    Use BlockSpecial in FS_Info module cache (#767842)
    
    The FS_Info cache is loaded from "blkid" output and compares block
    special names.  Therefore switch to using BlockSpecial objects so that
    comparisons are performed by the major, minor device number instead.
    
    Bug 767842 - File system usage missing when tools report alternate block
                 device names

 include/FS_Info.h |    4 +++-
 src/FS_Info.cc    |   33 ++++++++++++++++++---------------
 2 files changed, 21 insertions(+), 16 deletions(-)
---
diff --git a/include/FS_Info.h b/include/FS_Info.h
index f17836e..1db43bb 100644
--- a/include/FS_Info.h
+++ b/include/FS_Info.h
@@ -17,6 +17,8 @@
 #ifndef GPARTED_FS_INFO_H
 #define GPARTED_FS_INFO_H
 
+#include "../include/BlockSpecial.h"
+
 #include <glibmm/ustring.h>
 #include <vector>
 
@@ -25,7 +27,7 @@ namespace GParted
 
 struct FS_Entry
 {
-       Glib::ustring path;
+       BlockSpecial  path;
        Glib::ustring type;
        Glib::ustring sec_type;
        Glib::ustring uuid;
diff --git a/src/FS_Info.cc b/src/FS_Info.cc
index 323d45b..ea03a65 100644
--- a/src/FS_Info.cc
+++ b/src/FS_Info.cc
@@ -15,6 +15,7 @@
  */
 
 #include "../include/FS_Info.h"
+#include "../include/BlockSpecial.h"
 #include "../include/Utils.h"
 
 #include <glibmm/ustring.h>
@@ -32,15 +33,16 @@ bool FS_Info::need_blkid_vfat_cache_update_workaround = true;
 
 // Vector of file system information.
 // E.g.
-//     //path                     , type         , sec_type, uuid                                    , 
have_label, label
-//     [{"/dev/sda1"              , "xfs"        , ""      , "f828ee8c-1e16-4ca9-b234-e4949dcd4bd1"  , false 
    , ""          },
-//      {"/dev/sda2"              , "LVM2_member", ""      , "p31pR5-qPLm-YICz-O09i-sB4u-mAH2-GVSNWG", false 
    , ""          },
-//      {"/dev/block/8:2"         , "LVM2_member", ""      , "p31pR5-qPLm-YICz-O09i-sB4u-mAH2-GVSNWG", false 
    , ""          },
-//      {"/dev/mapper/centos-root", "xfs"        , ""      , "a195605d-22c1-422d-9213-1ed67f1eee46"  , false 
    , ""          },
-//      {"/dev/mapper/centos-swap", "swap"       , ""      , "8d419cb6-c663-4db7-b91c-6bcef8418a4d"  , false 
    , ""          },
-//      {"/dev/sdb1"              , "ext3"       , "ext2"  , "f218c3b8-237e-4fbe-92c5-76623bba4062"  , true  
    , "test-ext3" },
-//      {"/dev/sdb2"              , "vfat"       , "msdos" , "9F87-1061"                             , true  
    , "TEST-FAT16"},
-//      {"/dev/sdb3"              , ""           , ""      , ""                                      , false 
    , ""          }
+// (Note BS(path) is a short hand for constructor BlockSpecial(path)).
+//     //path                         , type         , sec_type, uuid                                    , 
have_label, label
+//     [{BS("/dev/sda1")              , "xfs"        , ""      , "f828ee8c-1e16-4ca9-b234-e4949dcd4bd1"  , 
false     , ""          },
+//      {BS("/dev/sda2")              , "LVM2_member", ""      , "p31pR5-qPLm-YICz-O09i-sB4u-mAH2-GVSNWG", 
false     , ""          },
+//      {BS("/dev/block/8:2")         , "LVM2_member", ""      , "p31pR5-qPLm-YICz-O09i-sB4u-mAH2-GVSNWG", 
false     , ""          },
+//      {BS("/dev/mapper/centos-root"), "xfs"        , ""      , "a195605d-22c1-422d-9213-1ed67f1eee46"  , 
false     , ""          },
+//      {BS("/dev/mapper/centos-swap"), "swap"       , ""      , "8d419cb6-c663-4db7-b91c-6bcef8418a4d"  , 
false     , ""          },
+//      {BS("/dev/sdb1")              , "ext3"       , "ext2"  , "f218c3b8-237e-4fbe-92c5-76623bba4062"  , 
true      , "test-ext3" },
+//      {BS("/dev/sdb2")              , "vfat"       , "msdos" , "9F87-1061"                             , 
true      , "TEST-FAT16"},
+//      {BS("/dev/sdb3")              , ""           , ""      , ""                                      , 
false     , ""          }
 //     ]
 std::vector<FS_Entry> FS_Info::fs_info_cache;
 
@@ -124,7 +126,7 @@ Glib::ustring FS_Info::get_path_by_uuid( const Glib::ustring & uuid )
 {
        for ( unsigned int i = 0 ; i < fs_info_cache.size() ; i ++ )
                if ( uuid == fs_info_cache[i].uuid )
-                       return fs_info_cache[i].path;
+                       return fs_info_cache[i].path.m_name;
 
        return "";
 }
@@ -134,7 +136,7 @@ Glib::ustring FS_Info::get_path_by_label( const Glib::ustring & label )
 {
        for ( unsigned int i = 0 ; i < fs_info_cache.size() ; i ++ )
                if ( label == fs_info_cache[i].label )
-                       return fs_info_cache[i].path;
+                       return fs_info_cache[i].path.m_name;
 
        return "";
 }
@@ -188,10 +190,11 @@ void FS_Info::load_fs_info_cache()
                Utils::split( output, lines, "\n" );
                for ( unsigned int i = 0 ; i < lines.size() ; i ++ )
                {
-                       FS_Entry fs_entry = {"", "", "", "", false, ""};
-                       fs_entry.path = Utils::regexp_label( lines[i], "^(.*): " );
-                       if ( fs_entry.path.length() > 0 )
+                       FS_Entry fs_entry = {BlockSpecial(), "", "", "", false, ""};
+                       Glib::ustring path = Utils::regexp_label( lines[i], "^(.*): " );
+                       if ( path.length() > 0 )
                        {
+                               fs_entry.path = BlockSpecial( path );
                                fs_entry.type = Utils::regexp_label( lines[i], " TYPE=\"([^\"]*)\"" );
                                fs_entry.sec_type = Utils::regexp_label( lines[i], " SEC_TYPE=\"([^\"]*)\"" );
                                fs_entry.uuid = Utils::regexp_label( lines[i], " UUID=\"([^\"]*)\"" );
@@ -212,7 +215,7 @@ const FS_Entry & FS_Info::get_cache_entry_by_path( const Glib::ustring & path )
                if ( path == fs_info_cache[i].path )
                        return fs_info_cache[i];
 
-       static FS_Entry not_found = {"", "", "", "", false, ""};
+       static FS_Entry not_found = {BlockSpecial(), "", "", "", false, ""};
        return not_found;
 }
 


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