Hi, On Sat, 11 Sep 2010 15:40:12 -0400, Matteo Frigo wrote: > To check whether a file system is mounted, nilfs-tune was comparing > the device name to the contents of /etc/mtab. This check does not > detect a mounted file system when the device has multiple names, which > is a common case when using LVM. (LVM creates symbolic links from > /dev/mapper/vg-lv to /dev/dm-X.) > > This patch, borrowed from the analogous check in e2fsprogs, compares > the device number (field st_rdev of struct stat) rather than the > device name. > > Signed-off-by: Matteo Frigo <ath...@fftw.org>
The patch looks sane except for the checkpatch warnings below: > WARNING: line over 80 characters > #526: FILE: nilfs-tune.c:526: > + fprintf(stderr, "ERROR: %s is currently mounted. Aborting > execution.\n" > > WARNING: line over 80 characters > #529: FILE: nilfs-tune.c:529: > + "You can use the \"-f\" option to force this operation.\n", > > total: 0 errors, 2 warnings, 535 lines checked I will adopt your patch with minor amendment. Thank you. Ryusuke Konishi > --- > configure.ac | 3 +- > sbin/nilfs-tune/nilfs-tune.c | 69 +++++++++++++++++++++++++++++++---------- > 2 files changed, 54 insertions(+), 18 deletions(-) > > diff --git a/configure.ac b/configure.ac > index af75142..963e2fd 100644 > --- a/configure.ac > +++ b/configure.ac > @@ -37,7 +37,8 @@ AC_HEADER_STDC > AC_HEADER_SYS_WAIT > AC_CHECK_HEADERS([fcntl.h libintl.h limits.h locale.h mntent.h paths.h \ > stdlib.h string.h strings.h sys/ioctl.h sys/mount.h \ > - sys/time.h syslog.h unistd.h linux/types.h grp.h pwd.h]) > + sys/time.h syslog.h unistd.h linux/types.h grp.h pwd.h \ > + mntent.h]) > > # Checks for typedefs, structures, and compiler characteristics. > AC_C_CONST > diff --git a/sbin/nilfs-tune/nilfs-tune.c b/sbin/nilfs-tune/nilfs-tune.c > index 18513f2..5b7f030 100644 > --- a/sbin/nilfs-tune/nilfs-tune.c > +++ b/sbin/nilfs-tune/nilfs-tune.c > @@ -58,6 +58,11 @@ > #include <pwd.h> > #endif /* HAVE_PWD_H */ > > +#ifdef HAVE_MNTENT_H > +#include <mntent.h> > +#endif > + > +#include <sys/stat.h> > #include <ctype.h> > > #include <errno.h> > @@ -444,26 +449,57 @@ int modify_nilfs(char *device, struct > nilfs_tune_options *opts) > return ret; > } > > -/* Code borrowed from nilfs2-util/sbin/mkfs/mkfs.c */ > +/* check_mount() checks whether DEVICE is a mounted file system. > + Returns 0 if the DEVICE is *not* mounted (which we consider a > + successful outcome), and -1 if DEVICE is mounted or if the mount > + status cannot be determined. > + > + Derived from e2fsprogs/lib/ext2fs/ismounted.c > + Copyright (C) 1995,1996,1997,1998,1999,2000 Theodore Ts'o, > + LGPL v2 > +*/ > static int check_mount(const char *device) > { > - FILE *fp; > - char line[LINE_BUFFER_SIZE]; > - > - fp = fopen(MOUNTS, "r"); > - if (fp == NULL) { > + struct mntent *mnt; > + struct stat st_buf; > + FILE *f; > + dev_t file_dev = 0, file_rdev = 0; > + ino_t file_ino = 0; > + > + f = setmntent(MOUNTS, "r"); > + if (f == NULL) { > fprintf(stderr, "Error: cannot open %s!", MOUNTS); > - return 1; > + return -1; > } > > - while (fgets(line, LINE_BUFFER_SIZE, fp) != NULL) { > - if (strncmp(strtok(line, " "), device, strlen(device)) == 0) { > - fclose(fp); > - return 1; > + if (stat(device, &st_buf) == 0) { > + if (S_ISBLK(st_buf.st_mode)) { > + file_rdev = st_buf.st_rdev; > + } else { > + file_dev = st_buf.st_dev; > + file_ino = st_buf.st_ino; > } > } > - fclose(fp); > - return 0; > + > + while ((mnt = getmntent(f)) != NULL) { > + if (mnt->mnt_fsname[0] != '/') > + continue; > + if (strcmp(device, mnt->mnt_fsname) == 0) > + break; > + if (stat(mnt->mnt_fsname, &st_buf) == 0) { > + if (S_ISBLK(st_buf.st_mode)) { > + if (file_rdev && (file_rdev == st_buf.st_rdev)) > + break; > + } else { > + if (file_dev && ((file_dev == st_buf.st_dev) && > + (file_ino == st_buf.st_ino))) > + break; > + } > + } > + } > + > + endmntent(f); > + return (mnt == NULL) ? 0 : -1; > } > > int main(int argc, char *argv[]) > @@ -486,12 +522,11 @@ int main(int argc, char *argv[]) > exit(EXIT_FAILURE); > } > > - if (!opts.force && opts.flags == O_RDWR && check_mount(device)) { > - fprintf(stderr, "Warning: %s is currently mounted.\n" > + if (!opts.force && opts.flags == O_RDWR && (check_mount(device) < 0)) { > + fprintf(stderr, "ERROR: %s is currently mounted. Aborting > execution.\n" > "Running nilfs-tune on a mounted file system " > "may cause SEVERE damage.\n" > - "You can force to modify file system by " > - "\"-f\" option.\n", > + "You can use the \"-f\" option to force this > operation.\n", > device); > exit(EXIT_SUCCESS); > } > -- > 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html