]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
mke2fs: check for a partition table and warn if present
authorTheodore Ts'o <tytso@mit.edu>
Mon, 5 May 2014 05:22:22 +0000 (01:22 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Wed, 7 May 2014 14:51:50 +0000 (10:51 -0400)
This supercedes the "whole disk" check, since it does a better job and
there are times when it is quite legitimate to want to use the whole
disk.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
configure
configure.in
lib/config.h.in
misc/util.c

index 44664c31294174a94a2b6d870df678077cd51c32..6fe33f5afc1e68ffffb4d8b1cdfe1bb7f5a92400 100755 (executable)
--- a/configure
+++ b/configure
@@ -11078,7 +11078,7 @@ if test "$ac_res" != no; then :
 fi
 
 fi
-for ac_func in         __secure_getenv         backtrace       blkid_probe_get_topology        chflags         fadvise64       fallocate       fallocate64     fchown  fdatasync       fstat64         ftruncate64     futimes         getcwd  getdtablesize   getmntinfo      getpwuid_r      getrlimit       getrusage       jrand48         llseek  lseek64         mallinfo        mbstowcs        memalign        mempcpy         mmap    msync   nanosleep       open64  pathconf        posix_fadvise   posix_fadvise64         posix_memalign  prctl   secure_getenv   setmntent       setresgid       setresuid       srandom         stpcpy  strcasecmp      strdup  strnlen         strptime        strtoull        sync_file_range         sysconf         usleep  utime   valloc
+for ac_func in         __secure_getenv         backtrace       blkid_probe_get_topology        blkid_probe_enable_partitions   chflags         fadvise64       fallocate       fallocate64     fchown  fdatasync       fstat64         ftruncate64     futimes         getcwd  getdtablesize   getmntinfo      getpwuid_r      getrlimit       getrusage       jrand48         llseek  lseek64         mallinfo        mbstowcs        memalign        mempcpy         mmap    msync   nanosleep       open64  pathconf        posix_fadvise   posix_fadvise64         posix_memalign  prctl   secure_getenv   setmntent       setresgid       setresuid       srandom         stpcpy  strcasecmp      strdup  strnlen         strptime        strtoull        sync_file_range         sysconf         usleep  utime   valloc
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
index e0e6d4890a724b2f05ba69b78a7620da609fefdd..781b6f5a36716f02552eb2a4db5d280a78d19f7c 100644 (file)
@@ -1050,6 +1050,7 @@ AC_CHECK_FUNCS(m4_flatten([
        __secure_getenv
        backtrace
        blkid_probe_get_topology
+       blkid_probe_enable_partitions
        chflags
        fadvise64
        fallocate
index b575a5caf2cd9bea282ab9e995f48eefd2a89d63..92b3c49b5b73f73148b6bedb2ec14f4a02aab594 100644 (file)
@@ -55,6 +55,9 @@
 /* Define to 1 if you have the `backtrace' function. */
 #undef HAVE_BACKTRACE
 
+/* Define to 1 if you have the `blkid_probe_enable_partitions' function. */
+#undef HAVE_BLKID_PROBE_ENABLE_PARTITIONS
+
 /* Define to 1 if you have the `blkid_probe_get_topology' function. */
 #undef HAVE_BLKID_PROBE_GET_TOPOLOGY
 
index 051183ef9e89f72551adac1377b7179ed6600aed..1c0818f665f776958f269f90199a9598cd9af647 100644 (file)
@@ -140,13 +140,54 @@ static void print_ext2_info(const char *device)
        ext2fs_close(fs);
 }
 
+/*
+ * return 1 if there is no partition table, 0 if a partition table is
+ * detected, and -1 on an error.
+ */
+static int check_partition_table(const char *device)
+{
+#ifdef HAVE_BLKID_PROBE_ENABLE_PARTITIONS
+       blkid_probe pr;
+       const char *value;
+       int ret;
+
+       pr = blkid_new_probe_from_filename(device);
+       if (!pr)
+               return -1;
+
+        ret = blkid_probe_enable_partitions(pr, 1);
+        if (ret < 0)
+               goto errout;
+
+       ret = blkid_probe_enable_superblocks(pr, 0);
+       if (ret < 0)
+               goto errout;
+
+       ret = blkid_do_fullprobe(pr);
+       if (ret < 0)
+               goto errout;
+
+       ret = blkid_probe_lookup_value(pr, "PTTYPE", &value, NULL);
+       if (ret == 0)
+               fprintf(stderr, _("Found a %s partition table in %s\n"),
+                       value, device);
+       else
+               ret = 1;
+
+errout:
+       blkid_free_probe(pr);
+       return ret;
+#else
+       return -1;
+#endif
+}
 
 /*
  * return 1 if the device looks plausible, creating the file if necessary
  */
 int check_plausibility(const char *device, int flags, int *ret_is_dev)
 {
-       int fd, is_dev = 0;
+       int fd, ret, is_dev = 0;
        ext2fs_struct_stat s;
        int fl = O_RDONLY;
        blkid_cache cache = NULL;
@@ -190,6 +231,15 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev)
                return 0;
        }
 
+       /*
+        * Note: we use the older-style blkid API's here because we
+        * want as much functionality to be available when using the
+        * internal blkid library, when e2fsprogs is compiled for
+        * non-Linux systems that will probably not have the libraries
+        * from util-linux available.  We only use the newer
+        * blkid-probe interfaces to access functionality not
+        * available in the original blkid library.
+        */
        if ((flags & CHECK_FS_EXIST) && blkid_get_cache(&cache, NULL) >= 0) {
                fs_type = blkid_get_tag_value(cache, "TYPE", device);
                if (fs_type)
@@ -211,12 +261,9 @@ int check_plausibility(const char *device, int flags, int *ret_is_dev)
                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.
-        */
+       ret = check_partition_table(device);
+       if (ret >= 0)
+               return ret;
 
 #ifdef HAVE_LINUX_MAJOR_H
 #ifndef MAJOR