summaryrefslogtreecommitdiffstats
path: root/libmount
diff options
context:
space:
mode:
authorKarel Zak2012-01-25 17:14:24 +0100
committerKarel Zak2012-01-25 17:14:24 +0100
commit5810d870970709684cee1219f3459b5cc3fc9915 (patch)
tree4dcebb6acbde599b8447c65a0ceefb87d9f92ee9 /libmount
parentblkid: move cache to /run on new systems (diff)
downloadkernel-qcow2-util-linux-5810d870970709684cee1219f3459b5cc3fc9915.tar.gz
kernel-qcow2-util-linux-5810d870970709684cee1219f3459b5cc3fc9915.tar.xz
kernel-qcow2-util-linux-5810d870970709684cee1219f3459b5cc3fc9915.zip
libmount: don't pass comments=/x-* to mount.<type> helpers
This patch add a new flag MNT_NOHLPS for mount options map, options with this flag will not be passed to /sbin/mount.<type> helpers. Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'libmount')
-rw-r--r--libmount/src/context_mount.c32
-rw-r--r--libmount/src/libmount.h.in1
-rw-r--r--libmount/src/optmap.c20
3 files changed, 38 insertions, 15 deletions
diff --git a/libmount/src/context_mount.c b/libmount/src/context_mount.c
index 17bbd4287..b3a26fcc8 100644
--- a/libmount/src/context_mount.c
+++ b/libmount/src/context_mount.c
@@ -147,26 +147,50 @@ done:
*/
static int generate_helper_optstr(struct libmnt_context *cxt, char **optstr)
{
+ struct libmnt_optmap const *maps[1];
+ char *next, *name, *val;
+ size_t namesz, valsz;
int rc = 0;
assert(cxt);
assert(cxt->fs);
assert(optstr);
+ DBG(CXT, mnt_debug_h(cxt, "mount: generate heper mount options"));
+
*optstr = mnt_fs_strdup_options(cxt->fs);
if (!*optstr)
return -ENOMEM;
if (cxt->flags & MNT_FL_SAVED_USER)
rc = mnt_optstr_set_option(optstr, "user", cxt->orig_user);
- if (rc) {
- free(*optstr);
- *optstr = NULL;
+ if (rc)
+ goto err;
+
+ /* remove userspace options with MNT_NOHLPS flag */
+ maps[0] = mnt_get_builtin_optmap(MNT_USERSPACE_MAP);
+ next = *optstr;
+
+ while (!mnt_optstr_next_option(&next, &name, &namesz, &val, &valsz)) {
+ const struct libmnt_optmap *ent;
+
+ mnt_optmap_get_entry(maps, 1, name, namesz, &ent);
+ if (ent && ent->id && (ent->mask & MNT_NOHLPS)) {
+ next = name;
+ rc = mnt_optstr_remove_option_at(optstr, name,
+ val ? val + valsz : name + namesz);
+ if (rc)
+ goto err;
+ }
}
+
+ return rc;
+err:
+ free(*optstr);
+ *optstr = NULL;
return rc;
}
-
/*
* this has to be called before fix_optstr()
*/
diff --git a/libmount/src/libmount.h.in b/libmount/src/libmount.h.in
index 3cc1a79e7..c407b98a9 100644
--- a/libmount/src/libmount.h.in
+++ b/libmount/src/libmount.h.in
@@ -70,6 +70,7 @@ struct libmnt_optmap
#define MNT_INVERT (1 << 1) /* invert the mountflag */
#define MNT_NOMTAB (1 << 2) /* skip in the mtab option string */
#define MNT_PREFIX (1 << 3) /* prefix used for some options (e.g. "x-foo") */
+#define MNT_NOHLPS (1 << 4) /* don't add the option to mount.<type> helpers command line */
/**
* libmnt_fs:
diff --git a/libmount/src/optmap.c b/libmount/src/optmap.c
index 7bd4da736..4f11ce598 100644
--- a/libmount/src/optmap.c
+++ b/libmount/src/optmap.c
@@ -117,15 +117,13 @@ static const struct libmnt_optmap linux_flags_map[] =
/*
* userspace mount option (built-in MNT_USERSPACE_MAP)
- *
- * TODO: offset=, sizelimit=, encryption=, vfs=
*/
static const struct libmnt_optmap userspace_opts_map[] =
{
{ "defaults", 0, 0 }, /* default options */
- { "auto", MNT_MS_NOAUTO, MNT_INVERT | MNT_NOMTAB }, /* Can be mounted using -a */
- { "noauto", MNT_MS_NOAUTO, MNT_NOMTAB }, /* Can only be mounted explicitly */
+ { "auto", MNT_MS_NOAUTO, MNT_NOHLPS | MNT_INVERT | MNT_NOMTAB }, /* Can be mounted using -a */
+ { "noauto", MNT_MS_NOAUTO, MNT_NOHLPS | MNT_NOMTAB }, /* Can only be mounted explicitly */
{ "user[=]", MNT_MS_USER }, /* Allow ordinary user to mount (mtab) */
{ "nouser", MNT_MS_USER, MNT_INVERT | MNT_NOMTAB }, /* Forbid ordinary user to mount */
@@ -141,19 +139,19 @@ static const struct libmnt_optmap userspace_opts_map[] =
{ "_netdev", MNT_MS_NETDEV }, /* Device requires network */
- { "comment=", MNT_MS_COMMENT, MNT_NOMTAB }, /* fstab comment only */
- { "x-", MNT_MS_XCOMMENT, MNT_NOMTAB | MNT_PREFIX }, /* x- options */
+ { "comment=", MNT_MS_COMMENT, MNT_NOHLPS | MNT_NOMTAB },/* fstab comment only */
+ { "x-", MNT_MS_XCOMMENT, MNT_NOHLPS | MNT_NOMTAB | MNT_PREFIX }, /* x- options */
- { "loop[=]", MNT_MS_LOOP }, /* use the loop device */
- { "offset=", MNT_MS_OFFSET, MNT_NOMTAB }, /* loop device offset */
- { "sizelimit=", MNT_MS_SIZELIMIT, MNT_NOMTAB }, /* loop device size limit */
- { "encryption=", MNT_MS_ENCRYPTION, MNT_NOMTAB }, /* loop device encryption */
+ { "loop[=]", MNT_MS_LOOP, MNT_NOHLPS }, /* use the loop device */
+ { "offset=", MNT_MS_OFFSET, MNT_NOHLPS | MNT_NOMTAB }, /* loop device offset */
+ { "sizelimit=", MNT_MS_SIZELIMIT, MNT_NOHLPS | MNT_NOMTAB }, /* loop device size limit */
+ { "encryption=", MNT_MS_ENCRYPTION, MNT_NOHLPS | MNT_NOMTAB }, /* loop device encryption */
{ "nofail", MNT_MS_NOFAIL, MNT_NOMTAB }, /* Do not fail if ENOENT on dev */
{ "uhelper=", MNT_MS_UHELPER }, /* /sbin/umount.<helper> */
- { "helper=", MNT_MS_HELPER }, /* /sbin/umount.<helper> */
+ { "helper=", MNT_MS_HELPER }, /* /sbin/mount.<helper> */
{ NULL, 0, 0 }
};