Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 30 Dec 2018 09:13:38 +0000 (UTC)
From:      Toomas Soome <tsoome@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-12@freebsd.org
Subject:   svn commit: r342618 - stable/12/stand/libsa/zfs
Message-ID:  <201812300913.wBU9DcDX042230@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: tsoome
Date: Sun Dec 30 09:13:38 2018
New Revision: 342618
URL: https://svnweb.freebsd.org/changeset/base/342618

Log:
  MFC r342151, r342161:
  loader: zfs reader should not probe partitionless disks
  
  First of all, normal setups can not boot such pools as the tools
  do not support installing boot programs.
  
  Secondly, for proper pool configuration detection, we need to checks all
  four label copies on disk, 2 from front and 2 from the end of the disk,
  but zfs label does not contain the size of the disk - so we depend on
  firmware to report the correct disk size or use information from the
  partition table.
  
  Without partition table, we only can rely on firmware to report and support
  disk IO properly.
  
  Relnotes:	yes

Modified:
  stable/12/stand/libsa/zfs/zfs.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/stand/libsa/zfs/zfs.c
==============================================================================
--- stable/12/stand/libsa/zfs/zfs.c	Sun Dec 30 09:05:02 2018	(r342617)
+++ stable/12/stand/libsa/zfs/zfs.c	Sun Dec 30 09:13:38 2018	(r342618)
@@ -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;
@@ -527,10 +529,22 @@ zfs_probe_dev(const char *devname, uint64_t *pool_guid
 	pa.fd = open(devname, O_RDONLY);
 	if (pa.fd == -1)
 		return (ENXIO);
-	/* Probe the whole disk */
-	ret = zfs_probe(pa.fd, pool_guid);
-	if (ret == 0)
-		return (0);
+	/*
+	 * We will not probe the whole disk, we can not boot from such
+	 * 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?201812300913.wBU9DcDX042230>