From c2c5e3e7e533b1b03ba68723ef8ab7274d07148a Mon Sep 17 00:00:00 2001 From: Goldwyn Rodrigues Date: Tue, 1 Apr 2008 10:36:46 -0400 Subject: [PATCH] check if partition is mounted before mkfs 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 --- mkfs.c | 19 +++++++++++++++++++ utils.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 1 + 3 files changed, 73 insertions(+) diff --git a/mkfs.c b/mkfs.c index 49f7308..8d7530f 100644 --- 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 --- a/utils.c +++ b/utils.c @@ -30,6 +30,7 @@ #include #include #include +#include #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 --- 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 -- 2.7.4