Display array device as mount point of dmraid started ATARAID members (#75)

This matches how the array device is displayed as the mount point for
mdadm started ATARAID members by "Display array device as mount point of
mdadm started ATARAID members (#75)" earlier in this patchset.

Extend the DMRaid module member cache to save the array device name and
use as needed to display as the mount point.

Closes #75 - Errors with GPT on RAID 0 ATARAID array
This commit is contained in:
Mike Fleetwood 2019-11-20 21:21:07 +00:00 committed by Curtis Gedak
parent caec22871e
commit bb865aaaa4
3 changed files with 57 additions and 12 deletions

View File

@ -39,6 +39,13 @@ namespace GParted
{
struct DMRaid_Member
{
BlockSpecial member;
Glib::ustring array;
};
class DMRaid
{
public:
@ -60,6 +67,7 @@ public:
bool purge_dev_map_entries( const Glib::ustring & dev_path ) ;
bool update_dev_map_entry( const Partition & partition, OperationDetail & operationdetail ) ;
bool is_member_active(const Glib::ustring& member_path);
const Glib::ustring& get_array(const Glib::ustring& member_path);
private:
void load_dmraid_cache() ;
@ -68,13 +76,14 @@ private:
void get_affected_dev_map_entries( const Partition & partition, std::vector<Glib::ustring> & affected_entries ) ;
void get_partition_dev_map_entries( const Partition & partition, std::vector<Glib::ustring> & partition_entries ) ;
static std::vector<Glib::ustring> lookup_dmraid_members(const Glib::ustring& array);
static const DMRaid_Member& get_cache_entry_by_member(const Glib::ustring& member_path);
static bool dmraid_cache_initialized ;
static bool dmraid_found ;
static bool dmsetup_found ;
static bool udevadm_found ;
static std::vector<Glib::ustring> dmraid_devices ;
static std::vector<BlockSpecial> dmraid_member_cache;
static std::vector<DMRaid_Member> dmraid_member_cache;
};
}//GParted

View File

@ -40,7 +40,10 @@ namespace GParted
// ["isw_ecccdhhiga_MyArray"]
// dmraid_member_cache - Vector of members of active DMRaid arrays.
// E.g.
// [BlockSpecial("/dev/sdc"), BlockSpecial("/dev/sdd")]
// //member , array
// [{BlockSpecial("/dev/sdc"), "/dev/mapper/isw_ecccdhhiga_MyArray"},
// {BlockSpecial("/dev/sdd"), "/dev/mapper/isw_ecccdhhiga_MyArray"}
// ]
//Initialize static data elements
bool DMRaid::dmraid_cache_initialized = false ;
@ -48,7 +51,7 @@ bool DMRaid::dmraid_found = false ;
bool DMRaid::dmsetup_found = false ;
bool DMRaid::udevadm_found = false ;
std::vector<Glib::ustring> DMRaid::dmraid_devices ;
std::vector<BlockSpecial> DMRaid::dmraid_member_cache;
std::vector<DMRaid_Member> DMRaid::dmraid_member_cache;
DMRaid::DMRaid()
@ -102,7 +105,12 @@ void DMRaid::load_dmraid_cache()
{
std::vector<Glib::ustring> members = lookup_dmraid_members(DEV_MAPPER_PATH + dmraid_devices[i]);
for (unsigned int j = 0; j < members.size(); j++)
dmraid_member_cache.push_back(BlockSpecial(members[j]));
{
DMRaid_Member memb;
memb.member = BlockSpecial(members[j]);
memb.array = DEV_MAPPER_PATH + dmraid_devices[i];
dmraid_member_cache.push_back(memb);
}
}
}
@ -523,17 +531,23 @@ bool DMRaid::update_dev_map_entry( const Partition & partition, OperationDetail
// or not.
bool DMRaid::is_member_active(const Glib::ustring& member_path)
{
BlockSpecial bs = BlockSpecial(member_path);
for (unsigned int i = 0; i < dmraid_member_cache.size(); i++)
{
if (bs == dmraid_member_cache[i])
return true;
}
const DMRaid_Member& memb = get_cache_entry_by_member(member_path);
if (memb.member.m_name.length() > 0)
return true;
return false;
}
// Return array device containing the specified member, or "" if the array is not running
// or there is no such member.
const Glib::ustring& DMRaid::get_array(const Glib::ustring& member_path)
{
const DMRaid_Member& memb = get_cache_entry_by_member(member_path);
return memb.array;
}
// Return vector of member devices of an active DMRaid array.
// E.g. lookup_dmraid_members("/dev/mapper/isw_ecccdhhiga_MyArray") -> ["/dev/sdc", "/dev/sdd"]
std::vector<Glib::ustring> DMRaid::lookup_dmraid_members(const Glib::ustring& array)
@ -570,4 +584,20 @@ std::vector<Glib::ustring> DMRaid::lookup_dmraid_members(const Glib::ustring& ar
}
// Perform linear search of the cache to find the matching member.
// Return found cache entry or not found substitute.
const DMRaid_Member& DMRaid::get_cache_entry_by_member(const Glib::ustring& member_path)
{
BlockSpecial bs = BlockSpecial(member_path);
for (unsigned int i = 0; i < dmraid_member_cache.size(); i++)
{
if (bs == dmraid_member_cache[i].member)
return dmraid_member_cache[i];
}
static const DMRaid_Member notfound_memb = {BlockSpecial(), ""};
return notfound_memb;
}
}//GParted

View File

@ -1408,9 +1408,7 @@ void GParted_Core::insert_unallocated( const Glib::ustring & device_path,
void GParted_Core::set_mountpoints( Partition & partition )
{
#ifndef USE_LIBPARTED_DMRAID
DMRaid dmraid ; //Use cache of dmraid device information
#endif
if ( partition.filesystem == FS_LVM2_PV )
{
@ -1428,7 +1426,15 @@ void GParted_Core::set_mountpoints( Partition & partition )
{
Glib::ustring array_path = SWRaid_Info::get_array(partition.get_path());
if (! array_path.empty())
{
partition.add_mountpoint(array_path);
}
else
{
array_path = dmraid.get_array(partition.get_path());
if (! array_path.empty())
partition.add_mountpoint(array_path);
}
}
else if ( partition.filesystem == FS_LUKS )
{