Module Name:    src
Committed By:   mlelstv
Date:           Tue Nov  4 07:45:45 UTC 2014

Modified Files:
        src/sys/dev/dkwedge: dkwedge_bsdlabel.c

Log Message:
Handle disks with non DEV_BSIZE sectors.


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/dkwedge/dkwedge_bsdlabel.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/dkwedge/dkwedge_bsdlabel.c
diff -u src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.22 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.23
--- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.22	Sat Aug 30 09:35:10 2014
+++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c	Tue Nov  4 07:45:45 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_bsdlabel.c,v 1.22 2014/08/30 09:35:10 apb Exp $	*/
+/*	$NetBSD: dkwedge_bsdlabel.c,v 1.23 2014/11/04 07:45:45 mlelstv Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_bsdlabel.c,v 1.22 2014/08/30 09:35:10 apb Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_bsdlabel.c,v 1.23 2014/11/04 07:45:45 mlelstv Exp $");
 
 #include <sys/param.h>
 #ifdef _KERNEL
@@ -137,6 +137,7 @@ typedef struct mbr_args {
 	struct vnode	*vp;
 	void		*buf;
 	int		error;
+	uint32_t	secsize;
 } mbr_args_t;
 
 static const char *
@@ -274,7 +275,7 @@ validate_label(mbr_args_t *a, daddr_t la
 	int error, swapped;
 	uint16_t npartitions;
 
-	error = dkwedge_read(a->pdk, a->vp, label_sector, a->buf, DEV_BSIZE);
+	error = dkwedge_read(a->pdk, a->vp, label_sector, a->buf, a->secsize);
 	if (error) {
 		aprint_error("%s: unable to read BSD disklabel @ %" PRId64
 		    ", error = %d\n", a->pdk->dk_name, label_sector, error);
@@ -288,7 +289,7 @@ validate_label(mbr_args_t *a, daddr_t la
 	 * in the sector.
 	 */
 	lp = a->buf;
-	lp_lim = (char *)a->buf + DEV_BSIZE - DISKLABEL_MINSIZE;
+	lp_lim = (char *)a->buf + a->secsize - DISKLABEL_MINSIZE;
 	for (;; lp = (void *)((char *)lp + sizeof(uint32_t))) {
 		if ((char *)lp > (char *)lp_lim)
 			return (SCAN_CONTINUE);
@@ -307,7 +308,7 @@ validate_label(mbr_args_t *a, daddr_t la
 
 		/* Validate label length. */
 		if ((char *)lp + DISKLABEL_SIZE(npartitions) >
-		    (char *)a->buf + DEV_BSIZE) {
+		    (char *)a->buf + a->secsize) {
 			aprint_error("%s: BSD disklabel @ "
 			    "%" PRId64 "+%zd has bogus partition count (%u)\n",
 			    a->pdk->dk_name, label_sector, label_offset,
@@ -351,7 +352,7 @@ scan_mbr(mbr_args_t *a, int (*actn)(mbr_
 	this_ext = 0;
 	for (;;) {
 		a->error = dkwedge_read(a->pdk, a->vp, this_ext, a->buf,
-					DEV_BSIZE);
+					a->secsize);
 		if (a->error) {
 			aprint_error("%s: unable to read MBR @ %u, "
 			    "error = %d\n", a->pdk->dk_name, this_ext,
@@ -447,8 +448,9 @@ dkwedge_discover_bsdlabel(struct disk *p
 	int rval;
 
 	a.pdk = pdk;
+	a.secsize = DEV_BSIZE << pdk->dk_blkshift;
 	a.vp = vp;
-	a.buf = DKW_MALLOC(DEV_BSIZE);
+	a.buf = DKW_MALLOC(a.secsize);
 	a.error = 0;
 
 	/* MBR search. */

Reply via email to