From dbcd617882ee5c9da80d9257475f2594352f6698 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Sat, 26 Apr 2014 18:42:31 -0400 Subject: [PATCH] mke2fs: check for pre-existing file system Warn the system administrator if there is an existing file system on the block device, and give the administrator an opportunity to abort the mkfs operation. Signed-off-by: "Theodore Ts'o" --- misc/mke2fs.c | 9 ++++++--- misc/util.c | 29 +++++++++++++++++++++++++++++ misc/util.h | 1 + 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/misc/mke2fs.c b/misc/mke2fs.c index 6b099e1..97b601f 100644 --- a/misc/mke2fs.c +++ b/misc/mke2fs.c @@ -1375,7 +1375,7 @@ out: static void PRS(int argc, char *argv[]) { - int b, c; + int b, c, flags; int cluster_size = 0; char *tmp, **cpp; int blocksize = 0; @@ -1753,8 +1753,11 @@ profile_error: profile_get_integer(profile, "options", "proceed_delay", 0, 0, &proceed_delay); - if (!check_plausibility(device_name, CREATE_FILE, - &is_device) && !force) + /* The isatty() test is so we don't break existing scripts */ + flags = CREATE_FILE; + if (isatty(0) && isatty(1)) + flags |= CHECK_FS_EXIST; + if (!check_plausibility(device_name, flags, &is_device) && !force) proceed_question(proceed_delay); check_mount(device_name, force, _("filesystem")); diff --git a/misc/util.c b/misc/util.c index afb0058..be16ebe 100644 --- a/misc/util.c +++ b/misc/util.c @@ -113,6 +113,9 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev) int fd, is_dev = 0; ext2fs_struct_stat s; int fl = O_RDONLY; + blkid_cache cache = NULL; + char *fs_type = NULL; + char *fs_label = NULL; if (flags & CREATE_FILE) fl |= O_CREAT; @@ -148,6 +151,32 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev) return 0; } + if ((flags & CHECK_FS_EXIST) && blkid_get_cache(&cache, NULL) >= 0) { + fs_type = blkid_get_tag_value(cache, "TYPE", device); + if (fs_type) + fs_label = blkid_get_tag_value(cache, "LABEL", device); + blkid_put_cache(cache); + } + + if (fs_type) { + if (fs_label) + printf(_("%s contains a %s file system " + "labelled '%s'\n"), device, fs_type, fs_label); + else + printf(_("%s contains a %s file system\n"), device, + fs_type); + free(fs_type); + free(fs_label); + return 0; + } + + /* + * We should eventually replace this with a test for the + * presence of a partition table. Unfortunately the blkid + * library doesn't test for partition tabels, and checking for + * valid GPT and MBR and possibly others isn't quite trivial. + */ + #ifdef HAVE_LINUX_MAJOR_H #ifndef MAJOR #define MAJOR(dev) ((dev)>>8) diff --git a/misc/util.h b/misc/util.h index 9de3fbf..745568e 100644 --- a/misc/util.h +++ b/misc/util.h @@ -20,6 +20,7 @@ extern char *journal_location_string; */ #define CHECK_BLOCK_DEV 0x0001 #define CREATE_FILE 0x0002 +#define CHECK_FS_EXIST 0x0004 #ifndef HAVE_STRCASECMP extern int strcasecmp (char *s1, char *s2); -- 1.8.3.1