]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
libmount: allow to disable swap between source and target
authorKarel Zak <kzak@redhat.com>
Tue, 17 Jul 2012 19:57:22 +0000 (21:57 +0200)
committerKarel Zak <kzak@redhat.com>
Tue, 17 Jul 2012 19:57:22 +0000 (21:57 +0200)
In some cases (for example if only one mount argument is given) may be
mount request ambivalent:

# mount /foo

and fstab:

/dev/sda5 /foo rw 0 0
/foo /bar bind 0 0

The libmount allows to swap between source and target (if
source is not LABEL or UUID) by default. The new function

mnt_context_disable_swapmatch()

allows to disable this feature.

Signed-off-by: Karel Zak <kzak@redhat.com>
libmount/docs/libmount-sections.txt
libmount/src/context.c
libmount/src/context_umount.c
libmount/src/libmount.h.in
libmount/src/libmount.sym
libmount/src/mountP.h

index e9a6dce7201bfbeae521ec9f48a995582b70d8be..dc6aeabf5d97eef83c8e80373f2ff5f99fcb6a89 100644 (file)
@@ -24,6 +24,7 @@ mnt_context_apply_fstab
 mnt_context_disable_canonicalize
 mnt_context_disable_helpers
 mnt_context_disable_mtab
+mnt_context_disable_swapmatch
 mnt_context_enable_fake
 mnt_context_enable_force
 mnt_context_enable_fork
@@ -32,7 +33,6 @@ mnt_context_enable_loopdel
 mnt_context_enable_rdonly_umount
 mnt_context_enable_sloppy
 mnt_context_enable_verbose
-mnt_context_tab_applied
 mnt_context_get_cache
 mnt_context_get_fs
 mnt_context_get_fstab
@@ -66,6 +66,7 @@ mnt_context_is_parent
 mnt_context_is_rdonly_umount
 mnt_context_is_restricted
 mnt_context_is_sloppy
+mnt_context_is_swapmatch
 mnt_context_is_verbose
 mnt_context_reset_status
 mnt_context_set_cache
@@ -86,6 +87,7 @@ mnt_context_set_target
 mnt_context_set_user_mflags
 mnt_context_strerror
 mnt_context_syscall_called
+mnt_context_tab_applied
 mnt_context_wait_for_children
 </SECTION>
 
index e0b6a35f4a2e03404c32dbda54c970605d149697..bfc418cd8d788ef2a6088c7867c7ba6a14c2b462 100644 (file)
@@ -502,7 +502,7 @@ int mnt_context_disable_mtab(struct libmnt_context *cxt, int disable)
 }
 
 /**
- * mnt_context_is_nomtab
+ * mnt_context_is_nomtab:
  * @cxt: mount context
  *
  * Returns: 1 if no-mtab is enabled or 0
@@ -512,6 +512,32 @@ int mnt_context_is_nomtab(struct libmnt_context *cxt)
        return cxt && (cxt->flags & MNT_FL_NOMTAB) ? 1 : 0;
 }
 
+/**
+ * mnt_context_disable_swapmatch:
+ * @cxt: mount context
+ * @disable: TRUE or FALSE
+ *
+ * Disable/enable swap between source and target for mount(8) if only one path
+ * is specified.
+ *
+ * Returns: 0 on success, negative number in case of error.
+ */
+int mnt_context_disable_swapmatch(struct libmnt_context *cxt, int disable)
+{
+       return set_flag(cxt, MNT_FL_NOSWAPMATCH, disable);
+}
+
+/**
+ * mnt_context_is_swapmatch:
+ * @cxt: mount context
+ *
+ * Returns: 1 if swap between source and target is allowed (default is 1) or 0.
+ */
+int mnt_context_is_swapmatch(struct libmnt_context *cxt)
+{
+       return cxt && (cxt->flags & MNT_FL_NOSWAPMATCH) ? 0 : 1;
+}
+
 /**
  * mnt_context_enable_force:
  * @cxt: mount context
@@ -1617,7 +1643,7 @@ static int apply_table(struct libmnt_context *cxt, struct libmnt_table *tb,
                else if (tgt)
                        fs = mnt_table_find_target(tb, tgt, direction);
 
-               if (!fs) {
+               if (!fs && mnt_context_is_swapmatch(cxt)) {
                        /* swap source and target (if @src is not LABEL/UUID),
                         * for example in
                         *
index 39d940f6c2fbc8dce9a69a3c4067ab764693f2ce..2c2975e7ead53222790449cbf1fc7f440bfa7a1f 100644 (file)
@@ -64,7 +64,7 @@ static int lookup_umount_fs(struct libmnt_context *cxt)
 
 try_loopdev:
        fs = mnt_table_find_target(mtab, tgt, MNT_ITER_BACKWARD);
-       if (!fs) {
+       if (!fs && mnt_context_is_swapmatch(cxt)) {
                /* maybe the option is source rather than target (mountpoint) */
                fs = mnt_table_find_source(mtab, tgt, MNT_ITER_BACKWARD);
 
index 2c66871b7425ad100c3b4124d76c4f8a91e38ea8..326588feccf82c4989ec1c5e11eae31cd559713f 100644 (file)
@@ -428,6 +428,7 @@ extern int mnt_context_enable_force(struct libmnt_context *cxt, int enable);
 extern int mnt_context_enable_verbose(struct libmnt_context *cxt, int enable);
 extern int mnt_context_enable_loopdel(struct libmnt_context *cxt, int enable);
 extern int mnt_context_enable_fork(struct libmnt_context *cxt, int enable);
+extern int mnt_context_disable_swapmatch(struct libmnt_context *cxt, int disable);
 
 extern int mnt_context_get_optsmode(struct libmnt_context *cxt);
 extern int mnt_context_is_lazy(struct libmnt_context *cxt);
@@ -440,6 +441,7 @@ extern int mnt_context_is_verbose(struct libmnt_context *cxt);
 extern int mnt_context_is_loopdel(struct libmnt_context *cxt);
 extern int mnt_context_is_nohelpers(struct libmnt_context *cxt);
 extern int mnt_context_is_nocanonicalize(struct libmnt_context *cxt);
+extern int mnt_context_is_swapmatch(struct libmnt_context *cxt);
 
 extern int mnt_context_is_fork(struct libmnt_context *cxt);
 extern int mnt_context_is_parent(struct libmnt_context *cxt);
index 39f81d665b5b1b85c3178aec3129f46193f58f47..260642d4d7043739f24ef6d0c137aa11e7855a4f 100644 (file)
@@ -244,4 +244,6 @@ global:
        mnt_fs_get_swaptype;
        mnt_fs_get_tid;
        mnt_fs_get_usedsize;
+       mnt_context_is_swapmatch;
+       mnt_context_disable_swapmatch;
 } MOUNT_2.21;
index a2922c2b3edce97b1d348dd2b51432c720f25794..0ef073a69ac46d617bd0d6af98762f61c3fd7227 100644 (file)
@@ -335,6 +335,7 @@ struct libmnt_context
 #define MNT_FL_NOCANONICALIZE  (1 << 9)
 #define MNT_FL_RDONLY_UMOUNT   (1 << 11)       /* remount,ro after EBUSY umount(2) */
 #define MNT_FL_FORK            (1 << 12)
+#define MNT_FL_NOSWAPMATCH     (1 << 13)
 
 #define MNT_FL_EXTERN_FS       (1 << 15)       /* cxt->fs is not private */
 #define MNT_FL_EXTERN_FSTAB    (1 << 16)       /* cxt->fstab is not private */