]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
libxcmd: fix mount option parsing to find rt/log devices
authorDarrick J. Wong <darrick.wong@oracle.com>
Fri, 26 Aug 2016 01:17:46 +0000 (11:17 +1000)
committerDave Chinner <david@fromorbit.com>
Fri, 26 Aug 2016 01:17:46 +0000 (11:17 +1000)
It turns out that glibc's hasmntopt implementation returns NULL
if the opt parameter ends with an equals ('=').  Therefore, we
cannot directly search for the option 'rtdev='; we must instead
have hasmntopt look for 'rtdev' and look for the trailing equals
sign ourselves.  This fixes xfs_info's reporting of external
log and realtime device paths, and xfs_scrub will need it for
data block scrubbing of realtime extents.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Dave Chinner <david@fromorbit.com>
libxcmd/paths.c

index 71af25f2bb9f75cab0c7c6972954f3bc6dd60b4d..b08985f3c4fc8300174e65318b18f065985d9e1b 100644 (file)
@@ -234,10 +234,17 @@ fs_extract_mount_options(
 {
        char            *fslog, *fsrt;
 
-       /* Extract log device and realtime device from mount options */
-       if ((fslog = hasmntopt(mnt, "logdev=")))
+       /*
+        * Extract log device and realtime device from mount options.
+        *
+        * Note: the glibc hasmntopt implementation requires that the
+        * character in mnt_opts immediately after the search string
+        * must be a NULL ('\0'), a comma (','), or an equals ('=').
+        * Therefore we cannot search for 'logdev=' directly.
+        */
+       if ((fslog = hasmntopt(mnt, "logdev")) && fslog[6] == '=')
                fslog += 7;
-       if ((fsrt = hasmntopt(mnt, "rtdev=")))
+       if ((fsrt = hasmntopt(mnt, "rtdev")) && fsrt[5] == '=')
                fsrt += 6;
 
        /* Do this only after we've finished processing mount options */