summaryrefslogtreecommitdiffstats
path: root/shlibs/mount
diff options
context:
space:
mode:
authorKarel Zak2010-12-18 01:08:25 +0100
committerKarel Zak2011-01-03 12:28:47 +0100
commit2915bdc0db7b6931c35e235879d59b6c61b4b1bc (patch)
treefe72436518b23336af7a06416749209781706396 /shlibs/mount
parentlibmount: cleanup MS_RDONLY usageand mnt_update_* symbols (diff)
downloadkernel-qcow2-util-linux-2915bdc0db7b6931c35e235879d59b6c61b4b1bc.tar.gz
kernel-qcow2-util-linux-2915bdc0db7b6931c35e235879d59b6c61b4b1bc.tar.xz
kernel-qcow2-util-linux-2915bdc0db7b6931c35e235879d59b6c61b4b1bc.zip
libmount: clean mnt_update_* target usage
Signed-off-by: Karel Zak <kzak@redhat.com>
Diffstat (limited to 'shlibs/mount')
-rw-r--r--shlibs/mount/src/context.c19
-rw-r--r--shlibs/mount/src/tab_update.c24
2 files changed, 26 insertions, 17 deletions
diff --git a/shlibs/mount/src/context.c b/shlibs/mount/src/context.c
index abe0dc9d0..8fbad4a83 100644
--- a/shlibs/mount/src/context.c
+++ b/shlibs/mount/src/context.c
@@ -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;
}
diff --git a/shlibs/mount/src/tab_update.c b/shlibs/mount/src/tab_update.c
index cc0335fb8..5afa0d49d 100644
--- a/shlibs/mount/src/tab_update.c
+++ b/shlibs/mount/src/tab_update.c
@@ -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)