summaryrefslogtreecommitdiffstats
path: root/sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch')
-rw-r--r--sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch33
1 files changed, 33 insertions, 0 deletions
diff --git a/sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch b/sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch
new file mode 100644
index 0000000..aa921f5
--- /dev/null
+++ b/sys-apps/util-linux/files/util-linux-2.12q-update-mtab-when-moving.patch
@@ -0,0 +1,33 @@
+Running `mount --move /foo /bar` would leave the old /foo entry in /etc/mtab
+and create a new /bar entry with wrong info.
+
+http://bugs.gentoo.org/104697
+
+--- 1/mount/mount.c
++++ 2/mount/mount.c
+@@ -665,6 +665,25 @@
+ else {
+ mntFILE *mfp;
+
++ /* when moving a mount point, we have to make sure the mtab
++ * gets updated properly. We get info about the old mount
++ * point, copy it to the new mount point, and then delete
++ * the old mount point. */
++ if (flags & MS_MOVE) {
++ const char *olddir = mnt.mnt_fsname;
++ struct mntentchn *oldmc = oldmc = getmntfile(olddir);
++ if (oldmc != NULL) {
++ mnt.mnt_fsname = xstrdup(oldmc->m.mnt_fsname);
++ mnt.mnt_type = oldmc->m.mnt_type;
++ mnt.mnt_opts = oldmc->m.mnt_opts;
++ mnt.mnt_freq = oldmc->m.mnt_freq;
++ mnt.mnt_passno = oldmc->m.mnt_passno;
++ }
++ update_mtab(olddir, NULL);
++ if (oldmc != NULL)
++ my_free(olddir);
++ }
++
+ lock_mtab();
+ mfp = my_setmntent(MOUNTED, "a+");
+ if (mfp == NULL || mfp->mntent_fp == NULL) {