]> err.no Git - util-linux/commitdiff
libmount: split mnt_context_do_mount()
authorKarel Zak <kzak@redhat.com>
Wed, 19 Jan 2011 21:11:55 +0000 (22:11 +0100)
committerKarel Zak <kzak@redhat.com>
Fri, 21 Jan 2011 23:27:26 +0000 (00:27 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/samples/mount.c
shlibs/mount/src/context.c
shlibs/mount/src/context_mount.c
shlibs/mount/src/mount.h.in
shlibs/mount/src/mount.sym
shlibs/mount/src/mountP.h

index 1d032a6217fbabe1cead9c6077e42faa176df72e..eca02d62e9d1a7339caa915af98b14ca92967bd3 100644 (file)
@@ -408,7 +408,7 @@ int main(int argc, char **argv)
        if (lock)
                atexit(lock_atexit_cleanup);
 
-       rc = mnt_context_do_mount(cxt);
+       rc = mnt_mount_context(cxt);
        if (rc) {
                /* TODO: call mnt_context_strerror() */
                rc = EX_FAIL;
index d71cbb63cda93c8bf3620b15ece5fae33fdae0e3..aad0b3930fd5057fd550b2bf0a7cc5c7371b94ed 100644 (file)
@@ -1500,7 +1500,7 @@ int test_mount(struct mtest *ts, int argc, char *argv[])
        if (lock)
                atexit(lock_fallback);
 
-       rc = mnt_context_do_mount(cxt);
+       rc = mnt_mount_context(cxt);
        if (rc)
                printf("failed to mount %s\n", strerror(errno));
        else
index 1180d8eb0b8da66f613ac6b066a3aeb89e14be8a..55cf48bf81dcb66e73c1602cc50e043af98d0b6c 100644 (file)
@@ -343,7 +343,9 @@ static int do_mount(mnt_context *cxt, const char *try_type)
                        src, target, type,
                        flags, cxt->mountdata ? "yes" : "<none>"));
 
-       if (!(cxt->flags & MNT_FL_FAKE)) {
+       if (cxt->flags & MNT_FL_FAKE)
+               cxt->syscall_status = 0;
+       else {
                if (mount(src, target, type, flags, cxt->mountdata)) {
                        cxt->syscall_status = -errno;
                        DBG(CXT, mnt_debug_h(cxt, "mount(2) failed [errno=%d %m]",
@@ -420,21 +422,16 @@ static int do_mount_by_pattern(mnt_context *cxt, const char *pattern)
 }
 
 /**
- * mnt_context_do_mount:
- * @cxt: mount context
+ * mnt_context_prepare_mount:
+ * @cxt: context
  *
- * Mount filesystem by mount(2) or fork()+exec(/sbin/mount.type).
- *
- * See also mnt_context_disable_helpers().
+ * Prepare context for mounting, unnecessary for mnt_context_mount().
  *
- * Returns: 0 on success, and negative number in case of error. WARNING: error
- *          does not mean that mount(2) syscall or mount.type helper wasn't
- *          sucessfully called. Check mnt_context_get_status() after error!
+ * Returns: negative number on error, zero on success
  */
-int mnt_context_do_mount(mnt_context *cxt)
+int mnt_context_prepare_mount(mnt_context *cxt)
 {
-       int rc = -EINVAL, x;
-       const char *type;
+       int rc = -EINVAL;
 
        assert(cxt);
        assert(cxt->fs);
@@ -446,6 +443,9 @@ int mnt_context_do_mount(mnt_context *cxt)
        if (!mnt_fs_get_source(cxt->fs) && !mnt_fs_get_target(cxt->fs))
                return -EINVAL;
 
+       if (cxt->flags & MNT_FL_PREPARED)
+               return 0;
+
        cxt->action = MNT_ACT_MOUNT;
 
        DBG(CXT, mnt_debug_h(cxt, "mount: preparing"));
@@ -466,13 +466,32 @@ int mnt_context_do_mount(mnt_context *cxt)
                rc = mnt_context_guess_fstype(cxt);
        if (!rc)
                rc = mnt_context_prepare_helper(cxt, "mount", NULL);
-       if (!rc)
-               rc = mnt_context_prepare_update(cxt);
-
        if (rc) {
                DBG(CXT, mnt_debug_h(cxt, "mount: preparing failed"));
                return rc;
        }
+       cxt->flags |= MNT_FL_PREPARED;
+       return rc;
+}
+
+/**
+ * mnt_context_do_mount
+ * @cxt: context
+ *
+ * Call mount(2) or mount.<type> helper. Unnecessary for mnt_context_mount().
+ *
+ * Returns: negative number on error, zero on success
+ */
+int mnt_context_do_mount(mnt_context *cxt)
+{
+       const char *type;
+
+       assert(cxt);
+       assert(cxt->fs);
+       assert(cxt->helper_exec_status == 1);
+       assert(cxt->syscall_status == 1);
+       assert((cxt->flags & MNT_FL_MOUNTFLAGS_MERGED));
+       assert((cxt->flags & MNT_FL_PREPARED));
 
        DBG(CXT, mnt_debug_h(cxt, "mount: do mount"));
 
@@ -481,15 +500,73 @@ int mnt_context_do_mount(mnt_context *cxt)
 
        type = mnt_fs_get_fstype(cxt->fs);
        if (type)
-               rc = do_mount(cxt, NULL);
-       else
-               rc = do_mount_by_pattern(cxt, cxt->fstype_pattern);
+               return do_mount(cxt, NULL);
+
+       return do_mount_by_pattern(cxt, cxt->fstype_pattern);
+}
+
+/**
+ * mnt_mount_context:
+ * @cxt: mount context
+ *
+ * Mount filesystem by mount(2) or fork()+exec(/sbin/mount.type).
+ *
+ * This is top-level function for FS mounting, similar to:
+ *
+ *     mnt_context_prepare_mount(cxt);
+ *     mnt_context_do_mount(cxt);
+ *     mnt_context_finalize_mount(cxt);
+ *
+ * See also mnt_context_disable_helpers().
+ *
+ * Returns: 0 on success, and negative number in case of error. WARNING: error
+ *          does not mean that mount(2) syscall or mount.type helper wasn't
+ *          sucessfully called. Check mnt_context_get_status() after error!
+ */
+int mnt_mount_context(mnt_context *cxt)
+{
+       int rc;
+
+       assert(cxt);
+       assert(cxt->fs);
+       assert(cxt->helper_exec_status == 1);
+       assert(cxt->syscall_status == 1);
+
+       rc = mnt_context_prepare_mount(cxt);
+       if (!rc)
+               rc = mnt_context_prepare_update(cxt);
+       if (!rc)
+               rc = mnt_context_do_mount(cxt);
 
        /* TODO: if mtab update is expected then check if the
         * target is really mounted read-write to avoid 'ro' in
         * mtab and 'rw' in /proc/mounts.
         */
-       x = mnt_context_update_tabs(cxt);
-       return rc ? rc : x;
+       if (!rc)
+               rc = mnt_context_update_tabs(cxt);
+       return rc;
+}
+
+/**
+ * mnt_context_finalize_mount:
+ * @cxt: context
+ *
+ * Mtab update, etc. Unnecessary for mnt_context_mount().
+ *
+ * Returns: negative number on error, 0 on success.
+ */
+int mnt_context_finalize_mount(mnt_context *cxt)
+{
+       int rc;
+
+       assert(cxt);
+       assert(cxt->fs);
+       assert((cxt->flags & MNT_FL_MOUNTFLAGS_MERGED));
+       assert((cxt->flags & MNT_FL_PREPARED));
+
+       rc = mnt_context_prepare_update(cxt);
+       if (!rc)
+               rc = mnt_context_update_tabs(cxt);;
+       return rc;
 }
 
index 828bf7083a05be156fc46587e1c27c0fda790f76..84f768477ff634441cf54d442bb04b61516421d2 100644 (file)
@@ -381,7 +381,12 @@ extern int mnt_context_apply_fstab(mnt_context *cxt);
 extern int mnt_context_get_status(mnt_context *cxt);
 extern int mnt_context_strerror(mnt_context *cxt, char *buf, size_t bufsiz);
 
+extern int mnt_mount_context(mnt_context *cxt);
+
+extern int mnt_context_prepare_mount(mnt_context *cxt);
 extern int mnt_context_do_mount(mnt_context *cxt);
+extern int mnt_context_finalize_mount(mnt_context *cxt);
+
 extern int mnt_context_do_umount(mnt_context *cxt);
 
 /*
index 3ad4a021020d35ba8870b970651f83d8ff91002b..e29372ed5927de490c33a835853e304d1c1af82f 100644 (file)
@@ -22,6 +22,7 @@ global:
        mnt_context_enable_rdonly_umount;
        mnt_context_enable_sloppy;
        mnt_context_enable_verbose;
+       mnt_context_finalize_mount;
        mnt_context_get_cache;
        mnt_context_get_fs;
        mnt_context_get_fstab;
@@ -39,6 +40,7 @@ global:
        mnt_context_is_restricted;
        mnt_context_is_sloppy;
        mnt_context_is_verbose;
+       mnt_context_prepare_mount;
        mnt_context_set_cache;
        mnt_context_set_fs;
        mnt_context_set_fstab;
@@ -125,6 +127,7 @@ global:
        mnt_mangle;
        mnt_match_fstype;
        mnt_match_options;
+       mnt_mount_context;
        mnt_new_cache;
        mnt_new_context;
        mnt_new_fs;
index ac46599da59a5dca633495642eecd333065c1d9b..cb7b68cd3386b60aeb677a7a65ec518cb308bd37 100644 (file)
@@ -286,6 +286,7 @@ struct _mnt_context
 #define MNT_FL_TAB_APPLIED     (1 << 21)       /* mtab/fstab merged to cxt->fs */
 #define MNT_FL_MOUNTFLAGS_MERGED (1 << 22)     /* MS_* flags was read from optstr */
 #define MNT_FL_SAVED_USER      (1 << 23)
+#define MNT_FL_PREPARED                (1 << 24)
 
 /* default flags */
 #define MNT_FL_DEFAULT         0