Mkfs.f2fs doesn't check the overwrite of exist filesystem.
Avoid formatting an exist filesystem by mistake, a notice is important.
The code is modified from xfsprogs.

Signed-off-by: Kinglong Mee <[email protected]>
---
 configure.ac            | 20 +++++++++--
 mkfs/Makefile.am        |  4 +--
 mkfs/f2fs_format_main.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 108 insertions(+), 5 deletions(-)

diff --git a/configure.ac b/configure.ac
index 6a3f7c4..d6de43b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -48,8 +48,11 @@ AC_CHECK_HEADERS_ONCE([
 # Test configure options.
 AC_ARG_WITH([selinux],
        AS_HELP_STRING([--without-selinux],
-         [Ignore presence of libselinux and disable selinux support])
-)
+         [Ignore presence of libselinux and disable selinux support]))
+
+AC_ARG_WITH([blkid],
+       AS_HELP_STRING([--without-blkid],
+         [Ignore presence of libblkid and disable blkid support]))
 
 # Checks for programs.
 AC_PROG_CC
@@ -74,6 +77,19 @@ AS_IF([test "x$have_selinux" = "xyes"],
        )]
 )
 
+AS_IF([test "x$with_blkid" != "xno"],
+       [PKG_CHECK_MODULES([libblkid], [blkid],
+                          [have_blkid=yes], [have_blkid=no])],
+       [have_blkid=no]
+)
+
+AS_IF([test "x$have_blkid" = "xyes"],
+       [AC_DEFINE([HAVE_LIBBLKID], [1], [Use blkid])],
+       [AS_IF([test "x$with_blkid" = "xyes"],
+               [AC_MSG_ERROR([blkid support requested but libblkid not found])]
+       )]
+)
+
 # Checks for header files.
 AC_CHECK_HEADERS([linux/fs.h linux/blkzoned.h fcntl.h mntent.h stdlib.h 
string.h \
                sys/ioctl.h sys/mount.h unistd.h linux/falloc.h byteswap.h])
diff --git a/mkfs/Makefile.am b/mkfs/Makefile.am
index 8b4c16c..162a0cf 100644
--- a/mkfs/Makefile.am
+++ b/mkfs/Makefile.am
@@ -1,10 +1,10 @@
 ## Makefile.am
 
-AM_CPPFLAGS = ${libuuid_CFLAGS} -I$(top_srcdir)/include
+AM_CPPFLAGS = ${libuuid_CFLAGS} ${libblkid_CFLAGS} -I$(top_srcdir)/include
 AM_CFLAGS = -Wall -DWITH_BLKDISCARD
 sbin_PROGRAMS = mkfs.f2fs
 mkfs_f2fs_SOURCES = f2fs_format_main.c f2fs_format.c f2fs_format_utils.c 
f2fs_format_utils.h $(top_srcdir)/include/f2fs_fs.h
-mkfs_f2fs_LDADD = ${libuuid_LIBS} $(top_builddir)/lib/libf2fs.la
+mkfs_f2fs_LDADD = ${libuuid_LIBS} ${libblkid_LIBS} 
$(top_builddir)/lib/libf2fs.la
 
 lib_LTLIBRARIES = libf2fs_format.la
 libf2fs_format_la_SOURCES = f2fs_format_main.c f2fs_format.c 
f2fs_format_utils.c
diff --git a/mkfs/f2fs_format_main.c b/mkfs/f2fs_format_main.c
index 5bb1faf..b26256d 100644
--- a/mkfs/f2fs_format_main.c
+++ b/mkfs/f2fs_format_main.c
@@ -18,10 +18,16 @@
 #include <time.h>
 #include <uuid/uuid.h>
 
+#include "config.h"
+#ifdef HAVE_LIBBLKID
+#  include <blkid/blkid.h>
+#endif
+
 #include "f2fs_fs.h"
 #include "f2fs_format_utils.h"
 
 extern struct f2fs_configuration c;
+static int force_overwrite = 0;
 
 static void mkfs_usage()
 {
@@ -72,7 +78,7 @@ static void parse_feature(const char *features)
 
 static void f2fs_parse_options(int argc, char *argv[])
 {
-       static const char *option_string = "qa:c:d:e:l:mo:O:s:z:t:";
+       static const char *option_string = "qa:c:d:e:l:mo:O:s:z:t:f";
        int32_t option=0;
 
        while ((option = getopt(argc,argv,option_string)) != EOF) {
@@ -128,6 +134,9 @@ static void f2fs_parse_options(int argc, char *argv[])
                case 't':
                        c.trim = atoi(optarg);
                        break;
+               case 'f':
+                       force_overwrite = 1;
+                       break;
                default:
                        MSG(0, "\tError: Unknown option %c\n",option);
                        mkfs_usage();
@@ -155,6 +164,79 @@ static void f2fs_parse_options(int argc, char *argv[])
                c.feature |= cpu_to_le32(F2FS_FEATURE_BLKZONED);
 }
 
+#ifdef HAVE_LIBBLKID
+static int f2fs_dev_is_overwrite(const char *device)
+{
+       const char      *type;
+       blkid_probe     pr = NULL;
+       int             ret = -1;
+
+       if (!device || !*device)
+               return 0;
+
+       pr = blkid_new_probe_from_filename(device);
+       if (!pr)
+               goto out;
+
+       ret = blkid_probe_enable_partitions(pr, 1);
+       if (ret < 0)
+               goto out;
+
+       ret = blkid_do_fullprobe(pr);
+       if (ret < 0)
+               goto out;
+
+       /*
+        * Blkid returns 1 for nothing found and 0 when it finds a signature,
+        * but we want the exact opposite, so reverse the return value here.
+        *
+        * In addition print some useful diagnostics about what actually is
+        * on the device.
+        */
+       if (ret) {
+               ret = 0;
+               goto out;
+       }
+
+       if (!blkid_probe_lookup_value(pr, "TYPE", &type, NULL)) {
+               MSG(0, "\t%s appears to contain an existing filesystem (%s).\n",
+                       device, type);
+       } else if (!blkid_probe_lookup_value(pr, "PTTYPE", &type, NULL)) {
+               MSG(0, "\t%s appears to contain a partition table (%s).\n",
+                       device, type);
+       } else {
+               MSG(0, "\t%s appears to contain something weird according to 
blkid\n",
+                       device);
+       }
+       ret = 1;
+out:
+       if (pr)
+               blkid_free_probe(pr);
+       if (ret == -1)
+               MSG(0, "\tprobe of %s failed, cannot detect existing 
filesystem.\n",
+                       device);
+       return ret;
+}
+
+static int f2fs_check_overwrite(void)
+{
+       int i;
+
+       for (i = 0; i < c.ndevs; i++)
+               if (f2fs_dev_is_overwrite((char *)c.devices[i].path))
+                       return -1;
+       return 0;
+}
+
+#else
+
+static int f2fs_check_overwrite(void)
+{
+       return 0;
+}
+
+#endif /* HAVE_LIBBLKID */
+
 int main(int argc, char *argv[])
 {
        f2fs_init_configuration();
@@ -163,6 +245,11 @@ int main(int argc, char *argv[])
 
        f2fs_show_info();
 
+       if (!force_overwrite && f2fs_check_overwrite()) {
+               MSG(0, "\tUse the -f option to force overwrite.\n");
+               return -1;
+       }
+
        if (f2fs_devs_are_umounted() < 0) {
                MSG(0, "\tError: Not available on mounted device!\n");
                return -1;
-- 
2.9.3


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Linux-f2fs-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to