From: Harald Hoyer <[email protected]>

btrfs returns a major(0) for its device, so try to find the mountpoint and real 
device.
---
 src/readahead-common.c |   36 ++++++++++++++++++++++++++++++++++--
 1 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/src/readahead-common.c b/src/readahead-common.c
index 8533717..1ff027d 100644
--- a/src/readahead-common.c
+++ b/src/readahead-common.c
@@ -51,6 +51,25 @@ int file_verify(int fd, const char *fn, struct stat *st) {
         return 1;
 }
 
+static char *get_devname(const char *mountpoint)
+{
+        FILE *fp;
+        int maj, min;
+       char mp[1024], dev[1024];
+
+        fp = fopen("/proc/self/mountinfo", "r");
+        if (fp == NULL)
+                return NULL;
+        while (fscanf(fp, "%*s %*s %i:%i %*s %1024s %*s %*s %*s %1024s 
%*[^\n]", &maj, &min, mp, dev) == 4) {
+                if (strcmp(mountpoint, mp) == 0) {
+                       fclose(fp);
+                        return strdup(dev);
+                }
+        }
+        fclose(fp);
+        return NULL;
+}
+
 int fs_on_ssd(const char *p) {
         struct stat st;
         struct udev *udev = NULL;
@@ -66,8 +85,21 @@ int fs_on_ssd(const char *p) {
         if (!(udev = udev_new()))
                 return -ENOMEM;
 
-        if (!(udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev)))
-                goto finish;
+       if (major(st.st_dev) == 0) {
+               /* special device, might be on a btrfs */
+               int ret = -1;
+               char *devname = get_devname(p);
+               if (devname == NULL)
+                       return -EINVAL;
+               ret = stat(devname, &st);
+               free(devname);
+               if (ret < 0) {
+                       return -EINVAL;
+               }
+       }
+
+       if (!(udev_device = udev_device_new_from_devnum(udev, 'b', st.st_dev)))
+               goto finish;
 
         if ((devtype = udev_device_get_property_value(udev_device, "DEVTYPE")) 
&&
             streq(devtype, "partition"))
-- 
1.7.3

_______________________________________________
systemd-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to