check if partition is mounted before mkfs
authorGoldwyn Rodrigues <rgoldwyn@gmail.com>
Tue, 1 Apr 2008 14:36:46 +0000 (10:36 -0400)
committerDavid Woodhouse <dwmw2@hera.kernel.org>
Tue, 1 Apr 2008 14:36:46 +0000 (10:36 -0400)
This saves from the blunder of formatting a live mounted filesystem.
This can be extended to get the mount flags of the filesystem
mounted.

Signed-off-by: Goldwyn Rodrigues <rgoldwyn@gmail.com>
mkfs.c
utils.c
utils.h

diff --git a/mkfs.c b/mkfs.c
index 49f7308..8d7530f 100644 (file)
--- a/mkfs.c
+++ b/mkfs.c
@@ -197,6 +197,15 @@ int main(int ac, char **av)
                print_usage();
 
        file = av[optind++];
+       ret = check_mounted(file);
+       if (ret < 0) {
+               fprintf(stderr, "error checking %s mount status\n", file);
+               exit(1);
+       }
+       if (ret == 1) {
+               fprintf(stderr, "%s is mounted\n", file);
+               exit(1);
+       }
        ac--;
        fd = open(file, O_RDWR);
        if (fd < 0) {
@@ -241,6 +250,16 @@ int main(int ac, char **av)
        zero_end = 1;
        while(ac-- > 0) {
                file = av[optind++];
+               ret = check_mounted(file);
+               if (ret < 0) {
+                       fprintf(stderr, "error checking %s mount status\n",
+                               file);
+                       exit(1);
+               }
+               if (ret == 1) {
+                       fprintf(stderr, "%s is mounted\n", file);
+                       exit(1);
+               }
                fd = open(file, O_RDWR);
                if (fd < 0) {
                        fprintf(stderr, "unable to open %s\n", file);
diff --git a/utils.c b/utils.c
index 0a067e6..f3b8fc9 100644 (file)
--- a/utils.c
+++ b/utils.c
@@ -30,6 +30,7 @@
 #include <dirent.h>
 #include <fcntl.h>
 #include <unistd.h>
+#include <mntent.h>
 #include "kerncompat.h"
 #include "radix-tree.h"
 #include "ctree.h"
@@ -525,6 +526,58 @@ error:
        return ret;
 }
 
+/*
+ * returns 1 if the device was mounted, < 0 on error or 0 if everything
+ * is safe to continue.  TODO, this should also scan multi-device filesystems
+ */
+int check_mounted(char *file)
+{
+       struct mntent *mnt;
+       struct stat st_buf;
+       dev_t file_dev = 0;
+       dev_t file_rdev = 0;
+       ino_t file_ino = 0;
+       FILE *f;
+       int ret = 0;
+
+       if ((f = setmntent ("/proc/mounts", "r")) == NULL)
+               return -errno;
+
+       if (stat(file, &st_buf) < 0) {
+               return -errno;
+       } else {
+               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;
+               }
+       }
+
+       while ((mnt = getmntent (f)) != NULL) {
+               if (strcmp(file, 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;
+                       }
+               }
+       }
+
+       if (mnt) {
+               /* found an entry in mnt table */
+               ret = 1;
+       }
+
+       endmntent (f);
+       return ret;
+}
+
 struct pending_dir {
        struct list_head list;
        char name[256];
diff --git a/utils.h b/utils.h
index eacfaac..997d134 100644 (file)
--- a/utils.h
+++ b/utils.h
@@ -35,4 +35,5 @@ int btrfs_scan_for_fsid(struct btrfs_fs_devices *fs_devices, u64 total_devs,
                        int run_ioctls);
 int btrfs_register_one_device(char *fname);
 int btrfs_scan_one_dir(char *dirname, int run_ioctl);
+int check_mounted(char *devicename);
 #endif