From: Darrick J. Wong Date: Fri, 26 Aug 2016 01:17:46 +0000 (+1000) Subject: libxcmd: fix mount option parsing to find rt/log devices X-Git-Tag: v4.8.0-rc1~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=83d4957b00b2574c416c5f554636ffdf7b28845c;p=thirdparty%2Fxfsprogs-dev.git libxcmd: fix mount option parsing to find rt/log devices 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 Reviewed-by: Christoph Hellwig Signed-off-by: Dave Chinner --- diff --git a/libxcmd/paths.c b/libxcmd/paths.c index 71af25f2b..b08985f3c 100644 --- a/libxcmd/paths.c +++ b/libxcmd/paths.c @@ -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 */