[gparted] Show bcache device as mount point of registered backing device (#183)



commit 013c99242889dcf08d40140a651b6951e534ae7c
Author: Mike Fleetwood <mike fleetwood googlemail com>
Date:   Fri Jan 7 17:34:49 2022 +0000

    Show bcache device as mount point of registered backing device (#183)
    
    A bcache device provides accelerated access to a backing device in a one
    to one relationship.  Multiple bcache backing devices can be attached to
    and accelerated by the same cache device.  Extending the setup from the
    previous commit, create an additional backing device and attach it to
    the same cache.
        # bcache make -B /dev/sdb2
        # bcache attach /dev/sdc1 /dev/sdb2
        # bcache show
        Name        Type        State            Bname     AttachToDev
        /dev/sdb2   1 (data)    clean(running)   bcache1   /dev/sdc1
        /dev/sdb1   1 (data)    clean(running)   bcache0   /dev/sdc1
        /dev/sdc1   3 (cache)   active           N/A       N/A
    
    List a couple of bcache specific sysfs files which identify registered
    (active) bcache devices (components).
        # ls -l /sys/block/sd?/sd??/bcache/{dev,set}
        lrwxrwxrwx. 1 root root 0 Jan  7 10:08 /sys/block/sdb/sdb1/bcache/dev -> 
../../../../../../../../../../virtual/block/bcache0
        lrwxrwxrwx. 1 root root 0 Jan  7 11:53 /sys/block/sdb/sdb2/bcache/dev -> 
../../../../../../../../../../virtual/block/bcache1
        lrwxrwxrwx. 1 root root 0 Jan  7 11:53 /sys/block/sdc/sdc1/bcache/set -> 
../../../../../../../../../../../fs/bcache/9945e165-0604-4f29-94bd-b155d01080ad
    
    As was done with previous software block devices [1][2][3][4] show the
    bcache (access) device as the mount point of a backing device
    (component).  Use the /sys/block/DEV[/PTN]/bcache/dev sysfs symlinks to
    provide the bcache device names.  Bcache cache devices (components)
    don't get mount points because they aren't accessible.
    
    [1] commit 8083f11d84dbd4f186271a3cdbf5170db259f8b8
        Display LVM2 VGNAME as the PV's mount point (#160787)
    [2] commit f6c2f00df7858a7f4b97e699b9bcf1023bba850a
        Populate member mount point with SWRaid array device (#756829)
    [3] commit 538c866d099bc1f2bab3a41dc13a00b3d4336bbf
        Display array device as mount point of mdadm started ATARAID members
        (#75)
    [4] commit 538c866d099bc1f2bab3a41dc13a00b3d4336bbf
        Display array device as mount point of mdadm started ATARAID members
        (#75)
    
    Closes #183 - Basic support for bcache

 include/BCache_Info.h |  5 +++++
 src/BCache_Info.cc    | 35 ++++++++++++++++++++++++++++++-----
 src/GParted_Core.cc   |  7 +++++++
 3 files changed, 42 insertions(+), 5 deletions(-)
---
diff --git a/include/BCache_Info.h b/include/BCache_Info.h
index 5265a547..6d24313b 100644
--- a/include/BCache_Info.h
+++ b/include/BCache_Info.h
@@ -36,6 +36,11 @@ class BCache_Info
 {
 public:
        static bool is_active(const Glib::ustring& device_path, const Glib::ustring& partition_path);
+       static Glib::ustring get_bcache_device(const Glib::ustring& device_path, const Glib::ustring& 
partition_path);
+
+private:
+       static Glib::ustring get_sysfs_bcache_path(const Glib::ustring& device_path,
+                                                  const Glib::ustring& partition_path);
 };
 
 
diff --git a/src/BCache_Info.cc b/src/BCache_Info.cc
index ff9bd105..129a5178 100644
--- a/src/BCache_Info.cc
+++ b/src/BCache_Info.cc
@@ -17,6 +17,8 @@
 
 #include "BCache_Info.h"
 
+#include <string.h>  // GNU version of basename()
+#include <unistd.h>
 #include <glibmm/ustring.h>
 #include <glibmm/fileutils.h>
 
@@ -29,22 +31,45 @@ namespace GParted
 // otherwise.  Equivalent to does the directory /sys/block/DEV[/PTN]/bcache exist?
 bool BCache_Info::is_active(const Glib::ustring& device_path, const Glib::ustring& partition_path)
 {
-       Glib::ustring bcache_path;
+       return file_test(get_sysfs_bcache_path(device_path, partition_path), Glib::FILE_TEST_IS_DIR);
+}
+
+
+// Return the bcache device name for a registered bcache backing device (active
+// component), or an empty string.
+// E.g.: ("/dev/sdb", "/dev/sdb1") -> "/dev/bcache0"
+Glib::ustring BCache_Info::get_bcache_device(const Glib::ustring& device_path, const Glib::ustring& 
partition_path)
+{
+       Glib::ustring sysfs_path = get_sysfs_bcache_path(device_path, partition_path) + "/dev";
+
+       char buf[128];  // Large enough for link target
+                       // "../../../../../../../../../../virtual/block/bcache0".
+       ssize_t len = readlink(sysfs_path.c_str(), buf, sizeof(buf)-1);
+       if (len < 0)
+               return Glib::ustring("");
+       buf[len] = '\0';
+
+       return "/dev/" + Glib::ustring(basename(buf));
+}
+
+
+// Private methods
+
+Glib::ustring BCache_Info::get_sysfs_bcache_path(const Glib::ustring& device_path, const Glib::ustring& 
partition_path)
+{
        Glib::ustring dev_name = device_path.substr(5);  // Remove leading "/dev/".
 
        if (device_path == partition_path)
        {
                // Whole drive
-               bcache_path = "/sys/block/" + dev_name + "/bcache";
+               return "/sys/block/" + dev_name + "/bcache";
        }
        else
        {
                // Partition on drive
                Glib::ustring ptn_name = partition_path.substr(5);  // Remove leading "/dev/".
-               bcache_path = "/sys/block/" + dev_name + "/" + ptn_name + "/bcache";
+               return "/sys/block/" + dev_name + "/" + ptn_name + "/bcache";
        }
-
-       return file_test(bcache_path, Glib::FILE_TEST_IS_DIR);
 }
 
 
diff --git a/src/GParted_Core.cc b/src/GParted_Core.cc
index 7dae661d..f28de6bf 100644
--- a/src/GParted_Core.cc
+++ b/src/GParted_Core.cc
@@ -1491,6 +1491,13 @@ void GParted_Core::set_mountpoints( Partition & partition )
                                partition.add_mountpoint(array_path_2);
                }
        }
+       else if (partition.fstype == FS_BCACHE)
+       {
+               const Glib::ustring bcache_path = BCache_Info::get_bcache_device(partition.device_path,
+                                                                                partition.get_path());
+               if (! bcache_path.empty())
+                       partition.add_mountpoint(bcache_path);
+       }
        else if (partition.fstype == FS_LUKS)
        {
                LUKS_Mapping mapping = LUKS_Info::get_cache_entry( partition.get_path() );


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