]> err.no Git - util-linux/commitdiff
libmount: clean mnt_update_* target usage
authorKarel Zak <kzak@redhat.com>
Sat, 18 Dec 2010 00:08:25 +0000 (01:08 +0100)
committerKarel Zak <kzak@redhat.com>
Mon, 3 Jan 2011 11:28:47 +0000 (12:28 +0100)
Signed-off-by: Karel Zak <kzak@redhat.com>
shlibs/mount/src/context.c
shlibs/mount/src/tab_update.c

index abe0dc9d012de1fa17cf34c41fbaadc8be667b8e..8fbad4a836cb173da67c42a4c27b525fd67802fc 100644 (file)
@@ -850,8 +850,10 @@ int mnt_context_prepare_srcpath(mnt_context *cxt)
 
        src = mnt_fs_get_source(cxt->fs);
 
-       /* ignore filesystems without a real source */
-       if (!src || (cxt->fs->flags & (MNT_FS_PSEUDO | MNT_FS_NET)))
+       /* ignore filesystems without a real source or MS_PROPAGATION stuff */
+       if (!src ||
+           (cxt->fs->flags & (MNT_FS_PSEUDO | MNT_FS_NET)) ||
+           (cxt->mountflags & (MS_BIND | MS_MOVE | MS_PROPAGATION)))
                return 0;
 
        DBG(CXT, mnt_debug_h(cxt, "srcpath '%s'", src));
@@ -893,9 +895,7 @@ int mnt_context_prepare_srcpath(mnt_context *cxt)
        /*
         * Initialize loop device
         */
-       if (is_loop(cxt) &&
-           !(cxt->mountflags & (MS_BIND | MS_MOVE |
-                                MS_PROPAGATION | MS_REMOUNT))) {
+       if (is_loop(cxt)) {
                ; /* TODO */
        }
 
@@ -1102,9 +1102,12 @@ int mnt_context_prepare_update(mnt_context *cxt)
                                !cxt->mtab_writable);
        }
 
-       rc = mnt_update_set_fs(cxt->update, cxt->mountflags,
-                         mnt_fs_get_target(cxt->fs),
-                         cxt->action == MNT_ACT_UMOUNT ? NULL : cxt->fs);
+       if (cxt->action == MNT_ACT_UMOUNT)
+               rc = mnt_update_set_fs(cxt->update, cxt->mountflags,
+                                       mnt_fs_get_target(cxt->fs), NULL);
+       else
+               rc = mnt_update_set_fs(cxt->update, cxt->mountflags,
+                                       NULL, cxt->fs);
 
        return rc < 0 ? rc : 0;
 }
index cc0335fb8316c539ac1fcb8e4302eda5558ed1cb..5afa0d49df26ecfa39fe2baabddb7d58e0115a82 100644 (file)
@@ -146,8 +146,8 @@ int mnt_update_is_ready(mnt_update *upd)
  * mnt_update_set_fs:
  * @upd: update handler
  * @mountflags: MS_* flags
- * @target: umount target or MS_MOVE source
- * @fs: mount or MS_REMOUNT filesystem description, or MS_MOVE target
+ * @target: umount target, must be num for mount
+ * @fs: mount filesystem description, must be NULL for umount
  *
  * Returns: -1 in case on error, 0 on success, 1 if update is unnecessary.
  */
@@ -161,6 +161,10 @@ int mnt_update_set_fs(mnt_update *upd, unsigned long mountflags,
 
        if (!upd)
                return -EINVAL;
+       if ((mountflags & MS_MOVE) && (!fs || !mnt_fs_get_srcpath(fs)))
+               return -EINVAL;
+       if (target && fs)
+               return -EINVAL;
 
        DBG(UPDATE, mnt_debug_h(upd,
                        "reseting FS [fs=0x%p, target=%s, flags=0x%08lx]",
@@ -180,13 +184,19 @@ int mnt_update_set_fs(mnt_update *upd, unsigned long mountflags,
        if (mountflags & MS_PROPAGATION)
                return 1;
 
+
        upd->mountflags = mountflags;
 
        rc = mnt_update_set_filename(upd, NULL, 0);
        if (rc)
                return rc;      /* error or no file available (rc = 1) */
 
-       if (fs) {
+       if (target) {
+               upd->target = strdup(target);
+               if (!upd->target)
+                       return -ENOMEM;
+
+       } else if (fs) {
                if (upd->userspace_only && !(mountflags & MS_MOVE)) {
                        int rc = utab_new_entry(fs, mountflags, &upd->fs);
                        if (rc)
@@ -198,11 +208,6 @@ int mnt_update_set_fs(mnt_update *upd, unsigned long mountflags,
                }
        }
 
-       if (target) {
-               upd->target = strdup(target);
-               if (!upd->target)
-                       return -ENOMEM;
-       }
 
        DBG(UPDATE, mnt_debug_h(upd, "ready"));
        upd->ready = TRUE;
@@ -675,7 +680,8 @@ static int update_modify_target(mnt_update *upd, mnt_lock *lc)
        tb = __mnt_new_tab_from_file(upd->filename,
                        upd->userspace_only ? MNT_FMT_UTAB : MNT_FMT_MTAB);
        if (tb) {
-               mnt_fs *cur = mnt_tab_find_target(tb, upd->target, MNT_ITER_BACKWARD);
+               mnt_fs *cur = mnt_tab_find_target(tb,
+                               mnt_fs_get_srcpath(upd->fs), MNT_ITER_BACKWARD);
                if (cur) {
                        rc = mnt_fs_set_target(cur, mnt_fs_get_target(upd->fs));
                        if (!rc)