Handle -o remount better
authorNeil Brown <neilb@suse.de>
Tue, 20 Mar 2007 00:13:42 +0000 (11:13 +1100)
committerNeil Brown <neilb@suse.de>
Tue, 20 Mar 2007 00:13:42 +0000 (11:13 +1100)
On -o remount, we need to update the entry in mtab rather than
add a new one.  update_mtab does this so use that.
However it might free some strings that shouldn't be freed, so
stop it from calling free - the program will exit soon anyway
so no exit is needed.

support/nfs/fstab.c
utils/mount/mount.c

index ba72a53..aee8e53 100644 (file)
@@ -101,6 +101,7 @@ fstab_head()
        return &fstab;
 }
 
+#if 0
 static void
 my_free(const void *s) {
        if (s)
@@ -120,6 +121,7 @@ discard_mntentchn(struct mntentchn *mc0) {
                free(mc);
        }
 }
+#endif
 
 static void
 read_mntentchn(mntFILE *mfp, const char *fnam, struct mntentchn *mc0) {
@@ -444,7 +446,8 @@ lock_mtab (void) {
  */
 
 void
-update_mtab (const char *dir, struct mntent *instead) {
+update_mtab (const char *dir, struct mntent *instead)
+{
        mntFILE *mfp, *mftmp;
        const char *fnam = MOUNTED;
        struct mntentchn mtabhead;      /* dummy */
@@ -513,8 +516,14 @@ update_mtab (const char *dir, struct mntent *instead) {
                }
        }
 
+#if 0
+       /* the chain might have strings copied from 'instead',
+        * so we cannot safely free it.
+        * And there is no need anyway because we are going to exit
+        * shortly.  So just don't call discard_mntentchn....
+        */
        discard_mntentchn(mc0);
-
+#endif
        if (fchmod (fileno (mftmp->mntent_fp),
                    S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH) < 0) {
                int errsv = errno;
index 55d60aa..4da9002 100644 (file)
@@ -179,6 +179,11 @@ int add_mtab(char *fsname, char *mount_point, char *fstype, int flags, char *opt
        ment.mnt_freq = 0;
        ment.mnt_passno= 0;
 
+       if(flags & MS_REMOUNT) {
+               update_mtab(ment.mnt_dir, &ment);
+               return 0;
+       }
+
        lock_mtab();
 
         if ((mtab = setmntent(MOUNTED, "a+")) == NULL) {