During a remount of a cifs filesystem, the mtab file is not properly updated, which leads to a doubled entry of the same filesystem in the /etc/mtab file. This patch adds a new function del_mtab() which is called before the add_mtab() in case the fs is being remounted. The del_mtab() function will delete from the mtab, the old entry from the filesystem which is being remounted, and then, calls add_mtab() to add an updated entry to the mtab file. Signed-off-by: Carlos Maiolino <cmaiolino@xxxxxxxxxx> --- mount.cifs.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 81 insertions(+), 0 deletions(-) diff --git a/mount.cifs.c b/mount.cifs.c index 147f7fc..6535b40 100644 --- a/mount.cifs.c +++ b/mount.cifs.c @@ -161,6 +161,7 @@ #define OPT_BKUPUID 30 #define OPT_BKUPGID 31 +#define MNT_TMP_PATH "/tmp/mtab.tmp" /* struct for holding parsed mount info for use by privleged process */ struct parsed_mount_info { @@ -1624,6 +1625,81 @@ add_mtab_exit: return rc; } +static int +del_mtab(char *devname, char *mountpoint) +{ + int fd, tmprc, rc = 0; + FILE *mnttmp, *mntmtab; + struct mntent *mountent; + struct stat statbuf; + + rc = lock_mtab(); + if(rc) { + fprintf(stderr, "del_mtab: cannot lock mtab"); + rc = EX_FILEIO; + goto del_mtab_exit; + } + + mntmtab = setmntent(MOUNTED, "r"); + if (!mntmtab) { + fprintf(stderr, "del_mtab: could not update mount table\n"); + rc = EX_FILEIO; + goto del_mtab_exit; + } + + mnttmp = setmntent(MNT_TMP_PATH, "w"); + if (!mnttmp) { + fprintf(stderr, "del_mtab: could not update mount table\n"); + endmntent(mntmtab); + rc = EX_FILEIO; + goto del_mtab_exit; + } + + fd = fileno(mntmtab); + if (fd < 0) { + fprintf(stderr, "mntent does not appear to be valid\n"); + endmntent(mntmtab); + endmntent(mnttmp); + rc = EX_FILEIO; + goto del_mtab_exit; + } + + while((mountent = getmntent(mntmtab)) != NULL){ + if(!strcmp(mountent->mnt_dir,mountpoint)) + continue; + rc = addmntent(mnttmp, mountent); + if (rc) { + fprintf(stderr, "unable to add mount entry to mtab\n"); + ftruncate(fd, statbuf.st_size); + rc = EX_FILEIO; + break; + } + } + + rc = fstat(fd, &statbuf); + if (rc != 0) { + fprintf(stderr, "unable to fstat open mtab\n"); + endmntent(mntmtab); + endmntent(mnttmp); + rc = EX_FILEIO; + goto del_mtab_exit; + } + + tmprc = my_endmntent(mntmtab, statbuf.st_size); + if (tmprc) { + fprintf(stderr, "error %d detected on close of mtab\n", tmprc); + rc = EX_FILEIO; + } + endmntent(mnttmp); + + rename(MNT_TMP_PATH, MOUNTED); + unlink(MNT_TMP_PATH); + +del_mtab_exit: + unlock_mtab(); + return rc; +} + /* have the child drop root privileges */ static int drop_child_privs(void) @@ -2021,6 +2097,11 @@ mount_retry: } do_mtab: + if(parsed_info->flags & MS_REMOUNT){ + rc = del_mtab(orig_dev, mountpoint); + if(rc) + goto mount_exit; + } if (!parsed_info->nomtab && !mtab_unusable()) rc = add_mtab(orig_dev, mountpoint, parsed_info->flags, fstype); -- 1.7.6.4 -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html