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@xxxxxxxxxx>
---
libxcmd/paths.c | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/libxcmd/paths.c b/libxcmd/paths.c
index 71af25f..b08985f 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 */
|