Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 17 Dec 2018 07:43:29 +0000 (UTC)
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r342161 - head/stand/libsa/zfs
Message-ID:  <201812170743.wBH7hTX9063794@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tsoome
Date: Mon Dec 17 07:43:29 2018
New Revision: 342161
URL: https://svnweb.freebsd.org/changeset/base/342161

Log:
  loader: zfs reader should not probe partitionless disks (UEFI case)
  
  With r342151 I did fix the BIOS version of zfs_probe_dev() from accessing
  the whole disk, but the fix was not complete - we actually did not check
  if the device name was really for whole disk. Since UEFI version
  is only calling the zfs_probe_dev() with partitions and not with whole
  disk, the UEFI loader was not able to find the zfs pools.
  
  This update does correct the issue by calling archsw.arch_getdev() to
  translate the device name back to dev_desc, and we have whole disk when both
  partition and slice values are -1.
  
  Reported by:	alvisen_gmail.com
  Differential Revision:	https://reviews.freebsd.org/D18558

Modified:
  head/stand/libsa/zfs/zfs.c

Modified: head/stand/libsa/zfs/zfs.c
==============================================================================
--- head/stand/libsa/zfs/zfs.c	Mon Dec 17 07:09:46 2018	(r342160)
+++ head/stand/libsa/zfs/zfs.c	Mon Dec 17 07:43:29 2018	(r342161)
@@ -33,15 +33,16 @@ __FBSDID("$FreeBSD$");
  *	Stand-alone file reading package.
  */
 
+#include <stand.h>
 #include <sys/disk.h>
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/queue.h>
+#include <disk.h>
 #include <part.h>
 #include <stddef.h>
 #include <stdarg.h>
 #include <string.h>
-#include <stand.h>
 #include <bootstrap.h>
 
 #include "libzfs.h"
@@ -517,6 +518,7 @@ zfs_probe_partition(void *arg, const char *partname,
 int
 zfs_probe_dev(const char *devname, uint64_t *pool_guid)
 {
+	struct disk_devdesc *dev;
 	struct ptable *table;
 	struct zfs_probe_args pa;
 	uint64_t mediasz;
@@ -532,6 +534,17 @@ zfs_probe_dev(const char *devname, uint64_t *pool_guid
 	 * disks and some systems will misreport the disk sizes and will
 	 * hang while accessing the disk.
 	 */
+	if (archsw.arch_getdev((void **)&dev, devname, NULL) == 0) {
+		int partition = dev->d_partition;
+		int slice = dev->d_slice;
+
+		free(dev);
+		if (partition != -1 && slice != -1) {
+			ret = zfs_probe(pa.fd, pool_guid);
+			if (ret == 0)
+				return (0);
+		}
+	}
 
 	/* Probe each partition */
 	ret = ioctl(pa.fd, DIOCGMEDIASIZE, &mediasz);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201812170743.wBH7hTX9063794>