util-linux/backport-libmount-all-continue-although-proc-is-not-mounted.patch
zhangyao e4b266fdf2 sync community patches
(cherry picked from commit 6dd51158f697e8922904bf11109bd894487a9419)
2023-06-05 15:48:48 +08:00

114 lines
4.3 KiB
Diff

From b8f2fce2a20944cd8b1a7e91dfa04f9725ec3eb8 Mon Sep 17 00:00:00 2001
From: Karel Zak <kzak@redhat.com>
Date: Thu, 18 Nov 2021 11:47:08 +0100
Subject: [PATCH] libmount: (--all) continue although /proc is not mounted
Now 'mount --all' ends with error if /proc is not mounted and there is
some other entry before /proc in fstab. This commit improves this
situation and ignores all mount table related errors if the table is
empty.
This is important for situation when there is for example "/" as the
first line in fstab.
Addresses: https://github.com/util-linux/util-linux/issues/1492
Signed-off-by: Karel Zak <kzak@redhat.com>
---
libmount/src/context.c | 25 +++++++++++++++++--------
libmount/src/context_mount.c | 9 ++++++++-
sys-utils/mount.8.adoc | 2 ++
3 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/libmount/src/context.c b/libmount/src/context.c
index 3b32224..bd215c0 100644
--- a/libmount/src/context.c
+++ b/libmount/src/context.c
@@ -1298,6 +1298,16 @@ int mnt_context_get_mtab(struct libmnt_context *cxt, struct libmnt_table **tb)
cxt->table_fltrcb_data);
mnt_table_set_cache(cxt->mtab, mnt_context_get_cache(cxt));
+ }
+
+ /* Read the table; it's empty, because this first mnt_context_get_mtab()
+ * call, or because /proc was not accessible in previous calls */
+ if (mnt_table_is_empty(cxt->mtab)) {
+ if (!ns_old) {
+ ns_old = mnt_context_switch_target_ns(cxt);
+ if (!ns_old)
+ return -MNT_ERR_NAMESPACE;
+ }
/*
* Note that mtab_path is NULL if mtab is useless or unsupported
@@ -2874,7 +2884,7 @@ int mnt_context_is_fs_mounted(struct libmnt_context *cxt,
struct libmnt_fs *fs, int *mounted)
{
struct libmnt_table *mtab, *orig;
- int rc;
+ int rc = 0;
struct libmnt_ns *ns_old;
if (!cxt || !fs || !mounted)
@@ -2893,18 +2903,17 @@ int mnt_context_is_fs_mounted(struct libmnt_context *cxt,
cxt->mtab = NULL;
}
*mounted = 0;
- return 0; /* /proc not mounted */
- }
+ rc = 0; /* /proc not mounted */
- if (rc)
- return rc;
-
- *mounted = __mnt_table_is_fs_mounted(mtab, fs,
+ } else if (rc == 0) {
+ *mounted = __mnt_table_is_fs_mounted(mtab, fs,
mnt_context_get_target_prefix(cxt));
+ }
+
if (!mnt_context_switch_ns(cxt, ns_old))
return -MNT_ERR_NAMESPACE;
- return 0;
+ return rc;
}
static int mnt_context_add_child(struct libmnt_context *cxt, pid_t pid)
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index 55ebf79..f9bedd2 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -1397,8 +1397,15 @@ int mnt_context_next_mount(struct libmnt_context *cxt,
/* ignore already mounted filesystems */
rc = mnt_context_is_fs_mounted(cxt, *fs, &mounted);
- if (rc)
+ if (rc) {
+ if (mnt_table_is_empty(cxt->mtab)) {
+ DBG(CXT, ul_debugobj(cxt, "next-mount: no mount table [rc=%d], ignore", rc));
+ rc = 0;
+ if (ignored)
+ *ignored = 1;
+ }
return rc;
+ }
if (mounted) {
if (ignored)
*ignored = 2;
diff --git a/sys-utils/mount.8.adoc b/sys-utils/mount.8.adoc
index 6e72d48..e8f0c36 100644
--- a/sys-utils/mount.8.adoc
+++ b/sys-utils/mount.8.adoc
@@ -301,6 +301,8 @@ Command-line options available for the *mount* command are:
*-a*, *--all*::
Mount all filesystems (of the given types) mentioned in _fstab_ (except for those whose line contains the *noauto* keyword). The filesystems are mounted following their order in _fstab_. The *mount* command compares filesystem source, target (and fs root for bind mount or btrfs) to detect already mounted filesystems. The kernel table with already mounted filesystems is cached during *mount --all*. This means that all duplicated _fstab_ entries will be mounted.
+
+The correct functionality depends on /proc (to detect already mounted filesystems) and on /sys (to evaluate filesystem tags like UUID= or LABEL=). It's strongly recommended to mount /proc and /sys filesystems before *mount -a* is executed, or keep /proc and /sys at the beginning of fstab.
++
The option *--all* is possible to use for remount operation too. In this case all filters (*-t* and *-O*) are applied to the table of already mounted filesystems.
+
Since version 2.35 is possible to use the command line option *-o* to alter mount options from _fstab_ (see also *--options-mode*).
--
2.27.0