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);
}