mirror of
https://github.com/kdave/btrfs-progs
synced 2025-02-26 23:10:50 +00:00
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 <rgoldwyn@gmail.com>
This commit is contained in:
parent
ad67cd73b7
commit
c2c5e3e7e5
19
mkfs.c
19
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);
|
||||
|
53
utils.c
53
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];
|
||||
|
Loading…
Reference in New Issue
Block a user