Good time of day, list.
I have try to fix "Fixme" in svg.c:
/* FIXME: this works only in the simple case */
// By default function try to get only root=/dev/*

I rewrite to parse /proc/self/mountinfo
This only support root device like /dev/???*
I can't support LVM/Luks & etc, i'm not using these setups.

I also attach patch. Thanks.

v2:
        Rewrited with use fstab_node_to_udev_node()
        and canonicalize_file_name() functions.
v3:
        Rewrited for parsing /proc/self/mountinfo

v4:
        Again rewrited.
        Search "/" in 5th column and
        parse get name of bdev from 10th column

Not tested while boot process, code in separate binary file working good.

From 97d259c38da3a32569e30bfaf7df56c062c570a6 Mon Sep 17 00:00:00 2001
From: Timofey Titovets <nefelim...@gmail.com>
Date: Fri, 31 Oct 2014 15:43:30 +0300
Subject: [PATCH] Bootchart: use /proc/pid/mountinfo for root bdev

---
 src/bootchart/svg.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
index faf377e..2e9c039 100644
--- a/src/bootchart/svg.c
+++ b/src/bootchart/svg.c
@@ -151,6 +151,22 @@ static void svg_header(void) {
         svg("    ]]>\n   </style>\n</defs>\n\n");
 }

+void get_rootbdev(char *rootbdev) {
+        FILE *file = fopen("/proc/self/mountinfo", "r");
+        char mnt_point[PATH_MAX];
+        char mnt_source[PATH_MAX];
+        char t[256]; // Trash
+        while (file && strcmp(mnt_point, "/") && !feof(file)){
+        fscanf(file, "%s %s %s %s %s %s %s %s %s %s %s",
+               t,t,t,t,
+               mnt_point,  t,t,t,t,
+               mnt_source, t);
+        }
+        if(!strcmp(mnt_point, "/"))
+                strncpy(rootbdev, &mnt_source[5], 3);
+        fclose(file);
+}
+
 static void svg_title(const char *build) {
         char cmdline[256] = "";
         char filename[PATH_MAX];
@@ -159,7 +175,6 @@ static void svg_title(const char *build) {
         char model[256] = "Unknown";
         char date[256] = "Unknown";
         char cpu[256] = "Unknown";
-        char *c;
         FILE *f;
         time_t t;
         int fd, r;
@@ -174,12 +189,10 @@ static void svg_title(const char *build) {
                 fclose(f);
         }

-        /* extract root fs so we can find disk model name in sysfs */
-        /* FIXME: this works only in the simple case */
-        c = strstr(cmdline, "root=/dev/");
-        if (c) {
-                strncpy(rootbdev, &c[10], 3);
-                rootbdev[3] = '\0';
+        f = fopen("/proc/self/mountinfo", "r");
+        if (f) {
+                fclose(f);
+                get_rootbdev(rootbdev);
                 sprintf(filename, "block/%s/device/model", rootbdev);
                 fd = openat(sysfd, filename, O_RDONLY);
                 f = fdopen(fd, "r");
--
2.1.3


>From 97d259c38da3a32569e30bfaf7df56c062c570a6 Mon Sep 17 00:00:00 2001
From: Timofey Titovets <nefelim...@gmail.com>
Date: Fri, 31 Oct 2014 15:43:30 +0300
Subject: [PATCH] Bootchart: use /proc/pid/mountinfo for root bdev

---
 src/bootchart/svg.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/src/bootchart/svg.c b/src/bootchart/svg.c
index faf377e..2e9c039 100644
--- a/src/bootchart/svg.c
+++ b/src/bootchart/svg.c
@@ -151,6 +151,22 @@ static void svg_header(void) {
         svg("    ]]>\n   </style>\n</defs>\n\n");
 }
 
+void get_rootbdev(char *rootbdev) {
+        FILE *file = fopen("/proc/self/mountinfo", "r");
+        char mnt_point[PATH_MAX];
+        char mnt_source[PATH_MAX];
+        char t[256]; // Trash
+        while (file && strcmp(mnt_point, "/") && !feof(file)){
+        fscanf(file, "%s %s %s %s %s %s %s %s %s %s %s",
+               t,t,t,t,
+               mnt_point,  t,t,t,t,
+               mnt_source, t);
+        }
+        if(!strcmp(mnt_point, "/"))
+                strncpy(rootbdev, &mnt_source[5], 3);
+        fclose(file);
+}
+
 static void svg_title(const char *build) {
         char cmdline[256] = "";
         char filename[PATH_MAX];
@@ -159,7 +175,6 @@ static void svg_title(const char *build) {
         char model[256] = "Unknown";
         char date[256] = "Unknown";
         char cpu[256] = "Unknown";
-        char *c;
         FILE *f;
         time_t t;
         int fd, r;
@@ -174,12 +189,10 @@ static void svg_title(const char *build) {
                 fclose(f);
         }
 
-        /* extract root fs so we can find disk model name in sysfs */
-        /* FIXME: this works only in the simple case */
-        c = strstr(cmdline, "root=/dev/");
-        if (c) {
-                strncpy(rootbdev, &c[10], 3);
-                rootbdev[3] = '\0';
+        f = fopen("/proc/self/mountinfo", "r");
+        if (f) {
+                fclose(f);
+                get_rootbdev(rootbdev);
                 sprintf(filename, "block/%s/device/model", rootbdev);
                 fd = openat(sysfd, filename, O_RDONLY);
                 f = fdopen(fd, "r");
-- 
2.1.3

_______________________________________________
systemd-devel mailing list
systemd-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/systemd-devel

Reply via email to