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@mit.edu>
maint-test
Theodore Ts'o 2014-05-05 01:22:22 -04:00
parent 352fbedb21
commit 2de2628b2d
4 changed files with 59 additions and 8 deletions

2
configure vendored
View File

@ -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"

View File

@ -1050,6 +1050,7 @@ AC_CHECK_FUNCS(m4_flatten([
__secure_getenv
backtrace
blkid_probe_get_topology
blkid_probe_enable_partitions
chflags
fadvise64
fallocate

View 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

View 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