aboutsummaryrefslogtreecommitdiffstats
path: root/libmount/src
diff options
context:
space:
mode:
authorKarel Zak <kzak@redhat.com>2023-05-23 12:06:36 +0200
committerKarel Zak <kzak@redhat.com>2023-05-23 12:06:36 +0200
commit99550bf5aa6d8d0193c2e253e5fb182f048d0c95 (patch)
tree0be8e44494a465e1b23efbd16d4af434d0d9cfee /libmount/src
parent9105d3cdd819a499f5029d1009952acf6f51b7d9 (diff)
parent1bd85b64632280d6bf0e86b4ff29da8b19321c5f (diff)
downloadutil-linux-99550bf5aa6d8d0193c2e253e5fb182f048d0c95.tar.gz
Merge branch 'libmount/mount_setattr' of https://github.com/t-8ch/util-linux
* 'libmount/mount_setattr' of https://github.com/t-8ch/util-linux: libmount: check for availability of mount_setattr
Diffstat (limited to 'libmount/src')
-rw-r--r--libmount/src/hook_mount.c23
1 files changed, 21 insertions, 2 deletions
diff --git a/libmount/src/hook_mount.c b/libmount/src/hook_mount.c
index a324637cb7..01de9e1c57 100644
--- a/libmount/src/hook_mount.c
+++ b/libmount/src/hook_mount.c
@@ -510,6 +510,15 @@ static inline int fsopen_is_supported(void)
return rc;
}
+static inline int mount_setattr_is_supported(void)
+{
+ int rc;
+
+ errno = 0;
+ rc = mount_setattr(-1, NULL, 0, NULL, 0);
+ return !(rc == -1 && errno == ENOSYS);
+}
+
/*
* open_tree() and fsopen()
*/
@@ -675,9 +684,14 @@ static int hook_prepare(struct libmnt_context *cxt,
/* call mount_setattr() */
if (!rc
&& cxt->helper == NULL
- && (set != 0 || clr != 0 || (flags & MS_REMOUNT)))
+ && (set != 0 || clr != 0 || (flags & MS_REMOUNT))) {
+ if (!mount_setattr_is_supported()) {
+ hookset_deinit(cxt, hs);
+ return 1;
+ }
rc = mnt_context_append_hook(cxt, hs, MNT_STAGE_MOUNT, NULL,
hook_set_vfsflags);
+ }
/* call move_mount() to attach target */
if (!rc
@@ -688,9 +702,14 @@ static int hook_prepare(struct libmnt_context *cxt,
hook_attach_target);
/* set propagation (has to be attached to VFS) */
- if (!rc && mnt_optlist_get_propagation(ol))
+ if (!rc && mnt_optlist_get_propagation(ol)) {
+ if (!mount_setattr_is_supported()) {
+ hookset_deinit(cxt, hs);
+ return 1;
+ }
rc = mnt_context_append_hook(cxt, hs, MNT_STAGE_MOUNT_POST, NULL,
hook_set_propagation);
+ }
DBG(HOOK, ul_debugobj(hs, "prepare mount done [rc=%d]", rc));
return rc;