Module Name:    src
Committed By:   jdolecek
Date:           Sat Apr 11 16:00:34 UTC 2020

Modified Files:
        src/sys/dev/dkwedge: dkwedge_apple.c dkwedge_bsdlabel.c dkwedge_gpt.c
            dkwedge_mbr.c dkwedge_rdb.c

Log Message:
allocate buffer for disk I/O via geteblk() instead of malloc(), so they
are properly aligned; e.g. readdisklabel() does the same

also removed the DKW_MALLOC()/DKW_FREE()/DKW_REALLOC() macros as apparently
unnecessary, these files don't seem to be compiled into any userland tools

dkwedge_gpt.c confirmed working, others compile-tested only


To generate a diff of this commit:
cvs rdiff -u -r1.5 -r1.6 src/sys/dev/dkwedge/dkwedge_apple.c \
    src/sys/dev/dkwedge/dkwedge_rdb.c
cvs rdiff -u -r1.24 -r1.25 src/sys/dev/dkwedge/dkwedge_bsdlabel.c
cvs rdiff -u -r1.25 -r1.26 src/sys/dev/dkwedge/dkwedge_gpt.c
cvs rdiff -u -r1.11 -r1.12 src/sys/dev/dkwedge/dkwedge_mbr.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_apple.c
diff -u src/sys/dev/dkwedge/dkwedge_apple.c:1.5 src/sys/dev/dkwedge/dkwedge_apple.c:1.6
--- src/sys/dev/dkwedge/dkwedge_apple.c:1.5	Tue Jul  9 17:06:46 2019
+++ src/sys/dev/dkwedge/dkwedge_apple.c	Sat Apr 11 16:00:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_apple.c,v 1.5 2019/07/09 17:06:46 maxv Exp $	*/
+/*	$NetBSD: dkwedge_apple.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $	*/
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_apple.c,v 1.5 2019/07/09 17:06:46 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_apple.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $");
 
 #include <sys/param.h>
 #ifdef _KERNEL
@@ -44,8 +44,8 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_appl
 #include <sys/errno.h>
 #include <sys/disk.h>
 #include <sys/vnode.h>
-#include <sys/malloc.h>
 #include <sys/bitops.h>
+#include <sys/buf.h>
 
 #include <sys/bootblock.h>
 
@@ -123,14 +123,6 @@ swap_apple_blockzeroblock(struct apple_b
 
 #define ASIZE	16384
  
-#ifdef _KERNEL
-#define	DKW_MALLOC(SZ)	malloc((SZ), M_DEVBUF, M_WAITOK)
-#define	DKW_FREE(PTR)	free((PTR), M_DEVBUF)
-#else
-#define	DKW_MALLOC(SZ)	malloc((SZ))
-#define	DKW_FREE(PTR)	free((PTR))
-#endif
-
 static struct {
 	const char *name;
 	const char *type;
@@ -145,20 +137,20 @@ dkwedge_discover_apple(struct disk *pdk,
 {
 	size_t i, n;
 	int error;
-	void *buf;
+	struct buf *bp;
 	uint32_t blocksize, blockcount, offset, rsize;
 	struct apple_drvr_map *am;
 	struct apple_part_map_entry *ae;
 	struct apple_blockzeroblock ab;
 	const char *ptype;
 
-	buf = DKW_MALLOC(ASIZE);
-	if ((error = dkwedge_read(pdk, vp, 0, buf, ASIZE)) != 0) {
+	bp = geteblk(ASIZE);
+	if ((error = dkwedge_read(pdk, vp, 0, bp->b_data, ASIZE)) != 0) {
 		DPRINTF("%s: read @%u %d\n", __func__, 0, error);
 		goto out;
 	}
 
-	am = buf;
+	am = bp->b_data;
 	swap_apple_drvr_map(am);
 
 	error = ESRCH;
@@ -186,12 +178,12 @@ dkwedge_discover_apple(struct disk *pdk,
 		blockcount = 512;
 	}
 
-	ae = buf;
+	ae = bp->b_data;
 	offset = blocksize;
 	for (n = 0; n < blockcount; n++, offset += rsize) {
 		DPRINTF("%s: offset %x rsize %x\n", __func__, offset, rsize);
-		if ((error = dkwedge_read(pdk, vp, offset / DEV_BSIZE, buf,
-		    rsize)) != 0) {
+		if ((error = dkwedge_read(pdk, vp, offset / DEV_BSIZE,
+		    bp->b_data, rsize)) != 0) {
 			DPRINTF("%s: read @%u %d\n", __func__, offset,
 			    error);
 			goto out;
@@ -244,7 +236,7 @@ dkwedge_discover_apple(struct disk *pdk,
 	}
 
 out:
-	DKW_FREE(buf);
+	brelse(bp, 0);
 	DPRINTF("%s: return %d\n", __func__, error);
 	return error;
 }
Index: src/sys/dev/dkwedge/dkwedge_rdb.c
diff -u src/sys/dev/dkwedge/dkwedge_rdb.c:1.5 src/sys/dev/dkwedge/dkwedge_rdb.c:1.6
--- src/sys/dev/dkwedge/dkwedge_rdb.c:1.5	Tue Jul  9 17:06:46 2019
+++ src/sys/dev/dkwedge/dkwedge_rdb.c	Sat Apr 11 16:00:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_rdb.c,v 1.5 2019/07/09 17:06:46 maxv Exp $	*/
+/*	$NetBSD: dkwedge_rdb.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $	*/
 
 /*
  * Adapted from arch/amiga/amiga/disksubr.c:
@@ -68,16 +68,14 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.5 2019/07/09 17:06:46 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/disklabel_rdb.h>
 #include <sys/disk.h>
 #include <sys/endian.h>
-#include <sys/malloc.h>
-#ifdef _KERNEL
 #include <sys/systm.h>
-#endif
+#include <sys/buf.h>
 
 /*
  * In /usr/src/sys/dev/scsipi/sd.c, routine sdstart() adjusts the
@@ -96,16 +94,6 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.
 #define	ADJUST_NR(x)	(x)
 #endif
 
-#ifdef _KERNEL
-#define	DKW_MALLOC(SZ)	malloc((SZ), M_DEVBUF, M_WAITOK)
-#define	DKW_FREE(PTR)	free((PTR), M_DEVBUF)
-#define	DKW_REALLOC(PTR, NEWSZ)	realloc((PTR), (NEWSZ), M_DEVBUF, M_WAITOK)
-#else
-#define	DKW_MALLOC(SZ)	malloc((SZ))
-#define	DKW_FREE(PTR)	free((PTR))
-#define	DKW_REALLOC(PTR, NEWSZ)	realloc((PTR), (NEWSZ))
-#endif
-
 static unsigned rdbchksum(void *);
 static unsigned char getarchtype(unsigned);
 static const char *archtype_to_ptype(unsigned char);
@@ -116,7 +104,7 @@ dkwedge_discover_rdb(struct disk *pdk, s
 	struct dkwedge_info dkw;
 	struct partblock *pbp;
 	struct rdblock *rbp;
-	void *bp;
+	struct buf *bp;
 	int error;
 	unsigned blk_per_cyl, bufsize, newsecsize, nextb, secsize, tabsize;
 	const char *ptype;
@@ -126,7 +114,7 @@ dkwedge_discover_rdb(struct disk *pdk, s
 	secsize = DEV_BSIZE << pdk->dk_blkshift;
 	bufsize = roundup(MAX(sizeof(struct partblock), sizeof(struct rdblock)),
 	    secsize);
-	bp = DKW_MALLOC(bufsize);
+	bp = geteblk(bufsize);
 
 	/*
 	 * find the RDB block
@@ -162,7 +150,8 @@ dkwedge_discover_rdb(struct disk *pdk, s
 		secsize = newsecsize;
 		bufsize = roundup(MAX(sizeof(struct partblock),
 		    sizeof(struct rdblock)), secsize);
-		bp = DKW_REALLOC(bp, bufsize);
+		brelse(bp, 0);
+		bp = geteblk(bufsize);
 	}
 
 	memset(&dkw, 0, sizeof(dkw));
@@ -279,7 +268,7 @@ dkwedge_discover_rdb(struct disk *pdk, s
 	else
 		error = ESRCH;
 done:
-	DKW_FREE(bp);
+	brelse(bp, 0);
 	return error;
 }
 

Index: src/sys/dev/dkwedge/dkwedge_bsdlabel.c
diff -u src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.24 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.25
--- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.24	Tue Jul  9 17:06:46 2019
+++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c	Sat Apr 11 16:00:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_bsdlabel.c,v 1.24 2019/07/09 17:06:46 maxv Exp $	*/
+/*	$NetBSD: dkwedge_bsdlabel.c,v 1.25 2020/04/11 16:00:34 jdolecek 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.24 2019/07/09 17:06:46 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_bsdlabel.c,v 1.25 2020/04/11 16:00:34 jdolecek Exp $");
 
 #include <sys/param.h>
 #ifdef _KERNEL
@@ -89,7 +89,7 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_bsdl
 #include <sys/errno.h>
 #include <sys/disk.h>
 #include <sys/vnode.h>
-#include <sys/malloc.h>
+#include <sys/buf.h>
 
 #include <sys/bootblock.h>
 #include <sys/disklabel.h>
@@ -135,7 +135,7 @@ static const struct disklabel_location {
 typedef struct mbr_args {
 	struct disk	*pdk;
 	struct vnode	*vp;
-	void		*buf;
+	struct buf	*bp;
 	int		error;
 	uint32_t	secsize;
 } mbr_args_t;
@@ -278,7 +278,8 @@ 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, a->secsize);
+	error = dkwedge_read(a->pdk, a->vp, label_sector, a->bp->b_data,
+	    a->secsize);
 	if (error) {
 		aprint_error("%s: unable to read BSD disklabel @ %" PRId64
 		    ", error = %d\n", a->pdk->dk_name, label_sector, error);
@@ -291,12 +292,12 @@ validate_label(mbr_args_t *a, daddr_t la
 	 * consistently in the old code, requiring us to do the search
 	 * in the sector.
 	 */
-	lp = a->buf;
-	lp_lim = (char *)a->buf + a->secsize - DISKLABEL_MINSIZE;
+	lp = a->bp->b_data;
+	lp_lim = (char *)a->bp->b_data + a->secsize - DISKLABEL_MINSIZE;
 	for (;; lp = (void *)((char *)lp + sizeof(uint32_t))) {
 		if ((char *)lp > (char *)lp_lim)
 			return (SCAN_CONTINUE);
-		label_offset = (size_t)((char *)lp - (char *)a->buf);
+		label_offset = (size_t)((char *)lp - (char *)a->bp->b_data);
 		if (lp->d_magic != DISKMAGIC || lp->d_magic2 != DISKMAGIC) {
 			if (lp->d_magic != bswap32(DISKMAGIC) ||
 			    lp->d_magic2 != bswap32(DISKMAGIC))
@@ -311,7 +312,7 @@ validate_label(mbr_args_t *a, daddr_t la
 
 		/* Validate label length. */
 		if ((char *)lp + DISKLABEL_SIZE(npartitions) >
-		    (char *)a->buf + a->secsize) {
+		    (char *)a->bp->b_data + a->secsize) {
 			aprint_error("%s: BSD disklabel @ "
 			    "%" PRId64 "+%zd has bogus partition count (%u)\n",
 			    a->pdk->dk_name, label_sector, label_offset,
@@ -354,7 +355,7 @@ scan_mbr(mbr_args_t *a, int (*actn)(mbr_
 	ext_base = 0;
 	this_ext = 0;
 	for (;;) {
-		a->error = dkwedge_read(a->pdk, a->vp, this_ext, a->buf,
+		a->error = dkwedge_read(a->pdk, a->vp, this_ext, a->bp->b_data,
 					a->secsize);
 		if (a->error) {
 			aprint_error("%s: unable to read MBR @ %u, "
@@ -363,7 +364,7 @@ scan_mbr(mbr_args_t *a, int (*actn)(mbr_
 			return (SCAN_ERROR);
 		}
 
-		mbr = a->buf;
+		mbr = a->bp->b_data;
 		if (mbr->mbr_magic != htole16(MBR_MAGIC))
 			return (SCAN_CONTINUE);
 
@@ -435,14 +436,6 @@ look_netbsd_part(mbr_args_t *a, struct m
 	return (SCAN_CONTINUE);
 }
  
-#ifdef _KERNEL
-#define	DKW_MALLOC(SZ)	malloc((SZ), M_DEVBUF, M_WAITOK)
-#define	DKW_FREE(PTR)	free((PTR), M_DEVBUF)
-#else
-#define	DKW_MALLOC(SZ)	malloc((SZ))
-#define	DKW_FREE(PTR)	free((PTR))
-#endif
-
 static int
 dkwedge_discover_bsdlabel(struct disk *pdk, struct vnode *vp)
 {
@@ -453,7 +446,7 @@ dkwedge_discover_bsdlabel(struct disk *p
 	a.pdk = pdk;
 	a.secsize = DEV_BSIZE << pdk->dk_blkshift;
 	a.vp = vp;
-	a.buf = DKW_MALLOC(a.secsize);
+	a.bp = geteblk(a.secsize);
 	a.error = 0;
 
 	/* MBR search. */
@@ -477,7 +470,7 @@ dkwedge_discover_bsdlabel(struct disk *p
 	/* No NetBSD disklabel found. */
 	a.error = ESRCH;
  out:
-	DKW_FREE(a.buf);
+	brelse(a.bp, 0);
 	return (a.error);
 }
 

Index: src/sys/dev/dkwedge/dkwedge_gpt.c
diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.25 src/sys/dev/dkwedge/dkwedge_gpt.c:1.26
--- src/sys/dev/dkwedge/dkwedge_gpt.c:1.25	Mon Mar 30 08:36:09 2020
+++ src/sys/dev/dkwedge/dkwedge_gpt.c	Sat Apr 11 16:00:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_gpt.c,v 1.25 2020/03/30 08:36:09 wiz Exp $	*/
+/*	$NetBSD: dkwedge_gpt.c,v 1.26 2020/04/11 16:00:34 jdolecek Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.25 2020/03/30 08:36:09 wiz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.26 2020/04/11 16:00:34 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.
 #include <sys/errno.h>
 #include <sys/disk.h>
 #include <sys/vnode.h>
-#include <sys/malloc.h>
+#include <sys/buf.h>
 
 #include <sys/disklabel_gpt.h>
 #include <sys/uuid.h>
@@ -115,7 +115,7 @@ dkwedge_discover_gpt(struct disk *pdk, s
 	static const struct uuid ent_type_unused = GPT_ENT_TYPE_UNUSED;
 	static const char gpt_hdr_sig[] = GPT_HDR_SIG;
 	struct dkwedge_info dkw;
-	void *buf;
+	struct buf *bp;
 	uint32_t secsize;
 	struct gpt_hdr *hdr;
 	struct gpt_ent *ent;
@@ -124,11 +124,11 @@ dkwedge_discover_gpt(struct disk *pdk, s
 	uint32_t gpe_crc;
 	int error;
 	u_int i;
-	size_t r, n;
+	size_t r, n, sz;
 	uint8_t *c;
 
 	secsize = DEV_BSIZE << pdk->dk_blkshift;
-	buf = malloc(secsize, M_DEVBUF, M_WAITOK);
+	bp = geteblk(secsize);
 
 	/*
 	 * Note: We don't bother with a Legacy or Protective MBR
@@ -137,10 +137,11 @@ dkwedge_discover_gpt(struct disk *pdk, s
 	 */
 
 	/* Read in the GPT Header. */
-	error = dkwedge_read(pdk, vp, GPT_HDR_BLKNO << pdk->dk_blkshift, buf, secsize);
+	error = dkwedge_read(pdk, vp, GPT_HDR_BLKNO << pdk->dk_blkshift,
+	    bp->b_data, secsize);
 	if (error)
 		goto out;
-	hdr = buf;
+	hdr = bp->b_data;
 
 	/* Validate it. */
 	if (memcmp(gpt_hdr_sig, hdr->hdr_sig, sizeof(hdr->hdr_sig)) != 0) {
@@ -201,10 +202,12 @@ dkwedge_discover_gpt(struct disk *pdk, s
 		goto out;
 	}
 
-	free(buf, M_DEVBUF);
-	buf = malloc(roundup(entries * entsz, secsize), M_DEVBUF, M_WAITOK);
-	error = dkwedge_read(pdk, vp, lba_table << pdk->dk_blkshift, buf,
-			     roundup(entries * entsz, secsize));
+	brelse(bp, 0);
+
+	sz = roundup(entries * entsz, secsize);
+	bp = geteblk(sz);
+	error = dkwedge_read(pdk, vp, lba_table << pdk->dk_blkshift,
+	    bp->b_data, sz);
 	if (error) {
 		/* XXX Should check alternate location. */
 		aprint_error("%s: unable to read GPT partition array, "
@@ -212,7 +215,7 @@ dkwedge_discover_gpt(struct disk *pdk, s
 		goto out;
 	}
 
-	if (crc32(0, buf, entries * entsz) != gpe_crc) {
+	if (crc32(0, bp->b_data, entries * entsz) != gpe_crc) {
 		/* XXX Should check alternate location. */
 		aprint_error("%s: bad GPT partition array CRC\n",
 		    pdk->dk_name);
@@ -229,7 +232,7 @@ dkwedge_discover_gpt(struct disk *pdk, s
 		int j;
 		char ptype_guid_str[UUID_STR_LEN], ent_guid_str[UUID_STR_LEN];
 
-		ent = (struct gpt_ent *)((char *)buf + (i * entsz));
+		ent = (struct gpt_ent *)((char *)bp->b_data + (i * entsz));
 
 		uuid_dec_le(ent->ent_type, &ptype_guid);
 		if (memcmp(&ptype_guid, &ent_type_unused,
@@ -297,7 +300,7 @@ dkwedge_discover_gpt(struct disk *pdk, s
 	error = 0;
 
  out:
-	free(buf, M_DEVBUF);
+	brelse(bp, 0);
 	return (error);
 }
 

Index: src/sys/dev/dkwedge/dkwedge_mbr.c
diff -u src/sys/dev/dkwedge/dkwedge_mbr.c:1.11 src/sys/dev/dkwedge/dkwedge_mbr.c:1.12
--- src/sys/dev/dkwedge/dkwedge_mbr.c:1.11	Tue Jul  9 17:06:46 2019
+++ src/sys/dev/dkwedge/dkwedge_mbr.c	Sat Apr 11 16:00:34 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkwedge_mbr.c,v 1.11 2019/07/09 17:06:46 maxv Exp $	*/
+/*	$NetBSD: dkwedge_mbr.c,v 1.12 2020/04/11 16:00:34 jdolecek Exp $	*/
 
 /*-
  * Copyright (c) 2004 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.c,v 1.11 2019/07/09 17:06:46 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.c,v 1.12 2020/04/11 16:00:34 jdolecek Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -42,7 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.
 #include <sys/errno.h>
 #include <sys/disk.h>
 #include <sys/vnode.h>
-#include <sys/malloc.h>
+#include <sys/buf.h>
 
 #include <sys/bootblock.h>
 #include <sys/disklabel.h>
@@ -50,7 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.
 typedef struct mbr_args {
 	struct disk	*pdk;
 	struct vnode	*vp;
-	void		*buf;
+	struct buf	*bp;
 	int		error;
 	uint32_t	secsize;
 	int		mbr_count;
@@ -88,7 +88,7 @@ getparts(mbr_args_t *a, uint32_t off, ui
 	const char *ptype;
 	int i, error;
 
-	error = dkwedge_read(a->pdk, a->vp, off, a->buf, a->secsize);
+	error = dkwedge_read(a->pdk, a->vp, off, a->bp->b_data, a->secsize);
 	if (error) {
 		aprint_error("%s: unable to read MBR @ %u/%u, "
 		    "error = %d\n", a->pdk->dk_name, off, a->secsize, a->error);
@@ -96,7 +96,7 @@ getparts(mbr_args_t *a, uint32_t off, ui
 		return;
 	}
 
-	mbr = a->buf;
+	mbr = a->bp->b_data;
 	if (mbr->mbr_magic != htole16(MBR_MAGIC))
 		return;
 
@@ -175,10 +175,11 @@ dkwedge_discover_mbr(struct disk *pdk, s
 {
 	mbr_args_t a;
 
+	memset(&a, 0, sizeof(a));
 	a.pdk = pdk;
 	a.secsize = DEV_BSIZE << pdk->dk_blkshift;  
 	a.vp = vp;
-	a.buf = malloc(a.secsize, M_DEVBUF, M_WAITOK);
+	a.bp = geteblk(a.secsize);
 	a.error = 0;
 	a.mbr_count = 0;
 
@@ -188,7 +189,7 @@ dkwedge_discover_mbr(struct disk *pdk, s
 	else if (a.error == 0)
 		a.error = ESRCH;	/* no MBRs found */
 
-	free(a.buf, M_DEVBUF);
+	brelse(a.bp, 0);
 	return (a.error);
 }
 

Reply via email to