From f6c2f00df7858a7f4b97e699b9bcf1023bba850a Mon Sep 17 00:00:00 2001 From: Mike Fleetwood Date: Thu, 22 Oct 2015 12:37:57 +0100 Subject: [PATCH] Populate member mount point with SWRaid array device (#756829) Busy file systems are accessed via a mount point, LVM Physical Volumes are activated via the Volume Group name and busy SWRaid members are accessed via the array device, /dev entry. Therefore choose to show the array device in the mount point field for busy SWRaid members. The kernel device name for an SWRaid array (without leading "/dev/") is the same as used in /proc/mdstat and /proc/partitions. Therefore the array device (with leading "/dev/") displayed in GParted will match between the mount point for busy SWRaid members and the array itself as used in the device combo box. # cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda1[2] sdb1[3] 524224 blocks super 1.0 [2/2] [UU] ... # cat /proc/partitions major minor #blocks name 8 0 33554432 sda 8 1 524288 sda1 ... 8 16 33554432 sdb 8 17 524288 sdb1 ... 9 1 524224 md1 ... Bug 756829 - SWRaid member detection enhancements --- include/SWRaid_Info.h | 2 ++ src/GParted_Core.cc | 6 ++++++ src/SWRaid_Info.cc | 31 ++++++++++++++++++++++--------- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/include/SWRaid_Info.h b/include/SWRaid_Info.h index e2b70a7f..a4d5fd6e 100644 --- a/include/SWRaid_Info.h +++ b/include/SWRaid_Info.h @@ -33,6 +33,7 @@ namespace GParted struct SWRaid_Member { Glib::ustring member; + Glib::ustring array; Glib::ustring uuid; Glib::ustring label; bool active; @@ -44,6 +45,7 @@ public: static void load_cache(); static bool is_member( const Glib::ustring & member_path ); static bool is_member_active( const Glib::ustring & member_path ); + static Glib::ustring get_array( const Glib::ustring & member_path ); static Glib::ustring get_uuid( const Glib::ustring & member_path ); static Glib::ustring get_label( const Glib::ustring & member_path ); diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc index 324d2d2f..b9bb9e3b 100644 --- a/src/GParted_Core.cc +++ b/src/GParted_Core.cc @@ -1817,6 +1817,12 @@ void GParted_Core::set_mountpoints( std::vector & partitions ) if ( ! vgname .empty() ) partitions[ t ] .add_mountpoint( vgname ) ; } + else if ( partitions[t].filesystem == FS_LINUX_SWRAID ) + { + Glib::ustring array_path = SWRaid_Info::get_array( partitions[t].get_path() ); + if ( ! array_path.empty() ) + partitions[t].add_mountpoint( array_path ); + } } } diff --git a/src/SWRaid_Info.cc b/src/SWRaid_Info.cc index 8bec78ca..66ff23cc 100644 --- a/src/SWRaid_Info.cc +++ b/src/SWRaid_Info.cc @@ -27,12 +27,13 @@ namespace GParted // Data model: // mdadm_found - Is the "mdadm" command available? // swraid_info_cache - Vector of member information in Linux Software RAID arrays. +// Only active arrays have /dev entries. // E.g. -// //member , uuid , label , active -// [{"/dev/sda1", "15224a42-c25b-bcd9-15db-60004e5fe53a", "chimney:1", true }, -// {"/dev/sda2", "15224a42-c25b-bcd9-15db-60004e5fe53a", "chimney:1", true }, -// {"/dev/sda6", "8dc7483c-d74e-e0a8-b6a8-dc3ca57e43f8", "" , false}, -// {"/dev/sdb6", "8dc7483c-d74e-e0a8-b6a8-dc3ca57e43f8", "" , false} +// //member , array , uuid , label , active +// [{"/dev/sda1", "/dev/md1", "15224a42-c25b-bcd9-15db-60004e5fe53a", "chimney:1", true }, +// {"/dev/sda2", "/dev/md1", "15224a42-c25b-bcd9-15db-60004e5fe53a", "chimney:1", true }, +// {"/dev/sda6", "" , "8dc7483c-d74e-e0a8-b6a8-dc3ca57e43f8", "" , false}, +// {"/dev/sdb6", "" , "8dc7483c-d74e-e0a8-b6a8-dc3ca57e43f8", "" , false} // ] // Initialise static data elements @@ -63,6 +64,14 @@ bool SWRaid_Info::is_member_active( const Glib::ustring & member_path ) return false; // No such member } +// Return array /dev entry (e.g. "/dev/md1") containing the specified member, or "" if the +// array is not running or there is no such member. +Glib::ustring SWRaid_Info::get_array( const Glib::ustring & member_path ) +{ + const SWRaid_Member & memb = get_cache_entry_by_member( member_path ); + return memb.array; +} + // Return array UUID for the specified member, or "" when failed to parse the UUID or // there is no such member. Glib::ustring SWRaid_Info::get_uuid( const Glib::ustring & member_path ) @@ -159,6 +168,7 @@ void SWRaid_Info::load_swraid_info_cache() { SWRaid_Member memb; memb.member = devices[j]; + memb.array = ""; memb.uuid = uuid; memb.label = label; memb.active = false; @@ -174,7 +184,7 @@ void SWRaid_Info::load_swraid_info_cache() } } - // Set which SWRaid members are active. + // For active SWRaid members, set array and active flag. std::string line; std::ifstream input( "/proc/mdstat" ); if ( input ) @@ -197,13 +207,16 @@ void SWRaid_Info::load_swraid_info_cache() if ( index != Glib::ustring::npos ) { // Field contains an "[" so got a short - // kernel device name of a member. Mark - // as active. + // kernel device name of a member. Set + // array and active flag. Glib::ustring mpath = "/dev/" + fields[i].substr( 0, index ); SWRaid_Member & memb = get_cache_entry_by_member( mpath ); if ( memb.member == mpath ) + { + memb.array = "/dev/" + fields[0]; memb.active = true; + } } } } @@ -221,7 +234,7 @@ SWRaid_Member & SWRaid_Info::get_cache_entry_by_member( const Glib::ustring & me if ( member_path == swraid_info_cache[i].member ) return swraid_info_cache[i]; } - static SWRaid_Member memb = {"", "", "", false}; + static SWRaid_Member memb = {"", "", "", "", false}; return memb; }