Bug 147852

Summary: [geom] [panic] graid3 panic: wrong offset 16384 for sectorsize 65536
Product: Base System Reporter: Rebecca Cran <bcran>
Component: kernAssignee: Andrey V. Elsukov <ae>
Status: Closed FIXED    
Severity: Affects Only Me    
Priority: Normal    
Version: Unspecified   
Hardware: Any   
OS: Any   

Description Rebecca Cran freebsd_committer freebsd_triage 2010-06-14 15:20:02 UTC
When trying to put a ZFS pool onto a graid3 volume with a blocksize of 32768, the system panics with:

panic: wrong offset 16384 for sectorsize 65536

kdb_enter()
panic()
g_io_request()
vdev_geom_io_start()
zio_execute()
vdev_label_read_config()
vdev_label_init()
vdev_label_init()
vdev_create()
spa_create()
zfs_ioc_pool_create()
zfsdev_ioctl()
devfs_ioctl_f()
kern_ioctl()
ioctl()
syscallenter()
Xfast_syscall()

How-To-Repeat: graid3 label -v -h -r -s 32768 home ada1 ada2 ada3
zpool create home /dev/raid3/home
Comment 1 Mark Linimon freebsd_committer freebsd_triage 2010-06-15 02:23:44 UTC
Responsible Changed
From-To: freebsd-bugs->freebsd-geom

Over to maintainer(s).
Comment 2 Rebecca Cran freebsd_committer freebsd_triage 2010-09-15 09:50:33 UTC
I just got the same panic on a gnop device created with a sectorsize of
4KB installed on a 1TB WD EARS HDD, which appears to be related to
glabel:

GEOM_NOP: Device ada3p2 created.
panic: wrong offset 1000070622720 for sectorsize 4096.

g_io_request
g_io_data
g_label_taste
g_new_provider_event
g_run_events
g_event_procbody
fork_exit
fork_trampoline

-- 
Bruce Cran
Comment 3 Andrey V. Elsukov freebsd_committer freebsd_triage 2011-01-11 10:16:47 UTC
Responsible Changed
From-To: freebsd-geom->ae

Take it.
Comment 4 dfilter service freebsd_committer freebsd_triage 2011-01-11 11:42:29 UTC
Author: ae
Date: Tue Jan 11 11:42:22 2011
New Revision: 217262
URL: http://svn.freebsd.org/changeset/base/217262

Log:
  Round GNOP provider's mediasize to its sectorsize. This prevents KASSERT
  in g_io_request when geom classes doing tasting.
  
  PR:		kern/147852
  MFC after:	1 week

Modified:
  head/sys/geom/nop/g_nop.c

Modified: head/sys/geom/nop/g_nop.c
==============================================================================
--- head/sys/geom/nop/g_nop.c	Tue Jan 11 11:01:29 2011	(r217261)
+++ head/sys/geom/nop/g_nop.c	Tue Jan 11 11:42:22 2011	(r217262)
@@ -176,6 +176,8 @@ g_nop_create(struct gctl_req *req, struc
 		gctl_error(req, "Invalid secsize for provider %s.", pp->name);
 		return (EINVAL);
 	}
+	if (size % secsize != 0)
+		size -= size % secsize;
 	snprintf(name, sizeof(name), "%s%s", pp->name, G_NOP_SUFFIX);
 	LIST_FOREACH(gp, &mp->geom, geom) {
 		if (strcmp(gp->name, name) == 0) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 5 dfilter service freebsd_committer freebsd_triage 2011-01-18 06:25:00 UTC
Author: ae
Date: Tue Jan 18 06:24:52 2011
New Revision: 217530
URL: http://svn.freebsd.org/changeset/base/217530

Log:
  MFC r217262:
    Round GNOP provider's mediasize to its sectorsize. This prevents KASSERT
    in g_io_request when geom classes doing tasting.
  
    PR:		kern/147852
  
  MFC r217263:
    Remove redundant check.

Modified:
  stable/8/sys/geom/nop/g_nop.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/geom/nop/g_nop.c
==============================================================================
--- stable/8/sys/geom/nop/g_nop.c	Tue Jan 18 04:54:43 2011	(r217529)
+++ stable/8/sys/geom/nop/g_nop.c	Tue Jan 18 06:24:52 2011	(r217530)
@@ -176,6 +176,7 @@ g_nop_create(struct gctl_req *req, struc
 		gctl_error(req, "Invalid secsize for provider %s.", pp->name);
 		return (EINVAL);
 	}
+	size -= size % secsize;
 	snprintf(name, sizeof(name), "%s%s", pp->name, G_NOP_SUFFIX);
 	LIST_FOREACH(gp, &mp->geom, geom) {
 		if (strcmp(gp->name, name) == 0) {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 6 dfilter service freebsd_committer freebsd_triage 2011-02-04 15:23:02 UTC
Author: ae
Date: Fri Feb  4 15:22:56 2011
New Revision: 218278
URL: http://svn.freebsd.org/changeset/base/218278

Log:
  vdev's sectorsize should not be greater than 8 Kbytes and also
  it should be power of 2. This prevents non-aligned access while
  probing vdev's labels.
  
  PR:		kern/147852
  Reviewed by:	pjd
  MFC after:	1 week

Modified:
  head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c

Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Feb  4 14:44:59 2011	(r218277)
+++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Feb  4 15:22:56 2011	(r218278)
@@ -393,7 +393,8 @@ vdev_geom_open_by_path(vdev_t *vd, int c
 	if (pp != NULL) {
 		ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path);
 		cp = vdev_geom_attach(pp);
-		if (cp != NULL && check_guid) {
+		if (cp != NULL && check_guid && ISP2(pp->sectorsize) &&
+		    pp->sectorsize <= VDEV_PAD_SIZE) {
 			g_topology_unlock();
 			guid = vdev_geom_read_guid(cp);
 			g_topology_lock();
@@ -457,6 +458,17 @@ vdev_geom_open(vdev_t *vd, uint64_t *psi
 	if (cp == NULL) {
 		ZFS_LOG(1, "Provider %s not found.", vd->vdev_path);
 		error = ENOENT;
+	} else if (cp->provider->sectorsize > VDEV_PAD_SIZE ||
+	    !ISP2(cp->provider->sectorsize)) {
+		ZFS_LOG(1, "Provider %s has unsupported sectorsize.",
+		    vd->vdev_path);
+
+		g_topology_lock();
+		vdev_geom_detach(cp, 0);
+		g_topology_unlock();
+
+		error = EINVAL;
+		cp = NULL;
 	} else if (cp->acw == 0 && (spa_mode(vd->vdev_spa) & FWRITE) != 0) {
 		int i;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"
Comment 7 Andrey V. Elsukov freebsd_committer freebsd_triage 2011-02-05 14:30:18 UTC
State Changed
From-To: open->closed

Fixed in head/. Fix will be MFC'ed in stable/8 soon.
Comment 8 dfilter service freebsd_committer freebsd_triage 2011-02-11 05:56:21 UTC
Author: ae
Date: Fri Feb 11 05:56:14 2011
New Revision: 218541
URL: http://svn.freebsd.org/changeset/base/218541

Log:
  MFC r218278:
    vdev's sectorsize should not be greater than 8 Kbytes and also
    it should be power of 2. This prevents non-aligned access while
    probing vdev's labels.
  
    PR:		kern/147852

Modified:
  stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)

Modified: stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Feb 11 05:54:46 2011	(r218540)
+++ stable/8/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Fri Feb 11 05:56:14 2011	(r218541)
@@ -392,7 +392,8 @@ vdev_geom_open_by_path(vdev_t *vd, int c
 	if (pp != NULL) {
 		ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path);
 		cp = vdev_geom_attach(pp);
-		if (cp != NULL && check_guid) {
+		if (cp != NULL && check_guid && ISP2(pp->sectorsize) &&
+		    pp->sectorsize <= VDEV_PAD_SIZE) {
 			g_topology_unlock();
 			guid = vdev_geom_read_guid(cp);
 			g_topology_lock();
@@ -456,6 +457,17 @@ vdev_geom_open(vdev_t *vd, uint64_t *psi
 	if (cp == NULL) {
 		ZFS_LOG(1, "Provider %s not found.", vd->vdev_path);
 		error = ENOENT;
+	} else if (cp->provider->sectorsize > VDEV_PAD_SIZE ||
+	    !ISP2(cp->provider->sectorsize)) {
+		ZFS_LOG(1, "Provider %s has unsupported sectorsize.",
+		    vd->vdev_path);
+
+		g_topology_lock();
+		vdev_geom_detach(cp, 0);
+		g_topology_unlock();
+
+		error = EINVAL;
+		cp = NULL;
 	} else if (cp->acw == 0 && (spa_mode(vd->vdev_spa) & FWRITE) != 0) {
 		int i;
 
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscribe@freebsd.org"