On Mon, 5 May 2014, Theodore Ts'o wrote: > Date: Mon, 5 May 2014 21:02:13 -0400 > From: Theodore Ts'o <tytso@xxxxxxx> > To: Ext4 Developers List <linux-ext4@xxxxxxxxxxxxxxx> > Cc: Theodore Ts'o <tytso@xxxxxxx> > Subject: [PATCH -v2 3/3] mke2fs: check for a partition table and warn if > present > > 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@xxxxxxx> > --- > configure | 2 +- > configure.in | 1 + > lib/config.h.in | 3 +++ > misc/util.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++------- > 4 files changed, 59 insertions(+), 8 deletions(-) > > diff --git a/configure b/configure > index 44664c3..6fe33f5 100755 > --- 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" > diff --git a/configure.in b/configure.in > index e0e6d48..781b6f5 100644 > --- a/configure.in > +++ b/configure.in > @@ -1050,6 +1050,7 @@ AC_CHECK_FUNCS(m4_flatten([ > __secure_getenv > backtrace > blkid_probe_get_topology > + blkid_probe_enable_partitions > chflags > fadvise64 > fallocate > diff --git a/lib/config.h.in b/lib/config.h.in > index b575a5c..92b3c49 100644 > --- a/lib/config.h.in > +++ b/lib/config.h.in > @@ -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 > > diff --git a/misc/util.c b/misc/util.c > index d63e21b..ce3c416 100644 > --- a/misc/util.c > +++ b/misc/util.c > @@ -139,13 +139,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) Wrong indentation (spaces instead of tab), but otherwise it looks good. Thanks! Reviewed-by: Lukas Czerner <lczerner@xxxxxxxxxx> > + 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; > @@ -189,6 +230,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) > @@ -210,12 +260,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 > -- To unsubscribe from this list: send the line "unsubscribe linux-ext4" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html