aboutsummaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2025-02-25 11:48:14 +0100
committerKarel Zak <kzak@redhat.com>2025-02-25 11:53:45 +0100
commit781a960cef0599db0aca074403db87f24394c1af (patch)
tree52ee455555a95bf29c264f9fb8b347ae982b1301 /libmount/src
parent2263c16364b2248e73b9efd1c33c01bb190ba4a6 (diff)
downloadutil-linux-781a960cef0599db0aca074403db87f24394c1af.tar.gz
libmount: add support for STATMOUNT_SB_SOURCE
* read mount source by statmount() 9requires kernel >=6.14 * add new STATMOUNT_* masks Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount/src')
-rw-r--r--libmount/src/fs.c11
-rw-r--r--libmount/src/fs_statmount.c10
2 files changed, 17 insertions, 4 deletions
diff --git a/libmount/src/fs.c b/libmount/src/fs.c
index 999fec49b7..c01c313b11 100644
--- a/libmount/src/fs.c
+++ b/libmount/src/fs.c
@@ -427,7 +427,8 @@ const char *mnt_fs_get_srcpath(struct libmnt_fs *fs)
/* fstab-like fs */
if (fs->tagname)
return NULL; /* the source contains a "NAME=value" */
- return fs->source;
+
+ return mnt_fs_get_source(fs);
}
/**
@@ -439,7 +440,13 @@ const char *mnt_fs_get_srcpath(struct libmnt_fs *fs)
*/
const char *mnt_fs_get_source(struct libmnt_fs *fs)
{
- return fs ? fs->source : NULL;
+ if (!fs)
+ return NULL;
+
+#ifdef HAVE_STATMOUNT_API
+ mnt_fs_try_statmount(fs, source, STATMOUNT_SB_SOURCE);
+#endif
+ return fs->source;
}
/*
diff --git a/libmount/src/fs_statmount.c b/libmount/src/fs_statmount.c
index b7570e0320..a998ee23cf 100644
--- a/libmount/src/fs_statmount.c
+++ b/libmount/src/fs_statmount.c
@@ -195,6 +195,9 @@ static int apply_statmount(struct libmnt_fs *fs, struct ul_statmount *sm)
if (!rc && (sm->mask & STATMOUNT_MNT_ROOT) && !fs->root)
rc = mnt_fs_set_root(fs, sm_str(sm, sm->mnt_root));
+ if (!rc && (sm->mask & STATMOUNT_SB_SOURCE) && !fs->source)
+ rc = mnt_fs_set_source(fs, sm_str(sm, sm->sb_source));
+
if (!rc && (sm->mask & STATMOUNT_MNT_BASIC)) {
if (!fs->propagation)
fs->propagation = sm->mnt_propagation;
@@ -348,6 +351,8 @@ int mnt_fs_fetch_statmount(struct libmnt_fs *fs, uint64_t mask)
mask |= STATMOUNT_MNT_OPTS;
if (!fs->ns_id)
mask |= STATMOUNT_MNT_NS_ID;
+ if (!fs->source)
+ mask |= STATMOUNT_SB_SOURCE;
}
if (fs->ns_id)
@@ -364,14 +369,15 @@ int mnt_fs_fetch_statmount(struct libmnt_fs *fs, uint64_t mask)
DBG(FS, ul_debugobj(fs, " use private buffer"));
rc = sys_statmount(fs->uniq_id, 0, mask, &buf, &bufsiz, 0);
}
- DBG(FS, ul_debugobj(fs, " statmount [rc=%d bufsiz=%zu ns=%" PRIu64 " mask: %s%s%s%s%s%s]",
+ DBG(FS, ul_debugobj(fs, " statmount [rc=%d bufsiz=%zu ns=%" PRIu64 " mask: %s%s%s%s%s%s%s]",
rc, bufsiz, ns,
mask & STATMOUNT_SB_BASIC ? "sb-basic " : "",
mask & STATMOUNT_MNT_BASIC ? "mnt-basic " : "",
mask & STATMOUNT_MNT_ROOT ? "mnt-root " : "",
mask & STATMOUNT_MNT_POINT ? "mnt-point " : "",
mask & STATMOUNT_FS_TYPE ? "fs-type " : "",
- mask & STATMOUNT_MNT_OPTS ? "mnt-opts " : ""));
+ mask & STATMOUNT_MNT_OPTS ? "mnt-opts " : "",
+ mask & STATMOUNT_SB_SOURCE ? "sb-source " : ""));
if (!rc)
rc = apply_statmount(fs, buf);