diff --git a/cmd/zpool/zpool_main.c b/cmd/zpool/zpool_main.c index bd7be7246..b74dc219a 100644 --- a/cmd/zpool/zpool_main.c +++ b/cmd/zpool/zpool_main.c @@ -2080,6 +2080,9 @@ do_import(nvlist_t *config, const char *newname, const char *mntopts, * * -o Set property=value and/or temporary mount options (without '='). * + * -s Scan using the default search path, the libblkid cache will + * not be consulted. + * * The import command scans for pools to import, and import pools based on pool * name and GUID. The pool can also be renamed as part of the import process. */ @@ -2109,13 +2112,14 @@ zpool_do_import(int argc, char **argv) boolean_t dryrun = B_FALSE; boolean_t do_rewind = B_FALSE; boolean_t xtreme_rewind = B_FALSE; + boolean_t do_scan = B_FALSE; uint64_t pool_state, txg = -1ULL; char *cachefile = NULL; importargs_t idata = { 0 }; char *endptr; /* check options */ - while ((c = getopt(argc, argv, ":aCc:d:DEfFmnNo:R:tT:VX")) != -1) { + while ((c = getopt(argc, argv, ":aCc:d:DEfFmnNo:R:stT:VX")) != -1) { switch (c) { case 'a': do_all = B_TRUE; @@ -2173,6 +2177,9 @@ zpool_do_import(int argc, char **argv) ZPOOL_PROP_CACHEFILE), "none", &props, B_TRUE)) goto error; break; + case 's': + do_scan = B_TRUE; + break; case 't': flags |= ZFS_IMPORT_TEMP_NAME; if (add_prop_list_default(zpool_prop_to_name( @@ -2322,6 +2329,7 @@ zpool_do_import(int argc, char **argv) idata.poolname = searchname; idata.guid = searchguid; idata.cachefile = cachefile; + idata.scan = do_scan; pools = zpool_search_import(g_zfs, &idata); diff --git a/cmd/zpool/zpool_vdev.c b/cmd/zpool/zpool_vdev.c index cae20147b..54ca1b261 100644 --- a/cmd/zpool/zpool_vdev.c +++ b/cmd/zpool/zpool_vdev.c @@ -78,12 +78,7 @@ #include #include #include -#ifdef HAVE_LIBBLKID #include -#else -#define blkid_cache void * -#endif /* HAVE_LIBBLKID */ - #include "zpool_util.h" #include @@ -374,7 +369,6 @@ static int check_slice(const char *path, blkid_cache cache, int force, boolean_t isspare) { int err; -#ifdef HAVE_LIBBLKID char *value; /* No valid type detected device is safe to use */ @@ -400,9 +394,6 @@ check_slice(const char *path, blkid_cache cache, int force, boolean_t isspare) } free(value); -#else - err = check_file(path, force, isspare); -#endif /* HAVE_LIBBLKID */ return (err); } @@ -500,7 +491,6 @@ check_device(const char *path, boolean_t force, { static blkid_cache cache = NULL; -#ifdef HAVE_LIBBLKID /* * There is no easy way to add a correct blkid_put_cache() call, * memory will be reclaimed when the command exits. @@ -519,7 +509,6 @@ check_device(const char *path, boolean_t force, return (-1); } } -#endif /* HAVE_LIBBLKID */ return (check_disk(path, cache, force, isspare, iswholedisk)); } diff --git a/config/user-libblkid.m4 b/config/user-libblkid.m4 index 2dd26238c..5bc7f466a 100644 --- a/config/user-libblkid.m4 +++ b/config/user-libblkid.m4 @@ -1,113 +1,13 @@ dnl # -dnl # Check for ZFS support in libblkid. This test needs to check -dnl # more than if the library exists because we expect there are -dnl # at least 3 flavors of the library out in the wild: -dnl # -dnl # 1) blkid which has no ZFS support -dnl # 2) blkid with ZFS support and a flawed method of probing -dnl # 3) blkid with ZFS support and a working method of probing -dnl # -dnl # To handle this the check first validates that there is a version -dnl # of the library installed. If there is it creates a simulated -dnl # ZFS filesystem and then links a small test app which attempts -dnl # to detect the simualated filesystem type. If it correctly -dnl # identifies the filesystem as ZFS we can safely assume case 3). -dnl # Otherwise we disable blkid support and resort to manual probing. +dnl # Check for libblkid. Basic support for detecting ZFS pools +dnl # has existing in blkid since 2008. dnl # AC_DEFUN([ZFS_AC_CONFIG_USER_LIBBLKID], [ - AC_ARG_WITH([blkid], - [AS_HELP_STRING([--with-blkid], - [support blkid caching @<:@default=check@:>@])], - [], - [with_blkid=check]) - LIBBLKID= - AS_IF([test "x$with_blkid" = xyes], - [ - AC_SUBST([LIBBLKID], ["-lblkid"]) - AC_DEFINE([HAVE_LIBBLKID], 1, - [Define if you have libblkid]) - ]) - AS_IF([test "x$with_blkid" = xcheck], - [ - AC_CHECK_LIB([blkid], [blkid_get_cache], - [ - AC_MSG_CHECKING([for blkid zfs support]) + AC_CHECK_HEADER([blkid/blkid.h], [], [AC_MSG_FAILURE([ + *** blkid.h missing, libblkid-devel package required])]) - ZFS_DEV=`mktemp` - truncate -s 64M $ZFS_DEV - echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ - dd of=$ZFS_DEV bs=1k count=8 \ - seek=128 conv=notrunc &>/dev/null \ - >/dev/null 2>/dev/null - echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ - dd of=$ZFS_DEV bs=1k count=8 \ - seek=132 conv=notrunc &>/dev/null \ - >/dev/null 2>/dev/null - echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ - dd of=$ZFS_DEV bs=1k count=8 \ - seek=136 conv=notrunc &>/dev/null \ - >/dev/null 2>/dev/null - echo -en "\x0c\xb1\xba\0\0\0\0\0" | \ - dd of=$ZFS_DEV bs=1k count=8 \ - seek=140 conv=notrunc &>/dev/null \ - >/dev/null 2>/dev/null - - saved_LIBS="$LIBS" - LIBS="-lblkid" - - AC_RUN_IFELSE([AC_LANG_PROGRAM( - [ - #include - #include - #include - ], - [ - blkid_cache cache; - char *value; - - if (blkid_get_cache(&cache, NULL) < 0) - return 1; - - value = blkid_get_tag_value(cache, "TYPE", - "$ZFS_DEV"); - if (!value) { - blkid_put_cache(cache); - return 2; - } - - if (strcmp(value, "zfs_member")) { - free(value); - blkid_put_cache(cache); - return 0; - } - - free(value); - blkid_put_cache(cache); - ])], - [ - rm -f $ZFS_DEV - AC_MSG_RESULT([yes]) - AC_SUBST([LIBBLKID], ["-lblkid"]) - AC_DEFINE([HAVE_LIBBLKID], 1, - [Define if you have libblkid]) - ], - [ - rm -f $ZFS_DEV - AC_MSG_RESULT([no]) - AS_IF([test "x$with_blkid" != xcheck], - [AC_MSG_FAILURE( - [--with-blkid given but unavailable])]) - ]) - - LIBS="$saved_LIBS" - ], - [ - AS_IF([test "x$with_blkid" != xcheck], - [AC_MSG_FAILURE( - [--with-blkid given but unavailable])]) - ] - []) - ]) + AC_SUBST([LIBBLKID], ["-lblkid"]) + AC_DEFINE([HAVE_LIBBLKID], 1, [Define if you have libblkid]) ]) diff --git a/include/libzfs.h b/include/libzfs.h index b8419e2e9..d07c9dd5d 100644 --- a/include/libzfs.h +++ b/include/libzfs.h @@ -391,6 +391,7 @@ typedef struct importargs { int can_be_active : 1; /* can the pool be active? */ int unique : 1; /* does 'poolname' already exist? */ int exists : 1; /* set on return if pool already exists */ + int scan : 1; /* prefer scanning to libblkid cache */ } importargs_t; extern nvlist_t *zpool_search_import(libzfs_handle_t *, importargs_t *); diff --git a/lib/libzfs/libzfs_import.c b/lib/libzfs/libzfs_import.c index d71f343a0..d2eefff53 100644 --- a/lib/libzfs/libzfs_import.c +++ b/lib/libzfs/libzfs_import.c @@ -55,12 +55,8 @@ #include #include #include - #include -#ifdef HAVE_LIBBLKID #include -#endif - #include "libzfs.h" #include "libzfs_impl.h" @@ -1203,7 +1199,6 @@ zpool_clear_label(int fd) return (0); } -#ifdef HAVE_LIBBLKID /* * Use libblkid to quickly search for zfs devices */ @@ -1273,7 +1268,6 @@ err_blkid2: err_blkid1: return (err); } -#endif /* HAVE_LIBBLKID */ char * zpool_default_import_path[DEFAULT_IMPORT_PATH_SIZE] = { @@ -1313,17 +1307,15 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) verify(iarg->poolname == NULL || iarg->guid == 0); + /* + * Prefer to locate pool member vdevs using libblkid. Only fall + * back to legacy directory scanning when explicitly requested or + * if an error is encountered when consulted the libblkid cache. + */ if (dirs == 0) { -#ifdef HAVE_LIBBLKID - /* Use libblkid to scan all device for their type */ - if (zpool_find_import_blkid(hdl, &pools) == 0) + if (!iarg->scan && (zpool_find_import_blkid(hdl, &pools) == 0)) goto skip_scanning; - (void) zfs_error_fmt(hdl, EZFS_BADCACHE, - dgettext(TEXT_DOMAIN, "blkid failure falling back " - "to manual probing")); -#endif /* HAVE_LIBBLKID */ - dir = zpool_default_import_path; dirs = DEFAULT_IMPORT_PATH_SIZE; } @@ -1465,9 +1457,7 @@ zpool_find_import_impl(libzfs_handle_t *hdl, importargs_t *iarg) goto error; } -#ifdef HAVE_LIBBLKID skip_scanning: -#endif ret = get_configs(hdl, &pools, iarg->can_be_active); error: diff --git a/man/man8/zpool.8 b/man/man8/zpool.8 index 9ce265dcf..2d92a7502 100644 --- a/man/man8/zpool.8 +++ b/man/man8/zpool.8 @@ -83,13 +83,14 @@ zpool \- configures ZFS storage pools .LP .nf \fBzpool import\fR [\fB-o \fImntopts\fR\fR] [\fB-o\fR \fIproperty=value\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] - [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-N\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR] [\fB-X\fR\] [\fB-T\fR\]] \fB-a\fR + [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-N\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR] [\fB-X\fR\] [\fB-T\fR\]] [\fB-s\fR] \fB-a\fR .fi .LP .nf \fBzpool import\fR [\fB-o \fImntopts\fR\fR] [\fB-o\fR \fIproperty=value\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] - [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR] [\fB-X\fR] [\fB-T\fR\]] [\fB-t\fR]] \fIpool\fR |\fIid\fR [\fInewpool\fR] + [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR] [\fB-X\fR] [\fB-T\fR\]] [\fB-t\fR]] [\fB-s\fR] + \fIpool\fR | \fIid\fR [\fInewpool\fR] .fi .LP @@ -1322,7 +1323,7 @@ Lists destroyed pools only. .ne 2 .mk .na -\fB\fBzpool import\fR [\fB-o\fR \fImntopts\fR] [ \fB-o\fR \fIproperty\fR=\fIvalue\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-N\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR]] \fB-a\fR\fR +\fB\fBzpool import\fR [\fB-o\fR \fImntopts\fR] [ \fB-o\fR \fIproperty\fR=\fIvalue\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-N\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR]] [\fB-s\fR] \fB-a\fR\fR .ad .sp .6 .RS 4n @@ -1477,13 +1478,24 @@ Specify the txg to use for rollback. Implies \fB-FX\fR. For more details about \fBWARNING\fR: This option can be extremely hazardous to the health of your pool and should only be used as a last resort. .RE +.sp +.ne 2 +.mk +.na +\fB\fB-s\fR +.ad +.RS 21n +.rt +Scan using the default search path, the libblkid cache will not be consulted. A custom search path may be specified by setting the \fBZPOOL_IMPORT_PATH\fR environment variable. +.RE + .RE .sp .ne 2 .mk .na -\fB\fBzpool import\fR [\fB-o\fR \fImntopts\fR] [ \fB-o\fR \fIproperty\fR=\fIvalue\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR]] [\fB-t\fR]] \fIpool\fR | \fIid\fR [\fInewpool\fR]\fR +\fB\fBzpool import\fR [\fB-o\fR \fImntopts\fR] [ \fB-o\fR \fIproperty\fR=\fIvalue\fR] ... [\fB-d\fR \fIdir\fR | \fB-c\fR \fIcachefile\fR] [\fB-D\fR] [\fB-f\fR] [\fB-m\fR] [\fB-R\fR \fIroot\fR] [\fB-F\fR [\fB-n\fR]] [\fB-t\fR]] [\fB-s\fR] \fIpool\fR | \fIid\fR [\fInewpool\fR]\fR .ad .sp .6 .RS 4n @@ -1635,6 +1647,17 @@ Used with "\fBnewpool\fR". Specifies that "\fBnewpool\fR" is temporary. Temporar Allows a pool to import when there is a missing log device. .RE +.sp +.ne 2 +.mk +.na +\fB\fB-s\fR +.ad +.sp .6 +.RS 4n +Scan using the default search path, the libblkid cache will not be consulted. A custom search path may be specified by setting the \fBZPOOL_IMPORT_PATH\fR environment variable. +.RE + .RE .sp diff --git a/rpm/generic/zfs.spec.in b/rpm/generic/zfs.spec.in index bac8048af..a7ca1a0b6 100644 --- a/rpm/generic/zfs.spec.in +++ b/rpm/generic/zfs.spec.in @@ -34,7 +34,6 @@ %endif %bcond_with debug -%bcond_with blkid %bcond_with systemd # Generic enable switch for systemd @@ -89,10 +88,8 @@ Conflicts: zfs-fuse %if 0%{?rhel}%{?fedora}%{?suse_version} BuildRequires: zlib-devel BuildRequires: libuuid-devel -%if %{with blkid} BuildRequires: libblkid-devel %endif -%endif %if 0%{?_systemd} Requires(post): systemd Requires(preun): systemd @@ -213,11 +210,6 @@ image which is ZFS aware. %else %define debug --disable-debug %endif -%if %{with blkid} - %define blkid --with-blkid -%else - %define blkid --without-blkid -%endif %if 0%{?_systemd} %define systemd --enable-systemd --with-systemdunitdir=%{_unitdir} --with-systemdpresetdir=%{_presetdir} --disable-sysvinit %else @@ -234,7 +226,6 @@ image which is ZFS aware. --with-dracutdir=%{_dracutdir} \ --disable-static \ %{debug} \ - %{blkid} \ %{systemd} make %{?_smp_mflags}