]> err.no Git - util-linux/commitdiff
libmount: improve status check, minor cleanups
authorKarel Zak <kzak@redhat.com>
Mon, 24 Jan 2011 23:26:47 +0000 (00:26 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 24 Jan 2011 23:26:47 +0000 (00:26 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/context.c
shlibs/mount/src/context_mount.c
shlibs/mount/src/fs.c
shlibs/mount/src/libmount.h.in
shlibs/mount/src/libmount.sym
shlibs/mount/src/utils.c

index bfa0292faeb9a0c9175e9cd76f666417e97382d7..ed9f223aeb7ee3179fcf95a79096624958c14549 100644 (file)
@@ -1292,7 +1292,7 @@ int mnt_context_update_tabs(struct libmnt_context *cxt)
                return 0;
        }
        if (cxt->syscall_status) {
-               DBG(CXT, mnt_debug_h(cxt, "don't update: syscall failed"));
+               DBG(CXT, mnt_debug_h(cxt, "don't update: syscall failed/not called"));
                return 0;
        }
 
@@ -1471,13 +1471,32 @@ int mnt_context_apply_fstab(struct libmnt_context *cxt)
  * mnt_context_get_status:
  * @cxt: mount context
  *
- * Returns: 1 if /sbin/mount.type or mount(2) syscall was successfull or 0.
+ * Returns: 0 if /sbin/mount.type or mount(2) syscall was successfull or -errno.
  */
 int mnt_context_get_status(struct libmnt_context *cxt)
 {
        return cxt && (!cxt->syscall_status || !cxt->helper_exec_status);
 }
 
+/**
+ * mnt_context_set_syscall_status:
+ * @cxt: mount context
+ * @status: mount(2) return code
+ *
+ * This function should be used if [u]mount(2) syscall was NOT called by
+ * libmount (mnt_mount_context() or mnt_context_do_mount()) only.
+ *
+ * Returns: 0 or negative number in case of error.
+ */
+int mnt_context_set_syscall_status(struct libmnt_context *cxt, int status)
+{
+       if (!cxt)
+               return -EINVAL;
+
+       cxt->syscall_status = status;
+       return 0;
+}
+
 /**
  * mnt_context_strerror
  * @cxt: context
@@ -1514,6 +1533,8 @@ int mnt_context_init_helper(struct libmnt_context *cxt, int flags)
 
        if (!rc)
                return set_flag(cxt, MNT_FL_HELPER, 1);
+
+       DBG(CXT, mnt_debug_h(cxt, "initialized for [u]mount.<type> helper"));
        return rc;
 }
 
index 367d13418f9d8560ecf41d0744d4d98b73ae7384..0b6c3d864eae3aeb0ec9f815796245916a5550a3 100644 (file)
@@ -515,7 +515,7 @@ int mnt_context_prepare_mount(struct libmnt_context *cxt)
        if (!rc)
                rc = mnt_context_prepare_srcpath(cxt);
        if (!rc)
-              rc = mnt_context_prepare_target(cxt);
+               rc = mnt_context_prepare_target(cxt);
        if (!rc)
                rc = mnt_context_guess_fstype(cxt);
        if (!rc)
@@ -605,7 +605,8 @@ int mnt_mount_context(struct libmnt_context *cxt)
  * mnt_context_finalize_mount:
  * @cxt: context
  *
- * Mtab update, etc. Unnecessary for mnt_context_mount().
+ * Mtab update, etc. Unnecessary for mnt_context_mount(), but should be called
+ * after mnt_context_do_mount(). See also mnt_context_set_syscall_status().
  *
  * Returns: negative number on error, 0 on success.
  */
index 03fe4bbe51dab90248ca027a84f3fd0c84a82dc9..1477812f601fdda2e5f40c824ed6326d7334729d 100644 (file)
@@ -299,14 +299,16 @@ int __mnt_fs_set_source_ptr(struct libmnt_fs *fs, char *source)
  */
 int mnt_fs_set_source(struct libmnt_fs *fs, const char *source)
 {
-       char *p;
+       char *p = NULL;
        int rc;
 
-       if (!fs && !source)
+       if (!fs)
                return -EINVAL;
-       p = strdup(source);
-       if (!p)
-               return -ENOMEM;
+       if (source) {
+               p = strdup(source);
+               if (!p)
+                       return -ENOMEM;
+       }
 
        rc = __mnt_fs_set_source_ptr(fs, p);
        if (rc)
@@ -381,15 +383,17 @@ const char *mnt_fs_get_target(struct libmnt_fs *fs)
  */
 int mnt_fs_set_target(struct libmnt_fs *fs, const char *target)
 {
-       char *p;
+       char *p = NULL;
 
        assert(fs);
 
-       if (!fs || !target)
+       if (!fs)
                return -EINVAL;
-       p = strdup(target);
-       if (!p)
-               return -ENOMEM;
+       if (target) {
+               p = strdup(target);
+               if (!p)
+                       return -ENOMEM;
+       }
        free(fs->target);
        fs->target = p;
 
@@ -444,7 +448,6 @@ int __mnt_fs_set_fstype_ptr(struct libmnt_fs *fs, char *fstype)
 int mnt_fs_set_fstype(struct libmnt_fs *fs, const char *fstype)
 {
        char *p = NULL;
-       int rc;
 
        if (!fs)
                return -EINVAL;
@@ -453,10 +456,7 @@ int mnt_fs_set_fstype(struct libmnt_fs *fs, const char *fstype)
                if (!p)
                        return -ENOMEM;
        }
-       rc =  __mnt_fs_set_fstype_ptr(fs, p);
-       if (rc)
-               free(p);
-       return rc;
+       return  __mnt_fs_set_fstype_ptr(fs, p);
 }
 
 /*
index 6ac24ca1811c83b01c59411eddf2f6744aac36f8..153b28aec1e1cc67afa8a84c68088eb173f6055b 100644 (file)
@@ -421,6 +421,7 @@ extern int mnt_mount_context(struct libmnt_context *cxt);
 extern int mnt_context_prepare_mount(struct libmnt_context *cxt);
 extern int mnt_context_do_mount(struct libmnt_context *cxt);
 extern int mnt_context_finalize_mount(struct libmnt_context *cxt);
+extern int mnt_context_set_syscall_status(struct libmnt_context *cxt, int status);
 
 extern int mnt_context_do_umount(struct libmnt_context *cxt);
 
index 4709a8a21b3bcd478a57286c6cd8ee83e7d04034..160174ea07e9640c06475654e2c9e068e632052e 100644 (file)
@@ -57,6 +57,7 @@ global:
        mnt_context_set_options_pattern;
        mnt_context_set_optsmode;
        mnt_context_set_source;
+       mnt_context_set_syscall_status;
        mnt_context_set_target;
        mnt_context_set_user_mflags;
        mnt_context_strerror;
index 35d43452e72995493101035632b3b3c5cd63b36f..cb0ed1cace94e3618c18b1be3d190cf1905edddd 100644 (file)
@@ -112,7 +112,7 @@ int mnt_fstype_is_pseudofs(const char *type)
            strcmp(type, "tmpfs") == 0 ||
            strcmp(type, "sysfs") == 0 ||
            strcmp(type, "devpts") == 0||
-           strcmp(type, "cgroups") == 0 ||
+           strcmp(type, "cgroup") == 0 ||
            strcmp(type, "devfs") == 0 ||
            strcmp(type, "dlmfs") == 0 ||
            strcmp(type, "cpuset") == 0 ||