Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/dkwedge allocate buffer for disk I/O via geteblk() i...



details:   https://anonhg.NetBSD.org/src/rev/84b62c2f8325
branches:  trunk
changeset: 1009062:84b62c2f8325
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Sat Apr 11 16:00:34 2020 +0000

description:
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

diffstat:

 sys/dev/dkwedge/dkwedge_apple.c    |  30 +++++++++++-------------------
 sys/dev/dkwedge/dkwedge_bsdlabel.c |  35 ++++++++++++++---------------------
 sys/dev/dkwedge/dkwedge_gpt.c      |  33 ++++++++++++++++++---------------
 sys/dev/dkwedge/dkwedge_mbr.c      |  17 +++++++++--------
 sys/dev/dkwedge/dkwedge_rdb.c      |  27 ++++++++-------------------
 5 files changed, 60 insertions(+), 82 deletions(-)

diffs (truncated from 481 to 300 lines):

diff -r 4578d6c1ba25 -r 84b62c2f8325 sys/dev/dkwedge/dkwedge_apple.c
--- a/sys/dev/dkwedge/dkwedge_apple.c   Sat Apr 11 14:48:19 2020 +0000
+++ b/sys/dev/dkwedge/dkwedge_apple.c   Sat Apr 11 16:00:34 2020 +0000
@@ -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 @@
 #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 @@
 
 #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 @@
 {
        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 @@
                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 @@
        }
 
 out:
-       DKW_FREE(buf);
+       brelse(bp, 0);
        DPRINTF("%s: return %d\n", __func__, error);
        return error;
 }
diff -r 4578d6c1ba25 -r 84b62c2f8325 sys/dev/dkwedge/dkwedge_bsdlabel.c
--- a/sys/dev/dkwedge/dkwedge_bsdlabel.c        Sat Apr 11 14:48:19 2020 +0000
+++ b/sys/dev/dkwedge/dkwedge_bsdlabel.c        Sat Apr 11 16:00:34 2020 +0000
@@ -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 @@
 #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 @@
 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 @@
        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 @@
         * 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 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 @@
        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 @@
                        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 @@
        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 @@
        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 @@
        /* No NetBSD disklabel found. */
        a.error = ESRCH;
  out:
-       DKW_FREE(a.buf);
+       brelse(a.bp, 0);
        return (a.error);
 }
 
diff -r 4578d6c1ba25 -r 84b62c2f8325 sys/dev/dkwedge/dkwedge_gpt.c
--- a/sys/dev/dkwedge/dkwedge_gpt.c     Sat Apr 11 14:48:19 2020 +0000
+++ b/sys/dev/dkwedge/dkwedge_gpt.c     Sat Apr 11 16:00:34 2020 +0000
@@ -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 @@
 #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 @@
        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 @@
        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 @@
         */
 
        /* 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 @@
                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 @@
                goto out;
        }
 



Home | Main Index | Thread Index | Old Index