CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Wed Aug 4 21:44:42 UTC 2021 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Swap and Dump uses DEV_BSIZE units. Translate from device sectors like regular I/O (strategy). To generate a diff of this commit: cvs rdiff -u -r1.105 -r1.106 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.105 src/sys/dev/dkwedge/dk.c:1.106 --- src/sys/dev/dkwedge/dk.c:1.105 Wed Jun 2 17:56:40 2021 +++ src/sys/dev/dkwedge/dk.c Wed Aug 4 21:44:41 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.106 2021/08/04 21:44:41 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.106 2021/08/04 21:44:41 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1639,6 +1639,7 @@ static int dksize(dev_t dev) { struct dkwedge_softc *sc = dkwedge_lookup(dev); + uint64_t p_size; int rv = -1; if (sc == NULL) @@ -1651,12 +1652,13 @@ dksize(dev_t dev) /* Our content type is static, no need to open the device. */ + p_size = sc->sc_size << sc->sc_parent->dk_blkshift; if (strcmp(sc->sc_ptype, DKW_PTYPE_SWAP) == 0) { /* Saturate if we are larger than INT_MAX. */ - if (sc->sc_size > INT_MAX) + if (p_size > INT_MAX) rv = INT_MAX; else - rv = (int) sc->sc_size; + rv = (int) p_size; } mutex_exit(>sc_parent->dk_rawlock); @@ -1675,6 +1677,7 @@ dkdump(dev_t dev, daddr_t blkno, void *v { struct dkwedge_softc *sc = dkwedge_lookup(dev); const struct bdevsw *bdev; + uint64_t p_size, p_offset; int rv = 0; if (sc == NULL) @@ -1697,16 +1700,20 @@ dkdump(dev_t dev, daddr_t blkno, void *v rv = EINVAL; goto out; } - if (blkno < 0 || blkno + size / DEV_BSIZE > sc->sc_size) { + + p_offset = sc->sc_offset << sc->sc_parent->dk_blkshift; + p_size = sc->sc_size << sc->sc_parent->dk_blkshift; + + if (blkno < 0 || blkno + size / DEV_BSIZE > p_size) { printf("%s: blkno (%" PRIu64 ") + size / DEV_BSIZE (%zu) > " - "sc->sc_size (%" PRIu64 ")\n", __func__, blkno, - size / DEV_BSIZE, sc->sc_size); + "p_size (%" PRIu64 ")\n", __func__, blkno, + size / DEV_BSIZE, p_size); rv = EINVAL; goto out; } bdev = bdevsw_lookup(sc->sc_pdev); - rv = (*bdev->d_dump)(sc->sc_pdev, blkno + sc->sc_offset, va, size); + rv = (*bdev->d_dump)(sc->sc_pdev, blkno + p_offset, va, size); out: mutex_exit(>sc_parent->dk_rawlock);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Wed Jun 2 17:56:41 UTC 2021 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Clear sc_mode only on last close. To generate a diff of this commit: cvs rdiff -u -r1.104 -r1.105 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.104 src/sys/dev/dkwedge/dk.c:1.105 --- src/sys/dev/dkwedge/dk.c:1.104 Wed Jun 2 15:59:08 2021 +++ src/sys/dev/dkwedge/dk.c Wed Jun 2 17:56:40 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.104 2021/06/02 15:59:08 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.104 2021/06/02 15:59:08 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.105 2021/06/02 17:56:40 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1221,6 +1221,7 @@ dklastclose(struct dkwedge_softc *sc) KASSERT(sc->sc_parent->dk_rawvp != NULL); vp = sc->sc_parent->dk_rawvp; sc->sc_parent->dk_rawvp = NULL; + sc->sc_mode = 0; } } @@ -1264,9 +1265,7 @@ dkclose(dev_t dev, int flags, int fmt, s if (sc->sc_dk.dk_openmask == 0) { error = dklastclose(sc); /* releases locks */ - sc->sc_mode = 0; } else { - sc->sc_mode = 0; mutex_exit(>sc_parent->dk_rawlock); mutex_exit(>sc_dk.dk_openlock); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Wed Jun 2 15:59:08 UTC 2021 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Copy mode of open wedges with the same parent and validate it. Remove race on mode value when closing. To generate a diff of this commit: cvs rdiff -u -r1.103 -r1.104 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.103 src/sys/dev/dkwedge/dk.c:1.104 --- src/sys/dev/dkwedge/dk.c:1.103 Sat May 22 13:43:50 2021 +++ src/sys/dev/dkwedge/dk.c Wed Jun 2 15:59:08 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.103 2021/05/22 13:43:50 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.104 2021/06/02 15:59:08 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.103 2021/05/22 13:43:50 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.104 2021/06/02 15:59:08 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1137,6 +1137,7 @@ static int dkopen(dev_t dev, int flags, int fmt, struct lwp *l) { struct dkwedge_softc *sc = dkwedge_lookup(dev); + struct dkwedge_softc *nsc; struct vnode *vp; int error = 0; int mode; @@ -1169,13 +1170,24 @@ dkopen(dev_t dev, int flags, int fmt, st } if (error) goto popen_fail; - /* remember open mode */ - sc->sc_mode = mode; sc->sc_parent->dk_rawvp = vp; + } else { + /* + * Retrieve mode from an already opened wedge. + */ + mode = 0; + LIST_FOREACH(nsc, >sc_parent->dk_wedges, sc_plink) { +if (nsc == sc || nsc->sc_dk.dk_openmask == 0) + continue; +mode = nsc->sc_mode; +break; + } } + sc->sc_mode = mode; sc->sc_parent->dk_rawopens++; - } else if (flags & ~sc->sc_mode & FWRITE) { - /* parent is opened read-only, cannot open read-write */ + } + KASSERT(sc->sc_mode != 0); + if (flags & ~sc->sc_mode & FWRITE) { error = EROFS; goto popen_fail; } @@ -1199,7 +1211,9 @@ static int dklastclose(struct dkwedge_softc *sc) { struct vnode *vp; - int error = 0; + int error = 0, mode; + + mode = sc->sc_mode; vp = NULL; if (sc->sc_parent->dk_rawopens > 0) { @@ -1214,7 +1228,7 @@ dklastclose(struct dkwedge_softc *sc) mutex_exit(>sc_dk.dk_openlock); if (vp) { - dk_close_parent(vp, sc->sc_mode); + dk_close_parent(vp, mode); } return error; @@ -1248,9 +1262,11 @@ dkclose(dev_t dev, int flags, int fmt, s sc->sc_dk.dk_openmask = sc->sc_dk.dk_copenmask | sc->sc_dk.dk_bopenmask; - if (sc->sc_dk.dk_openmask == 0) + if (sc->sc_dk.dk_openmask == 0) { error = dklastclose(sc); /* releases locks */ - else { + sc->sc_mode = 0; + } else { + sc->sc_mode = 0; mutex_exit(>sc_parent->dk_rawlock); mutex_exit(>sc_dk.dk_openlock); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat May 22 13:43:50 UTC 2021 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Handle read-only parent devices. Currently this only affects xbd(4). Other disk drivers succeed opening read-only disks as read-write and only fail subsequent write requests. To generate a diff of this commit: cvs rdiff -u -r1.102 -r1.103 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.102 src/sys/dev/dkwedge/dk.c:1.103 --- src/sys/dev/dkwedge/dk.c:1.102 Tue Oct 6 15:05:54 2020 +++ src/sys/dev/dkwedge/dk.c Sat May 22 13:43:50 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.102 2020/10/06 15:05:54 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.103 2021/05/22 13:43:50 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.102 2020/10/06 15:05:54 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.103 2021/05/22 13:43:50 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -90,6 +90,7 @@ struct dkwedge_softc { kcondvar_t sc_dkdrn; u_int sc_iopend; /* I/Os pending */ int sc_flags; /* flags (sc_iolock) */ + int sc_mode; /* parent open mode */ }; #define DK_F_WAIT_DRAIN 0x0001 /* waiting for I/O to drain */ @@ -1138,6 +1139,7 @@ dkopen(dev_t dev, int flags, int fmt, st struct dkwedge_softc *sc = dkwedge_lookup(dev); struct vnode *vp; int error = 0; + int mode; if (sc == NULL) return (ENODEV); @@ -1155,12 +1157,27 @@ dkopen(dev_t dev, int flags, int fmt, st if (sc->sc_dk.dk_openmask == 0) { if (sc->sc_parent->dk_rawopens == 0) { KASSERT(sc->sc_parent->dk_rawvp == NULL); - error = dk_open_parent(sc->sc_pdev, FREAD | FWRITE, ); + /* + * Try open read-write. If this fails for EROFS + * and wedge is read-only, retry to open read-only. + */ + mode = FREAD | FWRITE; + error = dk_open_parent(sc->sc_pdev, mode, ); + if (error == EROFS && (flags & FWRITE) == 0) { +mode &= ~FWRITE; +error = dk_open_parent(sc->sc_pdev, mode, ); + } if (error) goto popen_fail; + /* remember open mode */ + sc->sc_mode = mode; sc->sc_parent->dk_rawvp = vp; } sc->sc_parent->dk_rawopens++; + } else if (flags & ~sc->sc_mode & FWRITE) { + /* parent is opened read-only, cannot open read-write */ + error = EROFS; + goto popen_fail; } if (fmt == S_IFCHR) sc->sc_dk.dk_copenmask |= 1; @@ -1197,7 +1214,7 @@ dklastclose(struct dkwedge_softc *sc) mutex_exit(>sc_dk.dk_openlock); if (vp) { - dk_close_parent(vp, FREAD | FWRITE); + dk_close_parent(vp, sc->sc_mode); } return error;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Tue Oct 6 15:05:54 UTC 2020 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Check dkdriver before calling a driver function. To generate a diff of this commit: cvs rdiff -u -r1.101 -r1.102 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.101 src/sys/dev/dkwedge/dk.c:1.102 --- src/sys/dev/dkwedge/dk.c:1.101 Sun May 24 14:40:21 2020 +++ src/sys/dev/dkwedge/dk.c Tue Oct 6 15:05:54 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.101 2020/05/24 14:40:21 jmcneill Exp $ */ +/* $NetBSD: dk.c,v 1.102 2020/10/06 15:05:54 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.101 2020/05/24 14:40:21 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.102 2020/10/06 15:05:54 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1441,7 +1441,10 @@ dkminphys(struct buf *bp) dev = bp->b_dev; bp->b_dev = sc->sc_pdev; - (*sc->sc_parent->dk_driver->d_minphys)(bp); + if (sc->sc_parent->dk_driver && sc->sc_parent->dk_driver->d_minphys) + (*sc->sc_parent->dk_driver->d_minphys)(bp); + else + minphys(bp); bp->b_dev = dev; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jmcneill Date: Sun May 24 14:40:21 UTC 2020 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: dkwedge_add: Allow for expanding the size of an existing wedge without having to delete it first, provided that no other parameters have changed. To generate a diff of this commit: cvs rdiff -u -r1.100 -r1.101 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.100 src/sys/dev/dkwedge/dk.c:1.101 --- src/sys/dev/dkwedge/dk.c:1.100 Mon Mar 2 16:01:56 2020 +++ src/sys/dev/dkwedge/dk.c Sun May 24 14:40:21 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.100 2020/03/02 16:01:56 riastradh Exp $ */ +/* $NetBSD: dk.c,v 1.101 2020/05/24 14:40:21 jmcneill Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.100 2020/03/02 16:01:56 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.101 2020/05/24 14:40:21 jmcneill Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -310,6 +310,34 @@ dkwedge_add(struct dkwedge_info *dkw) if (dkw->dkw_offset < 0) return (EINVAL); + /* + * Check for an existing wedge at the same disk offset. Allow + * updating a wedge if the only change is the size, and the new + * size is larger than the old. + */ + sc = NULL; + mutex_enter(>dk_openlock); + LIST_FOREACH(lsc, >dk_wedges, sc_plink) { + if (lsc->sc_offset != dkw->dkw_offset) + continue; + if (strcmp(lsc->sc_wname, dkw->dkw_wname) != 0) + break; + if (strcmp(lsc->sc_ptype, dkw->dkw_ptype) != 0) + break; + if (lsc->sc_size > dkw->dkw_size) + break; + + sc = lsc; + sc->sc_size = dkw->dkw_size; + dk_set_geometry(sc, pdk); + + break; + } + mutex_exit(>dk_openlock); + + if (sc != NULL) + goto announce; + sc = malloc(sizeof(*sc), M_DKWEDGE, M_WAITOK|M_ZERO); sc->sc_state = DKW_STATE_LARVAL; sc->sc_parent = pdk; @@ -475,6 +503,7 @@ dkwedge_add(struct dkwedge_info *dkw) /* Disk wedge is ready for use! */ sc->sc_state = DKW_STATE_RUNNING; +announce: /* Announce our arrival. */ aprint_normal( "%s at %s: \"%s\", %"PRIu64" blocks at %"PRId64", type: %s\n",
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: rin Date: Sun May 3 06:30:45 UTC 2020 Modified Files: src/sys/dev/dkwedge: dkwedge_rdb.c Log Message: Fix fallout of migration from malloc to geteblk. - Use bp->b_data instead of bp itself. - When buffer is not large enough, start all over; brelse + geteblk does not apparently behave like realloc. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/dev/dkwedge/dkwedge_rdb.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_rdb.c diff -u src/sys/dev/dkwedge/dkwedge_rdb.c:1.6 src/sys/dev/dkwedge/dkwedge_rdb.c:1.7 --- src/sys/dev/dkwedge/dkwedge_rdb.c:1.6 Sat Apr 11 16:00:34 2020 +++ src/sys/dev/dkwedge/dkwedge_rdb.c Sun May 3 06:30:45 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_rdb.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $ */ +/* $NetBSD: dkwedge_rdb.c,v 1.7 2020/05/03 06:30:45 rin Exp $ */ /* * Adapted from arch/amiga/amiga/disksubr.c: @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.6 2020/04/11 16:00:34 jdolecek Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.7 2020/05/03 06:30:45 rin Exp $"); #include #include @@ -116,19 +116,21 @@ dkwedge_discover_rdb(struct disk *pdk, s secsize); bp = geteblk(bufsize); +retry: /* * find the RDB block * XXX bsdlabel should be detected by the other method */ for (nextb = 0; nextb < RDB_MAXBLOCKS; nextb++) { - error = dkwedge_read(pdk, vp, ADJUST_NR(nextb), bp, bufsize); + error = dkwedge_read(pdk, vp, ADJUST_NR(nextb), bp->b_data, + bufsize); if (error) { aprint_error("%s: unable to read RDB @ %u, " "error = %d\n", pdk->dk_name, nextb, error); error = ESRCH; goto done; } - rbp = (struct rdblock *)bp; + rbp = (struct rdblock *)bp->b_data; if (be32toh(rbp->id) == RDBLOCK_ID) { if (rdbchksum(rbp) == 0) break; @@ -152,6 +154,7 @@ dkwedge_discover_rdb(struct disk *pdk, s sizeof(struct rdblock)), secsize); brelse(bp, 0); bp = geteblk(bufsize); + goto retry; } memset(, 0, sizeof(dkw)); @@ -164,14 +167,15 @@ dkwedge_discover_rdb(struct disk *pdk, s */ for (nextb = be32toh(rbp->partbhead); nextb != RDBNULL; nextb = be32toh(pbp->next)) { - error = dkwedge_read(pdk, vp, ADJUST_NR(nextb), bp, bufsize); + error = dkwedge_read(pdk, vp, ADJUST_NR(nextb), bp->b_data, + bufsize); if (error) { aprint_error("%s: unable to read RDB partition block @ " "%u, error = %d\n", pdk->dk_name, nextb, error); error = ESRCH; goto done; } - pbp = (struct partblock *)bp; + pbp = (struct partblock *)bp->b_data; if (be32toh(pbp->id) != PARTBLOCK_ID) { aprint_error(
CVS commit: src/sys/dev/dkwedge
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 -__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 #ifdef _KERNEL @@ -44,8 +44,8 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_appl #include #include #include -#include #include +#include #include @@ -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 -__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 #include #include #include -#include -#ifdef _KERNEL #include -#endif +#include /* * 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
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: riastradh Date: Sun Mar 1 03:19:46 UTC 2020 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Allow dumping to cgd(4) on a dk(4). (Technically this also allows dumping to a dk(4) on which there happens to be a cgd(4) configured, but I'm not sure how to distinguish that case here. So don't do that!) To generate a diff of this commit: cvs rdiff -u -r1.98 -r1.99 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.98 src/sys/dev/dkwedge/dk.c:1.99 --- src/sys/dev/dkwedge/dk.c:1.98 Fri Feb 28 06:01:23 2020 +++ src/sys/dev/dkwedge/dk.c Sun Mar 1 03:19:46 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.98 2020/02/28 06:01:23 yamaguchi Exp $ */ +/* $NetBSD: dk.c,v 1.99 2020/03/01 03:19:46 riastradh Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.98 2020/02/28 06:01:23 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.99 2020/03/01 03:19:46 riastradh Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1607,7 +1607,8 @@ dkdump(dev_t dev, daddr_t blkno, void *v /* Our content type is static, no need to open the device. */ if (strcmp(sc->sc_ptype, DKW_PTYPE_SWAP) != 0 && - strcmp(sc->sc_ptype, DKW_PTYPE_RAID) != 0) { + strcmp(sc->sc_ptype, DKW_PTYPE_RAID) != 0 && + strcmp(sc->sc_ptype, DKW_PTYPE_CGD) != 0) { rv = ENXIO; goto out; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: yamaguchi Date: Fri Feb 28 06:01:23 UTC 2020 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Update sc->sc_parent->dk_rawvp while the lock named dk_rawlock held to prevent a race condition Fixes PR kern/55026 OKed by mlelstv@, thanks To generate a diff of this commit: cvs rdiff -u -r1.97 -r1.98 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.97 src/sys/dev/dkwedge/dk.c:1.98 --- src/sys/dev/dkwedge/dk.c:1.97 Sat May 12 10:33:06 2018 +++ src/sys/dev/dkwedge/dk.c Fri Feb 28 06:01:23 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.97 2018/05/12 10:33:06 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.98 2020/02/28 06:01:23 yamaguchi Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.97 2018/05/12 10:33:06 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.98 2020/02/28 06:01:23 yamaguchi Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1152,21 +1152,23 @@ dkopen(dev_t dev, int flags, int fmt, st static int dklastclose(struct dkwedge_softc *sc) { - int error = 0, doclose; + struct vnode *vp; + int error = 0; - doclose = 0; + vp = NULL; if (sc->sc_parent->dk_rawopens > 0) { - if (--sc->sc_parent->dk_rawopens == 0) - doclose = 1; + if (--sc->sc_parent->dk_rawopens == 0) { + KASSERT(sc->sc_parent->dk_rawvp != NULL); + vp = sc->sc_parent->dk_rawvp; + sc->sc_parent->dk_rawvp = NULL; + } } mutex_exit(>sc_parent->dk_rawlock); mutex_exit(>sc_dk.dk_openlock); - if (doclose) { - KASSERT(sc->sc_parent->dk_rawvp != NULL); - dk_close_parent(sc->sc_parent->dk_rawvp, FREAD | FWRITE); - sc->sc_parent->dk_rawvp = NULL; + if (vp) { + dk_close_parent(vp, FREAD | FWRITE); } return error;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Wed Apr 10 15:19:15 UTC 2019 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: add types for windows and linux partitions. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.21 src/sys/dev/dkwedge/dkwedge_gpt.c:1.22 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.21 Tue Nov 6 04:04:33 2018 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Wed Apr 10 15:19:15 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.21 2018/11/06 04:04:33 mrg Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.22 2019/04/10 15:19:15 mlelstv Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.21 2018/11/06 04:04:33 mrg Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.22 2019/04/10 15:19:15 mlelstv Exp $"); #include #include @@ -76,6 +76,8 @@ static const struct { { GPT_ENT_TYPE_VMWARE_VMKCORE, DKW_PTYPE_VMKCORE }, { GPT_ENT_TYPE_VMWARE_VMFS, DKW_PTYPE_VMFS }, { GPT_ENT_TYPE_VMWARE_RESERVED, DKW_PTYPE_VMWRESV }, + { GPT_ENT_TYPE_MS_BASIC_DATA, DKW_PTYPE_NTFS }, + { GPT_ENT_TYPE_LINUX_DATA, DKW_PTYPE_EXT2FS }, }; static const char *
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Thu Sep 7 10:18:26 UTC 2017 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: use arraycount. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.19 src/sys/dev/dkwedge/dkwedge_gpt.c:1.20 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.19 Wed Sep 6 14:21:17 2017 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Thu Sep 7 06:18:26 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.19 2017/09/06 18:21:17 christos Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.20 2017/09/07 10:18:26 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.19 2017/09/06 18:21:17 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.20 2017/09/07 10:18:26 christos Exp $"); #include #include @@ -252,7 +252,7 @@ dkwedge_discover_gpt(struct disk *pdk, s else { c = dkw.dkw_wname; r = sizeof(dkw.dkw_wname) - 1; - for (j = 0; j < sizeof(ent->ent_name) + for (j = 0; j < __arraycount(ent->ent_name) && ent->ent_name[j] != 0x; j++) { n = wput_utf8(c, r, le16toh(ent->ent_name[j])); if (n == 0)
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Wed Sep 6 18:21:17 UTC 2017 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: PR/52522: ent_name is not necessarily 0 terminated, so check bounds. XXX: pullup-8 To generate a diff of this commit: cvs rdiff -u -r1.18 -r1.19 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.18 src/sys/dev/dkwedge/dkwedge_gpt.c:1.19 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.18 Wed Jan 18 19:44:40 2017 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Wed Sep 6 14:21:17 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.18 2017/01/19 00:44:40 maya Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.19 2017/09/06 18:21:17 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.18 2017/01/19 00:44:40 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.19 2017/09/06 18:21:17 christos Exp $"); #include #include @@ -252,7 +252,8 @@ dkwedge_discover_gpt(struct disk *pdk, s else { c = dkw.dkw_wname; r = sizeof(dkw.dkw_wname) - 1; - for (j = 0; ent->ent_name[j] != 0x; j++) { + for (j = 0; j < sizeof(ent->ent_name) + && ent->ent_name[j] != 0x; j++) { n = wput_utf8(c, r, le16toh(ent->ent_name[j])); if (n == 0) break;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: rin Date: Tue Feb 28 04:47:41 UTC 2017 Modified Files: src/sys/dev/dkwedge: dkwedge_rdb.c Log Message: remove unnecessary substitution. no functional changes. To generate a diff of this commit: cvs rdiff -u -r1.3 -r1.4 src/sys/dev/dkwedge/dkwedge_rdb.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_rdb.c diff -u src/sys/dev/dkwedge/dkwedge_rdb.c:1.3 src/sys/dev/dkwedge/dkwedge_rdb.c:1.4 --- src/sys/dev/dkwedge/dkwedge_rdb.c:1.3 Tue Feb 28 04:46:02 2017 +++ src/sys/dev/dkwedge/dkwedge_rdb.c Tue Feb 28 04:47:41 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_rdb.c,v 1.3 2017/02/28 04:46:02 rin Exp $ */ +/* $NetBSD: dkwedge_rdb.c,v 1.4 2017/02/28 04:47:41 rin Exp $ */ /* * Adapted from arch/amiga/amiga/disksubr.c: @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.3 2017/02/28 04:46:02 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.4 2017/02/28 04:47:41 rin Exp $"); #include #include @@ -123,7 +123,7 @@ dkwedge_discover_rdb(struct disk *pdk, s unsigned char archtype; bool found, root, swap; - secsize = bufsize = DEV_BSIZE << pdk->dk_blkshift; + secsize = DEV_BSIZE << pdk->dk_blkshift; bufsize = roundup(MAX(sizeof(struct partblock), sizeof(struct rdblock)), secsize); bp = DKW_MALLOC(bufsize);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: rin Date: Tue Feb 28 04:46:02 UTC 2017 Modified Files: src/sys/dev/dkwedge: dkwedge_rdb.c Log Message: determine the buffer size by roundup(9) To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/dev/dkwedge/dkwedge_rdb.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_rdb.c diff -u src/sys/dev/dkwedge/dkwedge_rdb.c:1.2 src/sys/dev/dkwedge/dkwedge_rdb.c:1.3 --- src/sys/dev/dkwedge/dkwedge_rdb.c:1.2 Tue Feb 28 04:39:58 2017 +++ src/sys/dev/dkwedge/dkwedge_rdb.c Tue Feb 28 04:46:02 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_rdb.c,v 1.2 2017/02/28 04:39:58 rin Exp $ */ +/* $NetBSD: dkwedge_rdb.c,v 1.3 2017/02/28 04:46:02 rin Exp $ */ /* * Adapted from arch/amiga/amiga/disksubr.c: @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.2 2017/02/28 04:39:58 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.3 2017/02/28 04:46:02 rin Exp $"); #include #include @@ -124,9 +124,8 @@ dkwedge_discover_rdb(struct disk *pdk, s bool found, root, swap; secsize = bufsize = DEV_BSIZE << pdk->dk_blkshift; - while (bufsize < sizeof(struct partblock) || - bufsize < sizeof(struct rdblock)) - bufsize *= 2; + bufsize = roundup(MAX(sizeof(struct partblock), sizeof(struct rdblock)), + secsize); bp = DKW_MALLOC(bufsize); /* @@ -160,10 +159,9 @@ dkwedge_discover_rdb(struct disk *pdk, s if (secsize != newsecsize) { aprint_verbose("secsize changed from %u to %u\n", secsize, newsecsize); - secsize = bufsize = newsecsize; - while (bufsize < sizeof(struct partblock) || - bufsize < sizeof(struct rdblock)) - bufsize *= 2; + secsize = newsecsize; + bufsize = roundup(MAX(sizeof(struct partblock), + sizeof(struct rdblock)), secsize); bp = DKW_REALLOC(bp, bufsize); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: rin Date: Tue Feb 28 04:39:58 UTC 2017 Modified Files: src/sys/dev/dkwedge: dkwedge_rdb.c Log Message: Remove PARANOID macro; we should always update secsize if necessary. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/dkwedge/dkwedge_rdb.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_rdb.c diff -u src/sys/dev/dkwedge/dkwedge_rdb.c:1.1 src/sys/dev/dkwedge/dkwedge_rdb.c:1.2 --- src/sys/dev/dkwedge/dkwedge_rdb.c:1.1 Sun Feb 26 11:56:49 2017 +++ src/sys/dev/dkwedge/dkwedge_rdb.c Tue Feb 28 04:39:58 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_rdb.c,v 1.1 2017/02/26 11:56:49 rin Exp $ */ +/* $NetBSD: dkwedge_rdb.c,v 1.2 2017/02/28 04:39:58 rin Exp $ */ /* * Adapted from arch/amiga/amiga/disksubr.c: @@ -68,7 +68,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.1 2017/02/26 11:56:49 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb.c,v 1.2 2017/02/28 04:39:58 rin Exp $"); #include #include @@ -96,9 +96,6 @@ __KERNEL_RCSID(0, "$NetBSD: dkwedge_rdb. #define ADJUST_NR(x) (x) #endif -/* XXX */ -#define PARANOID - #ifdef _KERNEL #define DKW_MALLOC(SZ) malloc((SZ), M_DEVBUF, M_WAITOK) #define DKW_FREE(PTR) free((PTR), M_DEVBUF) @@ -121,7 +118,7 @@ dkwedge_discover_rdb(struct disk *pdk, s struct rdblock *rbp; void *bp; int error; - unsigned blk_per_cyl, bufsize, nextb, secsize, tabsize; + unsigned blk_per_cyl, bufsize, newsecsize, nextb, secsize, tabsize; const char *ptype; unsigned char archtype; bool found, root, swap; @@ -159,8 +156,7 @@ dkwedge_discover_rdb(struct disk *pdk, s goto done; } -#ifdef PARANOID - unsigned newsecsize = be32toh(rbp->nbytes); + newsecsize = be32toh(rbp->nbytes); if (secsize != newsecsize) { aprint_verbose("secsize changed from %u to %u\n", secsize, newsecsize); @@ -170,7 +166,6 @@ dkwedge_discover_rdb(struct disk *pdk, s bufsize *= 2; bp = DKW_REALLOC(bp, bufsize); } -#endif strlcpy(dkw.dkw_parent, pdk->dk_name, sizeof(dkw.dkw_parent));
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jdolecek Date: Mon Feb 27 21:27:07 UTC 2017 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: pass also DIOCGCACHE to underlying device, so that upper layers would be able to get the device cache properties without knowing the topology; while here also pass down DIOCGSTRATEGY for neater dkctl(8) output To generate a diff of this commit: cvs rdiff -u -r1.94 -r1.95 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.94 src/sys/dev/dkwedge/dk.c:1.95 --- src/sys/dev/dkwedge/dk.c:1.94 Thu Jan 19 00:44:40 2017 +++ src/sys/dev/dkwedge/dk.c Mon Feb 27 21:27:07 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.94 2017/01/19 00:44:40 maya Exp $ */ +/* $NetBSD: dk.c,v 1.95 2017/02/27 21:27:07 jdolecek Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.94 2017/01/19 00:44:40 maya Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.95 2017/02/27 21:27:07 jdolecek Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1478,16 +1478,10 @@ dkioctl(dev_t dev, u_long cmd, void *dat error = 0; switch (cmd) { + case DIOCGSTRATEGY: + case DIOCGCACHE: case DIOCCACHESYNC: - /* - * XXX Do we really need to care about having a writable - * file descriptor here? - */ - if ((flag & FWRITE) == 0) - error = EBADF; - else - error = VOP_IOCTL(sc->sc_parent->dk_rawvp, - cmd, data, flag, + error = VOP_IOCTL(sc->sc_parent->dk_rawvp, cmd, data, flag, l != NULL ? l->l_cred : NOCRED); break; case DIOCGWEDGEINFO:
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: maya Date: Thu Jan 19 00:44:40 UTC 2017 Modified Files: src/sys/dev/dkwedge: dk.c dkwedge_apple.c dkwedge_gpt.c dkwedge_mbr.c Log Message: use a bounded copy. NFCI To generate a diff of this commit: cvs rdiff -u -r1.93 -r1.94 src/sys/dev/dkwedge/dk.c cvs rdiff -u -r1.2 -r1.3 src/sys/dev/dkwedge/dkwedge_apple.c cvs rdiff -u -r1.17 -r1.18 src/sys/dev/dkwedge/dkwedge_gpt.c cvs rdiff -u -r1.9 -r1.10 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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.93 src/sys/dev/dkwedge/dk.c:1.94 --- src/sys/dev/dkwedge/dk.c:1.93 Sat Dec 24 16:39:55 2016 +++ src/sys/dev/dkwedge/dk.c Thu Jan 19 00:44:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.93 2016/12/24 16:39:55 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.94 2017/01/19 00:44:40 maya Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.93 2016/12/24 16:39:55 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.94 2017/01/19 00:44:40 maya Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -686,7 +686,7 @@ dkwedge_delall1(struct disk *pdk, bool i mutex_exit(>dk_openlock); return; } - strcpy(dkw.dkw_parent, pdk->dk_name); + strlcpy(dkw.dkw_parent, pdk->dk_name, sizeof(dkw.dkw_parent)); strlcpy(dkw.dkw_devname, device_xname(sc->sc_dev), sizeof(dkw.dkw_devname)); mutex_exit(>dk_openlock); @@ -733,10 +733,11 @@ dkwedge_list(struct disk *pdk, struct dk sizeof(dkw.dkw_devname)); memcpy(dkw.dkw_wname, sc->sc_wname, sizeof(dkw.dkw_wname)); dkw.dkw_wname[sizeof(dkw.dkw_wname) - 1] = '\0'; - strcpy(dkw.dkw_parent, sc->sc_parent->dk_name); + strlcpy(dkw.dkw_parent, sc->sc_parent->dk_name, + sizeof(dkw.dkw_parent)); dkw.dkw_offset = sc->sc_offset; dkw.dkw_size = sc->sc_size; - strcpy(dkw.dkw_ptype, sc->sc_ptype); + strlcpy(dkw.dkw_ptype, sc->sc_ptype, sizeof(dkw.dkw_ptype)); error = uiomove(, sizeof(dkw), ); if (error) @@ -1497,10 +1498,11 @@ dkioctl(dev_t dev, u_long cmd, void *dat sizeof(dkw->dkw_devname)); memcpy(dkw->dkw_wname, sc->sc_wname, sizeof(dkw->dkw_wname)); dkw->dkw_wname[sizeof(dkw->dkw_wname) - 1] = '\0'; - strcpy(dkw->dkw_parent, sc->sc_parent->dk_name); + strlcpy(dkw->dkw_parent, sc->sc_parent->dk_name, + sizeof(dkw->dkw_parent)); dkw->dkw_offset = sc->sc_offset; dkw->dkw_size = sc->sc_size; - strcpy(dkw->dkw_ptype, sc->sc_ptype); + strlcpy(dkw->dkw_ptype, sc->sc_ptype, sizeof(dkw->dkw_ptype)); break; } Index: src/sys/dev/dkwedge/dkwedge_apple.c diff -u src/sys/dev/dkwedge/dkwedge_apple.c:1.2 src/sys/dev/dkwedge/dkwedge_apple.c:1.3 --- src/sys/dev/dkwedge/dkwedge_apple.c:1.2 Sat Jan 24 02:58:56 2015 +++ src/sys/dev/dkwedge/dkwedge_apple.c Thu Jan 19 00:44:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_apple.c,v 1.2 2015/01/24 02:58:56 christos Exp $ */ +/* $NetBSD: dkwedge_apple.c,v 1.3 2017/01/19 00:44:40 maya Exp $ */ /*- * Copyright (c) 2012 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_apple.c,v 1.2 2015/01/24 02:58:56 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_apple.c,v 1.3 2017/01/19 00:44:40 maya Exp $"); #include #ifdef _KERNEL @@ -217,8 +217,8 @@ dkwedge_discover_apple(struct disk *pdk, struct dkwedge_info dkw; - strcpy(dkw.dkw_ptype, ptype); - strcpy(dkw.dkw_parent, pdk->dk_name); + strlcpy(dkw.dkw_ptype, ptype, sizeof(dkw.dkw_ptype)); + strlcpy(dkw.dkw_parent, pdk->dk_name, sizeof(dkw.dkw_parent)); dkw.dkw_offset = ae->pmPyPartStart; dkw.dkw_size = ae->pmPartBlkCnt; strlcpy(dkw.dkw_wname, ae->pmPartName, sizeof(dkw.dkw_wname)); Index: src/sys/dev/dkwedge/dkwedge_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.17 src/sys/dev/dkwedge/dkwedge_gpt.c:1.18 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.17 Thu Apr 28 00:35:24 2016 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Thu Jan 19 00:44:40 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.17 2016/04/28 00:35:24 christos Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.18 2017/01/19 00:44:40 maya Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.17 2016/04/28 00:35:24 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.18 2017/01/19 00:44:40 maya Exp $"); #include #include @@ -239,16 +239,16 @@ dkwedge_discover_gpt(struct disk *pdk, s /* figure out the type */ ptype = gpt_ptype_guid_to_str(_guid); - strcpy(dkw.dkw_ptype, ptype); + strlcpy(dkw.dkw_ptype, ptype, sizeof(dkw.dkw_ptype)); - strcpy(dkw.dkw_parent, pdk->dk_name); + strlcpy(dkw.dkw_parent, pdk->dk_name, sizeof(dkw.dkw_parent)); dkw.dkw_offset = le64toh(ent->ent_lba_start); dkw.dkw_size =
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat Dec 24 16:39:55 UTC 2016 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: add missing mutex/cv cleanup to error paths. To generate a diff of this commit: cvs rdiff -u -r1.92 -r1.93 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.92 src/sys/dev/dkwedge/dk.c:1.93 --- src/sys/dev/dkwedge/dk.c:1.92 Fri Dec 16 15:06:39 2016 +++ src/sys/dev/dkwedge/dk.c Sat Dec 24 16:39:55 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.92 2016/12/16 15:06:39 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.93 2016/12/24 16:39:55 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.92 2016/12/16 15:06:39 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.93 2016/12/24 16:39:55 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -369,6 +369,8 @@ dkwedge_add(struct dkwedge_info *dkw) } mutex_exit(>dk_openlock); if (error) { + cv_destroy(>sc_dkdrn); + mutex_destroy(>sc_iolock); bufq_free(sc->sc_bufq); free(sc, M_DKWEDGE); return (error); @@ -422,6 +424,8 @@ dkwedge_add(struct dkwedge_info *dkw) LIST_REMOVE(sc, sc_plink); mutex_exit(>dk_openlock); + cv_destroy(>sc_dkdrn); + mutex_destroy(>sc_iolock); bufq_free(sc->sc_bufq); free(sc, M_DKWEDGE); return (error); @@ -448,6 +452,8 @@ dkwedge_add(struct dkwedge_info *dkw) LIST_REMOVE(sc, sc_plink); mutex_exit(>dk_openlock); + cv_destroy(>sc_dkdrn); + mutex_destroy(>sc_iolock); bufq_free(sc->sc_bufq); free(sc, M_DKWEDGE); return (ENOMEM);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Fri Dec 16 15:06:39 UTC 2016 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Make dk(4) device mpsafe. To generate a diff of this commit: cvs rdiff -u -r1.91 -r1.92 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.91 src/sys/dev/dkwedge/dk.c:1.92 --- src/sys/dev/dkwedge/dk.c:1.91 Sun May 29 13:11:21 2016 +++ src/sys/dev/dkwedge/dk.c Fri Dec 16 15:06:39 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.92 2016/12/16 15:06:39 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.92 2016/12/16 15:06:39 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -86,8 +86,10 @@ struct dkwedge_softc { struct bufq_state *sc_bufq; /* buffer queue */ struct callout sc_restart_ch; /* callout to restart I/O */ + kmutex_t sc_iolock; + kcondvar_t sc_dkdrn; u_int sc_iopend; /* I/Os pending */ - int sc_flags; /* flags (splbio) */ + int sc_flags; /* flags (sc_iolock) */ }; #define DK_F_WAIT_DRAIN 0x0001 /* waiting for I/O to drain */ @@ -123,7 +125,7 @@ const struct bdevsw dk_bdevsw = { .d_dump = dkdump, .d_psize = dksize, .d_discard = dkdiscard, - .d_flag = D_DISK + .d_flag = D_DISK | D_MPSAFE }; const struct cdevsw dk_cdevsw = { @@ -138,7 +140,7 @@ const struct cdevsw dk_cdevsw = { .d_mmap = nommap, .d_kqfilter = nokqfilter, .d_discard = dkdiscard, - .d_flag = D_DISK + .d_flag = D_DISK | D_MPSAFE }; static struct dkwedge_softc **dkwedges; @@ -185,16 +187,17 @@ CFATTACH_DECL3_NEW(dk, 0, * dkwedge_wait_drain: * * Wait for I/O on the wedge to drain. - * NOTE: Must be called at splbio()! */ static void dkwedge_wait_drain(struct dkwedge_softc *sc) { + mutex_enter(>sc_iolock); while (sc->sc_iopend != 0) { sc->sc_flags |= DK_F_WAIT_DRAIN; - (void) tsleep(>sc_iopend, PRIBIO, "dkdrn", 0); + cv_wait(>sc_dkdrn, >sc_iolock); } + mutex_exit(>sc_iolock); } /* @@ -325,6 +328,9 @@ dkwedge_add(struct dkwedge_info *dkw) callout_init(>sc_restart_ch, 0); callout_setfunc(>sc_restart_ch, dkrestart, sc); + mutex_init(>sc_iolock, MUTEX_DEFAULT, IPL_BIO); + cv_init(>sc_dkdrn, "dkdrn"); + /* * Wedge will be added; increment the wedge count for the parent. * Only allow this to happend if RAW_PART is the only thing open. @@ -568,7 +574,7 @@ dkwedge_detach(device_t self, int flags) { struct dkwedge_softc *sc = NULL; u_int unit; - int bmaj, cmaj, rc, s; + int bmaj, cmaj, rc; rw_enter(_lock, RW_WRITER); for (unit = 0; unit < ndkwedges; unit++) { @@ -600,10 +606,8 @@ dkwedge_detach(device_t self, int flags) * state of the wedge is not RUNNING. Once we've done * that, wait for any other pending I/O to complete. */ - s = splbio(); dkstart(sc); dkwedge_wait_drain(sc); - splx(s); /* Nuke the vnodes for any open instances. */ vdevgone(bmaj, unit, unit, VBLK); @@ -635,6 +639,9 @@ dkwedge_detach(device_t self, int flags) sc->sc_state = DKW_STATE_DEAD; rw_exit(_lock); + mutex_destroy(>sc_iolock); + cv_destroy(>sc_dkdrn); + free(sc, M_DKWEDGE); return 0; @@ -1206,7 +1213,6 @@ dkstrategy(struct buf *bp) { struct dkwedge_softc *sc = dkwedge_lookup(bp->b_dev); uint64_t p_size, p_offset; - int s; if (sc == NULL) { bp->b_error = ENODEV; @@ -1234,11 +1240,12 @@ dkstrategy(struct buf *bp) bp->b_rawblkno = bp->b_blkno + p_offset; /* Place it in the queue and start I/O on the unit. */ - s = splbio(); + mutex_enter(>sc_iolock); sc->sc_iopend++; bufq_put(sc->sc_bufq, bp); + mutex_exit(>sc_iolock); + dkstart(sc); - splx(s); return; done: @@ -1250,7 +1257,6 @@ dkstrategy(struct buf *bp) * dkstart: * * Start I/O that has been enqueued on the wedge. - * NOTE: Must be called at splbio()! */ static void dkstart(struct dkwedge_softc *sc) @@ -1258,36 +1264,58 @@ dkstart(struct dkwedge_softc *sc) struct vnode *vp; struct buf *bp, *nbp; + mutex_enter(>sc_iolock); + /* Do as much work as has been enqueued. */ while ((bp = bufq_peek(sc->sc_bufq)) != NULL) { + if (sc->sc_state != DKW_STATE_RUNNING) { (void) bufq_get(sc->sc_bufq); if (sc->sc_iopend-- == 1 && (sc->sc_flags & DK_F_WAIT_DRAIN) != 0) { sc->sc_flags &= ~DK_F_WAIT_DRAIN; -wakeup(>sc_iopend); +cv_broadcast(>sc_dkdrn); } + mutex_exit(>sc_iolock); bp->b_error = ENXIO; bp->b_resid = bp->b_bcount; biodone(bp); + mutex_enter(>sc_iolock); + continue; } - /* Instrumentation. */ - disk_busy(>sc_dk); - + /* fetch an I/O buf with sc_iolock dropped */ + mutex_exit(>sc_iolock); nbp =
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sun May 29 13:11:21 UTC 2016 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: missed one exit path with the previous change. To generate a diff of this commit: cvs rdiff -u -r1.90 -r1.91 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.90 src/sys/dev/dkwedge/dk.c:1.91 --- src/sys/dev/dkwedge/dk.c:1.90 Sun May 29 12:48:40 2016 +++ src/sys/dev/dkwedge/dk.c Sun May 29 13:11:21 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.90 2016/05/29 12:48:40 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.90 2016/05/29 12:48:40 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.91 2016/05/29 13:11:21 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -545,7 +545,8 @@ dkwedge_cleanup_parent(struct dkwedge_so rc = 0; mutex_enter(>dk_openlock); if (dk->dk_openmask == 0) - ; /* nothing to do */ + /* nothing to do */ + mutex_exit(>dk_openlock); else if ((flags & DETACH_FORCE) == 0) { rc = EBUSY; mutex_exit(>dk_openlock);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sun May 29 12:48:40 UTC 2016 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: release openlock mutex before closing parent device. To generate a diff of this commit: cvs rdiff -u -r1.89 -r1.90 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.89 src/sys/dev/dkwedge/dk.c:1.90 --- src/sys/dev/dkwedge/dk.c:1.89 Wed Apr 27 02:19:12 2016 +++ src/sys/dev/dkwedge/dk.c Sun May 29 12:48:40 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.89 2016/04/27 02:19:12 christos Exp $ */ +/* $NetBSD: dk.c,v 1.90 2016/05/29 12:48:40 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.89 2016/04/27 02:19:12 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.90 2016/05/29 12:48:40 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -546,13 +546,13 @@ dkwedge_cleanup_parent(struct dkwedge_so mutex_enter(>dk_openlock); if (dk->dk_openmask == 0) ; /* nothing to do */ - else if ((flags & DETACH_FORCE) == 0) + else if ((flags & DETACH_FORCE) == 0) { rc = EBUSY; - else { + mutex_exit(>dk_openlock); + } else { mutex_enter(>sc_parent->dk_rawlock); - rc = dklastclose(sc); /* releases dk_rawlock */ + rc = dklastclose(sc); /* releases locks */ } - mutex_exit(>dk_openlock); return rc; } @@ -1146,6 +1146,7 @@ dklastclose(struct dkwedge_softc *sc) } mutex_exit(>sc_parent->dk_rawlock); + mutex_exit(>sc_dk.dk_openlock); if (doclose) { KASSERT(sc->sc_parent->dk_rawvp != NULL); @@ -1185,11 +1186,11 @@ dkclose(dev_t dev, int flags, int fmt, s sc->sc_dk.dk_copenmask | sc->sc_dk.dk_bopenmask; if (sc->sc_dk.dk_openmask == 0) - error = dklastclose(sc); /* releases dk_rawlock */ - else + error = dklastclose(sc); /* releases locks */ + else { mutex_exit(>sc_parent->dk_rawlock); - - mutex_exit(>sc_dk.dk_openlock); + mutex_exit(>sc_dk.dk_openlock); + } return (error); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Thu Apr 28 00:35:24 UTC 2016 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: Fix tyop To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.16 src/sys/dev/dkwedge/dkwedge_gpt.c:1.17 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.16 Wed Apr 27 20:33:54 2016 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Wed Apr 27 20:35:24 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.16 2016/04/28 00:33:54 christos Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.17 2016/04/28 00:35:24 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.16 2016/04/28 00:33:54 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.17 2016/04/28 00:35:24 christos Exp $"); #include #include @@ -267,8 +267,8 @@ dkwedge_discover_gpt(struct disk *pdk, s */ if ((error = dkwedge_add()) == EEXIST && strcmp(dkw.dkw_wname, ent_guid_str) != 0) { - char orig[sizeof(dkw.dkw_name)]; - strcpy(orig, dkw.dkw_name); + char orig[sizeof(dkw.dkw_wname)]; + strcpy(orig, dkw.dkw_wname); strcpy(dkw.dkw_wname, ent_guid_str); error = dkwedge_add(); if (!error)
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Thu Apr 28 00:33:54 UTC 2016 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: Fix error message. To generate a diff of this commit: cvs rdiff -u -r1.15 -r1.16 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.15 src/sys/dev/dkwedge/dkwedge_gpt.c:1.16 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.15 Sun Aug 23 14:40:15 2015 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Wed Apr 27 20:33:54 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.15 2015/08/23 18:40:15 jakllsch Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.16 2016/04/28 00:33:54 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.15 2015/08/23 18:40:15 jakllsch Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_gpt.c,v 1.16 2016/04/28 00:33:54 christos Exp $"); #include #include @@ -267,13 +267,14 @@ dkwedge_discover_gpt(struct disk *pdk, s */ if ((error = dkwedge_add()) == EEXIST && strcmp(dkw.dkw_wname, ent_guid_str) != 0) { + char orig[sizeof(dkw.dkw_name)]; + strcpy(orig, dkw.dkw_name); strcpy(dkw.dkw_wname, ent_guid_str); error = dkwedge_add(); if (!error) aprint_error("%s: wedge named '%s' already " "existed, using '%s'\n", pdk->dk_name, -dkw.dkw_wname, /* XXX Unicode */ -ent_guid_str); +orig, ent_guid_str); } if (error == EEXIST) aprint_error("%s: wedge named '%s' already exists, "
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Fri Jan 15 07:48:22 UTC 2016 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Allow dump to raidframe component which is a wedge. N.B. ordinary devices check the partition type only in the xxxsize routine. To generate a diff of this commit: cvs rdiff -u -r1.87 -r1.88 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.87 src/sys/dev/dkwedge/dk.c:1.88 --- src/sys/dev/dkwedge/dk.c:1.87 Sun Dec 27 00:47:47 2015 +++ src/sys/dev/dkwedge/dk.c Fri Jan 15 07:48:22 2016 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.87 2015/12/27 00:47:47 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.88 2016/01/15 07:48:22 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.87 2015/12/27 00:47:47 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.88 2016/01/15 07:48:22 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -1554,7 +1554,8 @@ dkdump(dev_t dev, daddr_t blkno, void *v /* Our content type is static, no need to open the device. */ - if (strcmp(sc->sc_ptype, DKW_PTYPE_SWAP) != 0) { + if (strcmp(sc->sc_ptype, DKW_PTYPE_SWAP) != 0 && + strcmp(sc->sc_ptype, DKW_PTYPE_RAID) != 0) { rv = ENXIO; goto out; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sun Dec 27 00:47:47 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Return error in dkopen when dk_open_parent fails. Also change dk_open_parent to pass error code to caller. XXX: Pullups To generate a diff of this commit: cvs rdiff -u -r1.86 -r1.87 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.86 src/sys/dev/dkwedge/dk.c:1.87 --- src/sys/dev/dkwedge/dk.c:1.86 Sat Nov 28 13:41:31 2015 +++ src/sys/dev/dkwedge/dk.c Sun Dec 27 00:47:47 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.86 2015/11/28 13:41:31 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.87 2015/12/27 00:47:47 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.86 2015/11/28 13:41:31 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.87 2015/12/27 00:47:47 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -102,7 +102,7 @@ static int dkwedge_cleanup_parent(struct static int dkwedge_detach(device_t, int); static void dkwedge_delall1(struct disk *, bool); static int dkwedge_del1(struct dkwedge_info *, int); -static struct vnode *dk_open_parent(dev_t, int); +static int dk_open_parent(dev_t, int, struct vnode **); static int dk_close_parent(struct vnode *, int); static dev_type_open(dkopen); @@ -969,14 +969,15 @@ dkwedge_read(struct disk *pdk, struct vn isopen = true; ++pdk->dk_rawopens; bdvp = pdk->dk_rawvp; + error = 0; } else { isopen = false; - bdvp = dk_open_parent(bdev, FREAD); + error = dk_open_parent(bdev, FREAD, ); } mutex_exit(>dk_rawlock); - if (bdvp == NULL) - return EBUSY; + if (error) + return error; bp = getiobuf(bdvp, true); bp->b_flags = B_READ; @@ -1021,25 +1022,25 @@ dkwedge_lookup(dev_t dev) return (dkwedges[unit]); } -static struct vnode * -dk_open_parent(dev_t dev, int mode) +static int +dk_open_parent(dev_t dev, int mode, struct vnode **vpp) { struct vnode *vp; int error; error = bdevvp(dev, ); if (error) - return NULL; + return error; error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); if (error) { vrele(vp); - return NULL; + return error; } error = VOP_OPEN(vp, mode, NOCRED); if (error) { vput(vp); - return NULL; + return error; } /* VOP_OPEN() doesn't do this for us. */ @@ -1051,7 +1052,9 @@ dk_open_parent(dev_t dev, int mode) VOP_UNLOCK(vp); - return vp; + *vpp = vp; + + return 0; } static int @@ -1091,8 +1094,8 @@ dkopen(dev_t dev, int flags, int fmt, st if (sc->sc_dk.dk_openmask == 0) { if (sc->sc_parent->dk_rawopens == 0) { KASSERT(sc->sc_parent->dk_rawvp == NULL); - vp = dk_open_parent(sc->sc_pdev, FREAD | FWRITE); - if (vp == NULL) + error = dk_open_parent(sc->sc_pdev, FREAD | FWRITE, ); + if (error) goto popen_fail; sc->sc_parent->dk_rawvp = vp; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Wed Dec 2 01:09:49 UTC 2015 Modified Files: src/sys/dev/dkwedge: dkwedge_mbr.c Log Message: Skip protective MBR early too. To generate a diff of this commit: cvs rdiff -u -r1.8 -r1.9 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_mbr.c diff -u src/sys/dev/dkwedge/dkwedge_mbr.c:1.8 src/sys/dev/dkwedge/dkwedge_mbr.c:1.9 --- src/sys/dev/dkwedge/dkwedge_mbr.c:1.8 Tue Nov 4 02:46:26 2014 +++ src/sys/dev/dkwedge/dkwedge_mbr.c Tue Dec 1 20:09:49 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_mbr.c,v 1.8 2014/11/04 07:46:26 mlelstv Exp $ */ +/* $NetBSD: dkwedge_mbr.c,v 1.9 2015/12/02 01:09:49 christos Exp $ */ /*- * Copyright (c) 2004 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.c,v 1.8 2014/11/04 07:46:26 mlelstv Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dkwedge_mbr.c,v 1.9 2015/12/02 01:09:49 christos Exp $"); #include #include @@ -103,10 +103,16 @@ getparts(mbr_args_t *a, uint32_t off, ui dp = mbr->mbr_parts; for (i = 0; i < MBR_PART_COUNT; i++) { - /* Extended partitions are handled below. */ - if (dp[i].mbrp_type == 0 || - MBR_IS_EXTENDED(dp[i].mbrp_type)) - continue; + switch (dp[i].mbrp_type) { + case 0: /* empty */ + case MBR_PTYPE_PMBR: /* Handled by GPT */ + continue; + default: + /* Extended partitions are handled below. */ + if (MBR_IS_EXTENDED(dp[i].mbrp_type)) +continue; + break; + } if ((ptype = mbr_ptype_to_str(dp[i].mbrp_type)) == NULL) { /*
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat Nov 28 13:41:31 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: sc_size is already measured in sectors. To generate a diff of this commit: cvs rdiff -u -r1.85 -r1.86 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.85 src/sys/dev/dkwedge/dk.c:1.86 --- src/sys/dev/dkwedge/dk.c:1.85 Sat Oct 10 23:39:43 2015 +++ src/sys/dev/dkwedge/dk.c Sat Nov 28 13:41:31 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.85 2015/10/10 23:39:43 christos Exp $ */ +/* $NetBSD: dk.c,v 1.86 2015/11/28 13:41:31 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.85 2015/10/10 23:39:43 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.86 2015/11/28 13:41:31 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -267,7 +267,7 @@ dk_set_geometry(struct dkwedge_softc *sc memset(dg, 0, sizeof(*dg)); - dg->dg_secperunit = sc->sc_size >> pdk->dk_blkshift; + dg->dg_secperunit = sc->sc_size; dg->dg_secsize = DEV_BSIZE << pdk->dk_blkshift; /* fake numbers, 1 cylinder is 1 MB with default sector size */
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Sat Oct 10 23:39:43 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: remove incorrect comment (from kre) To generate a diff of this commit: cvs rdiff -u -r1.84 -r1.85 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.84 src/sys/dev/dkwedge/dk.c:1.85 --- src/sys/dev/dkwedge/dk.c:1.84 Tue Oct 6 07:22:40 2015 +++ src/sys/dev/dkwedge/dk.c Sat Oct 10 19:39:43 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.84 2015/10/06 11:22:40 jmcneill Exp $ */ +/* $NetBSD: dk.c,v 1.85 2015/10/10 23:39:43 christos Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.84 2015/10/06 11:22:40 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.85 2015/10/10 23:39:43 christos Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -684,8 +684,6 @@ dkwedge_delall1(struct disk *pdk, bool i * dkwedge_list: [exported function] * * List all of the wedges on a particular disk. - * If p == NULL, the buffer is in kernel space. Otherwise, it is - * in user space of the specified process. */ int dkwedge_list(struct disk *pdk, struct dkwedge_list *dkwl, struct lwp *l)
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jmcneill Date: Tue Oct 6 11:22:40 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: print wedge announcement in one line instead of two To generate a diff of this commit: cvs rdiff -u -r1.83 -r1.84 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.83 src/sys/dev/dkwedge/dk.c:1.84 --- src/sys/dev/dkwedge/dk.c:1.83 Tue Aug 25 11:08:59 2015 +++ src/sys/dev/dkwedge/dk.c Tue Oct 6 11:22:40 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.83 2015/08/25 11:08:59 pooka Exp $ */ +/* $NetBSD: dk.c,v 1.84 2015/10/06 11:22:40 jmcneill Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.83 2015/08/25 11:08:59 pooka Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.84 2015/10/06 11:22:40 jmcneill Exp $"); #ifdef _KERNEL_OPT #include "opt_dkwedge.h" @@ -464,10 +464,12 @@ dkwedge_add(struct dkwedge_info *dkw) sc->sc_state = DKW_STATE_RUNNING; /* Announce our arrival. */ - aprint_normal("%s at %s: %s\n", device_xname(sc->sc_dev), pdk->dk_name, - sc->sc_wname); /* XXX Unicode */ - aprint_normal("%s: %"PRIu64" blocks at %"PRId64", type: %s\n", - device_xname(sc->sc_dev), sc->sc_size, sc->sc_offset, sc->sc_ptype); + aprint_normal( + "%s at %s: \"%s\", %"PRIu64" blocks at %"PRId64", type: %s\n", + device_xname(sc->sc_dev), pdk->dk_name, + sc->sc_wname, /* XXX Unicode */ + sc->sc_size, sc->sc_offset, + sc->sc_ptype[0] == '\0' ? "" : sc->sc_ptype); return (0); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: pooka Date: Tue Aug 25 11:08:59 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Rename variable to avoid -Wshadow warnings with some compilers. To generate a diff of this commit: cvs rdiff -u -r1.82 -r1.83 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.82 src/sys/dev/dkwedge/dk.c:1.83 --- src/sys/dev/dkwedge/dk.c:1.82 Sat Aug 22 07:48:14 2015 +++ src/sys/dev/dkwedge/dk.c Tue Aug 25 11:08:59 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.82 2015/08/22 07:48:14 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.83 2015/08/25 11:08:59 pooka Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.82 2015/08/22 07:48:14 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.83 2015/08/25 11:08:59 pooka Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -949,7 +949,7 @@ dkwedge_read(struct disk *pdk, struct vn int error; bool isopen; dev_t bdev; - struct vnode *bdevvp; + struct vnode *bdvp; /* * The kernel cannot read from a character device vnode @@ -968,17 +968,17 @@ dkwedge_read(struct disk *pdk, struct vn KASSERT(pdk-dk_rawvp != NULL); isopen = true; ++pdk-dk_rawopens; - bdevvp = pdk-dk_rawvp; + bdvp = pdk-dk_rawvp; } else { isopen = false; - bdevvp = dk_open_parent(bdev, FREAD); + bdvp = dk_open_parent(bdev, FREAD); } mutex_exit(pdk-dk_rawlock); - if (bdevvp == NULL) + if (bdvp == NULL) return EBUSY; - bp = getiobuf(bdevvp, true); + bp = getiobuf(bdvp, true); bp-b_flags = B_READ; bp-b_cflags = BC_BUSY; bp-b_dev = bdev; @@ -988,7 +988,7 @@ dkwedge_read(struct disk *pdk, struct vn bp-b_cylinder = 0; bp-b_error = 0; - VOP_STRATEGY(bdevvp, bp); + VOP_STRATEGY(bdvp, bp); error = biowait(bp); putiobuf(bp); @@ -996,7 +996,7 @@ dkwedge_read(struct disk *pdk, struct vn if (isopen) { --pdk-dk_rawopens; } else { - dk_close_parent(bdevvp, FREAD); + dk_close_parent(bdvp, FREAD); } mutex_exit(pdk-dk_rawlock);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jakllsch Date: Sun Aug 23 18:40:15 UTC 2015 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: Quadruple GPT partition entry count limit (to 512 entries or 64KiB). The UEFI 2.3.1 specification states that: A minimum of 16,384 bytes of space must be reserved for the GPT Partition Entry Array. and [the size of a partition entry shall be a power of two greater than 128] and that [the defined fields of a partition entry total 128 bytes]. Clamping the entries means that no partitions on the drive will be detected, as this will result in an incorrect partition entry array CRC. This change reduces the likelyhood of useless partitions, while still not allowing a huge kernel memory allocation to load the partition entries into. In the future this code should probably be reworked to checksum and evaluate the partition array in chunks while still limiting the number of GPT wedges added per drive to something reasonable. To generate a diff of this commit: cvs rdiff -u -r1.14 -r1.15 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.14 src/sys/dev/dkwedge/dkwedge_gpt.c:1.15 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.14 Tue Nov 4 07:43:00 2014 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Sun Aug 23 18:40:15 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.14 2014/11/04 07:43:00 mlelstv Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.15 2015/08/23 18:40:15 jakllsch 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.14 2014/11/04 07:43:00 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_gpt.c,v 1.15 2015/08/23 18:40:15 jakllsch Exp $); #include sys/param.h #include sys/systm.h @@ -178,11 +178,11 @@ dkwedge_discover_gpt(struct disk *pdk, s } gpe_crc = le32toh(hdr-hdr_crc_table); - /* XXX Clamp entries at 128 for now. */ - if (entries 128) { + /* XXX Clamp entries at 512 for now. */ + if (entries 512) { aprint_error(%s: WARNING: clamping number of GPT entries to - 128 (was %u)\n, pdk-dk_name, entries); - entries = 128; + 512 (was %u)\n, pdk-dk_name, entries); + entries = 512; } lba_start = le64toh(hdr-hdr_lba_start);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat Aug 22 07:42:46 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: revert the previous To generate a diff of this commit: cvs rdiff -u -r1.80 -r1.81 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.80 src/sys/dev/dkwedge/dk.c:1.81 --- src/sys/dev/dkwedge/dk.c:1.80 Thu Aug 20 23:08:33 2015 +++ src/sys/dev/dkwedge/dk.c Sat Aug 22 07:42:46 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.80 2015/08/20 23:08:33 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.81 2015/08/22 07:42:46 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.80 2015/08/20 23:08:33 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.81 2015/08/22 07:42:46 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -944,7 +944,7 @@ dkwedge_read(struct disk *pdk, struct vn void *tbuf, size_t len) { buf_t *bp; - int error, isopen; + int error; /* * The kernel cannot read from a character device vnode @@ -964,12 +964,6 @@ dkwedge_read(struct disk *pdk, struct vn bp-b_cylinder = 0; bp-b_error = 0; - /* - * XXX Only the last user of a block device can close it. - * There is no reference counting in the driver. - */ - isopen = pdk-dk_bopenmask (1 DISKPART(bp-b_dev)); - error = bdev_open(bp-b_dev, FREAD, S_IFBLK, curlwp); if (error) return error; @@ -978,8 +972,7 @@ dkwedge_read(struct disk *pdk, struct vn error = biowait(bp); putiobuf(bp); - if (!isopen) - bdev_close(bp-b_dev, FREAD, S_IFBLK, curlwp); + bdev_close(bp-b_dev, FREAD, S_IFBLK, curlwp); return error; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat Aug 22 07:48:14 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: No longer access the disk driver directly. If there is an open wedge, temporarily reference its vnode. Otherwise try to open the block device. To generate a diff of this commit: cvs rdiff -u -r1.81 -r1.82 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.81 src/sys/dev/dkwedge/dk.c:1.82 --- src/sys/dev/dkwedge/dk.c:1.81 Sat Aug 22 07:42:46 2015 +++ src/sys/dev/dkwedge/dk.c Sat Aug 22 07:48:14 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.81 2015/08/22 07:42:46 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.82 2015/08/22 07:48:14 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.81 2015/08/22 07:42:46 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.82 2015/08/22 07:48:14 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -102,6 +102,8 @@ static int dkwedge_cleanup_parent(struct static int dkwedge_detach(device_t, int); static void dkwedge_delall1(struct disk *, bool); static int dkwedge_del1(struct dkwedge_info *, int); +static struct vnode *dk_open_parent(dev_t, int); +static int dk_close_parent(struct vnode *, int); static dev_type_open(dkopen); static dev_type_close(dkclose); @@ -945,34 +947,58 @@ dkwedge_read(struct disk *pdk, struct vn { buf_t *bp; int error; + bool isopen; + dev_t bdev; + struct vnode *bdevvp; /* * The kernel cannot read from a character device vnode * as physio() only handles user memory. * - * Determine the corresponding block device and call into - * the driver directly. + * If the block device has already been opened by a wedge + * use that vnode and temporarily bump the open counter. + * + * Otherwise try to open the block device. */ - bp = getiobuf(vp, true); + bdev = devsw_chr2blk(vp-v_rdev); + + mutex_enter(pdk-dk_rawlock); + if (pdk-dk_rawopens != 0) { + KASSERT(pdk-dk_rawvp != NULL); + isopen = true; + ++pdk-dk_rawopens; + bdevvp = pdk-dk_rawvp; + } else { + isopen = false; + bdevvp = dk_open_parent(bdev, FREAD); + } + mutex_exit(pdk-dk_rawlock); + + if (bdevvp == NULL) + return EBUSY; + + bp = getiobuf(bdevvp, true); bp-b_flags = B_READ; bp-b_cflags = BC_BUSY; - bp-b_dev = devsw_chr2blk(vp-v_rdev); + bp-b_dev = bdev; bp-b_data = tbuf; bp-b_bufsize = bp-b_bcount = len; bp-b_blkno = blkno; bp-b_cylinder = 0; bp-b_error = 0; - error = bdev_open(bp-b_dev, FREAD, S_IFBLK, curlwp); - if (error) - return error; - - bdev_strategy(bp); + VOP_STRATEGY(bdevvp, bp); error = biowait(bp); putiobuf(bp); - bdev_close(bp-b_dev, FREAD, S_IFBLK, curlwp); + mutex_enter(pdk-dk_rawlock); + if (isopen) { + --pdk-dk_rawopens; + } else { + dk_close_parent(bdevvp, FREAD); + } + mutex_exit(pdk-dk_rawlock); return error; } @@ -995,6 +1021,48 @@ dkwedge_lookup(dev_t dev) return (dkwedges[unit]); } +static struct vnode * +dk_open_parent(dev_t dev, int mode) +{ + struct vnode *vp; + int error; + + error = bdevvp(dev, vp); + if (error) + return NULL; + + error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); + if (error) { + vrele(vp); + return NULL; + } + error = VOP_OPEN(vp, mode, NOCRED); + if (error) { + vput(vp); + return NULL; + } + + /* VOP_OPEN() doesn't do this for us. */ + if (mode FWRITE) { + mutex_enter(vp-v_interlock); + vp-v_writecount++; + mutex_exit(vp-v_interlock); + } + + VOP_UNLOCK(vp); + + return vp; +} + +static int +dk_close_parent(struct vnode *vp, int mode) +{ + int error; + + error = vn_close(vp, mode, NOCRED); + return error; +} + /* * dkopen: [devsw entry point] * @@ -1023,24 +1091,9 @@ dkopen(dev_t dev, int flags, int fmt, st if (sc-sc_dk.dk_openmask == 0) { if (sc-sc_parent-dk_rawopens == 0) { KASSERT(sc-sc_parent-dk_rawvp == NULL); - error = bdevvp(sc-sc_pdev, vp); - if (error) -goto popen_fail; - error = vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - if (error) { -vrele(vp); + vp = dk_open_parent(sc-sc_pdev, FREAD | FWRITE); + if (vp == NULL) goto popen_fail; - } - error = VOP_OPEN(vp, FREAD | FWRITE, NOCRED); - if (error) { -vput(vp); -goto popen_fail; - } - /* VOP_OPEN() doesn't do this for us. */ - mutex_enter(vp-v_interlock); - vp-v_writecount++; - mutex_exit(vp-v_interlock); - VOP_UNLOCK(vp); sc-sc_parent-dk_rawvp = vp; } sc-sc_parent-dk_rawopens++; @@ -1076,8 +1129,7 @@ dklastclose(struct dkwedge_softc *sc) if (doclose) { KASSERT(sc-sc_parent-dk_rawvp != NULL); - error = vn_close(sc-sc_parent-dk_rawvp, - FREAD | FWRITE, NOCRED); + dk_close_parent(sc-sc_parent-dk_rawvp, FREAD | FWRITE); sc-sc_parent-dk_rawvp = NULL; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Thu Aug 20 23:08:33 UTC 2015 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: when scanning for disklabels, close block device only when this was the first open. The device driver doesn't do reference counting. This is still subject to race conditions. To generate a diff of this commit: cvs rdiff -u -r1.79 -r1.80 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.79 src/sys/dev/dkwedge/dk.c:1.80 --- src/sys/dev/dkwedge/dk.c:1.79 Fri Jan 2 01:14:22 2015 +++ src/sys/dev/dkwedge/dk.c Thu Aug 20 23:08:33 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.79 2015/01/02 01:14:22 christos Exp $ */ +/* $NetBSD: dk.c,v 1.80 2015/08/20 23:08:33 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.79 2015/01/02 01:14:22 christos Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.80 2015/08/20 23:08:33 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -944,7 +944,7 @@ dkwedge_read(struct disk *pdk, struct vn void *tbuf, size_t len) { buf_t *bp; - int error; + int error, isopen; /* * The kernel cannot read from a character device vnode @@ -964,6 +964,12 @@ dkwedge_read(struct disk *pdk, struct vn bp-b_cylinder = 0; bp-b_error = 0; + /* + * XXX Only the last user of a block device can close it. + * There is no reference counting in the driver. + */ + isopen = pdk-dk_bopenmask (1 DISKPART(bp-b_dev)); + error = bdev_open(bp-b_dev, FREAD, S_IFBLK, curlwp); if (error) return error; @@ -972,7 +978,8 @@ dkwedge_read(struct disk *pdk, struct vn error = biowait(bp); putiobuf(bp); - bdev_close(bp-b_dev, FREAD, S_IFBLK, curlwp); + if (!isopen) + bdev_close(bp-b_dev, FREAD, S_IFBLK, curlwp); return error; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Sat Jan 24 02:58:57 UTC 2015 Modified Files: src/sys/dev/dkwedge: dkwedge_apple.c Log Message: Look at the bzb flags to mark partition as swap. Requested by John D. Baker. XXX: Pullup-7 To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/sys/dev/dkwedge/dkwedge_apple.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.1 src/sys/dev/dkwedge/dkwedge_apple.c:1.2 --- src/sys/dev/dkwedge/dkwedge_apple.c:1.1 Sat Apr 7 01:36:10 2012 +++ src/sys/dev/dkwedge/dkwedge_apple.c Fri Jan 23 21:58:56 2015 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_apple.c,v 1.1 2012/04/07 05:36:10 christos Exp $ */ +/* $NetBSD: dkwedge_apple.c,v 1.2 2015/01/24 02:58:56 christos 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.1 2012/04/07 05:36:10 christos Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_apple.c,v 1.2 2015/01/24 02:58:56 christos Exp $); #include sys/param.h #ifdef _KERNEL @@ -106,6 +106,18 @@ swap_apple_part_map_entry(struct apple_p SWAP32(pmBootCksum); } +static void +swap_apple_blockzeroblock(struct apple_blockzeroblock *ap) +{ +SWAP32(bzbMagic); +SWAP16(bzbBadBlockInode); +SWAP16(bzbFlags); +SWAP16(bzbReserved); +SWAP32(bzbCreationTime); +SWAP32(bzbMountTime); +SWAP32(bzbUMountTime); +} + #undef SWAP16 #undef SWAP32 @@ -137,6 +149,8 @@ dkwedge_discover_apple(struct disk *pdk, uint32_t blocksize, 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) { @@ -193,9 +207,17 @@ dkwedge_discover_apple(struct disk *pdk, if (i == __arraycount(map)) continue; + ptype = map[i].type; + memcpy(ab, ae-pmBootArgs, sizeof(ab)); + swap_apple_blockzeroblock(ab); + if (ab.bzbMagic == APPLE_BZB_MAGIC) { + if (ab.bzbType == APPLE_BZB_TYPESWAP) +ptype = DKW_PTYPE_SWAP; + } + struct dkwedge_info dkw; - strcpy(dkw.dkw_ptype, map[i].type); + strcpy(dkw.dkw_ptype, ptype); strcpy(dkw.dkw_parent, pdk-dk_name); dkw.dkw_offset = ae-pmPyPartStart; dkw.dkw_size = ae-pmPartBlkCnt;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Mon Dec 8 17:45:12 UTC 2014 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Really provide disk properties, the old code computed values that were never attached to the device. To generate a diff of this commit: cvs rdiff -u -r1.75 -r1.76 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.75 src/sys/dev/dkwedge/dk.c:1.76 --- src/sys/dev/dkwedge/dk.c:1.75 Sat Nov 22 11:59:33 2014 +++ src/sys/dev/dkwedge/dk.c Mon Dec 8 17:45:12 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.75 2014/11/22 11:59:33 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.76 2014/12/08 17:45:12 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.75 2014/11/22 11:59:33 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.76 2014/12/08 17:45:12 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -258,20 +258,22 @@ dkwedge_array_expand(void) } static void -dkgetproperties(struct disk *disk, struct dkwedge_info *dkw) +dk_set_geometry(struct dkwedge_softc *sc) { + struct disk *disk = sc-sc_dk; struct disk_geom *dg = disk-dk_geom; memset(dg, 0, sizeof(*dg)); - dg-dg_secperunit = dkw-dkw_size disk-dk_blkshift; + dg-dg_secperunit = sc-sc_size disk-dk_blkshift; dg-dg_secsize = DEV_BSIZE disk-dk_blkshift; + + /* fake numbers, 1 cylinder is 1 MB with default sector size */ dg-dg_nsectors = 32; dg-dg_ntracks = 64; - /* XXX: why is that dkw-dkw_size instead of secperunit?!?! */ - dg-dg_ncylinders = dkw-dkw_size / (dg-dg_nsectors * dg-dg_ntracks); + dg-dg_ncylinders = dg-dg_secperunit / (dg-dg_nsectors * dg-dg_ntracks); - disk_set_info(NULL, disk, ESDI); + disk_set_info(sc-sc_dev, disk, NULL); } /* @@ -454,7 +456,7 @@ dkwedge_add(struct dkwedge_info *dkw) disk_init(sc-sc_dk, device_xname(sc-sc_dev), NULL); disk_blocksize(sc-sc_dk, DEV_BSIZE pdk-dk_blkshift); - dkgetproperties(sc-sc_dk, dkw); + dk_set_geometry(sc); disk_attach(sc-sc_dk); /* Disk wedge is ready for use! */
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sat Nov 22 11:59:33 UTC 2014 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: fix iobuf setup, cleanup To generate a diff of this commit: cvs rdiff -u -r1.74 -r1.75 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.74 src/sys/dev/dkwedge/dk.c:1.75 --- src/sys/dev/dkwedge/dk.c:1.74 Tue Nov 4 07:50:39 2014 +++ src/sys/dev/dkwedge/dk.c Sat Nov 22 11:59:33 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.74 2014/11/04 07:50:39 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.75 2014/11/22 11:59:33 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.74 2014/11/04 07:50:39 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.75 2014/11/22 11:59:33 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -217,10 +217,10 @@ dkwedge_compute_pdev(const char *pname, pmaj = devsw_name2chr(name, devname, sizeof(devname)); break; default: - pmaj = -1; + pmaj = NODEVMAJOR; break; } - if (pmaj == -1) + if (pmaj == NODEVMAJOR) return (ENODEV); name += strlen(devname); @@ -927,6 +927,7 @@ dkwedge_discover(struct disk *pdk) pdk-dk_name, error); /* We'll just assume the vnode has been cleaned up. */ } + out: rw_exit(dkwedge_discovery_methods_lock); } @@ -957,9 +958,10 @@ dkwedge_read(struct disk *pdk, struct vn bp-b_cflags = BC_BUSY; bp-b_dev = devsw_chr2blk(vp-v_rdev); bp-b_data = tbuf; - bp-b_bufsize = bp-b_resid = bp-b_bcount = len; - bp-b_lblkno = 0; + bp-b_bufsize = bp-b_bcount = len; bp-b_blkno = blkno; + bp-b_cylinder = 0; + bp-b_error = 0; error = bdev_open(bp-b_dev, FREAD, S_IFBLK, curlwp); if (error) @@ -1570,3 +1572,4 @@ dkwedge_get_parent_name(dev_t dev) return NULL; return sc-sc_parent-dk_name; } +
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Tue Nov 4 07:43:00 UTC 2014 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: Be less noisy when handling wedge name conflicts. To generate a diff of this commit: cvs rdiff -u -r1.13 -r1.14 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.13 src/sys/dev/dkwedge/dkwedge_gpt.c:1.14 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.13 Sat Oct 18 08:33:27 2014 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Tue Nov 4 07:43:00 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.13 2014/10/18 08:33:27 snj Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.14 2014/11/04 07:43:00 mlelstv 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.13 2014/10/18 08:33:27 snj Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_gpt.c,v 1.14 2014/11/04 07:43:00 mlelstv Exp $); #include sys/param.h #include sys/systm.h @@ -265,13 +265,15 @@ dkwedge_discover_gpt(struct disk *pdk, s * Try with the partition name first. If that fails, * use the GUID string. If that fails, punt. */ - if ((error = dkwedge_add(dkw)) == EEXIST) { - aprint_error(%s: wedge named '%s' already exists, - trying '%s'\n, pdk-dk_name, - dkw.dkw_wname, /* XXX Unicode */ - ent_guid_str); + if ((error = dkwedge_add(dkw)) == EEXIST + strcmp(dkw.dkw_wname, ent_guid_str) != 0) { strcpy(dkw.dkw_wname, ent_guid_str); error = dkwedge_add(dkw); + if (!error) +aprint_error(%s: wedge named '%s' already +existed, using '%s'\n, pdk-dk_name, +dkw.dkw_wname, /* XXX Unicode */ +ent_guid_str); } if (error == EEXIST) aprint_error(%s: wedge named '%s' already exists,
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Tue Nov 4 07:46:26 UTC 2014 Modified Files: src/sys/dev/dkwedge: dkwedge_mbr.c Log Message: get sector size from disk structure. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 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_mbr.c diff -u src/sys/dev/dkwedge/dkwedge_mbr.c:1.7 src/sys/dev/dkwedge/dkwedge_mbr.c:1.8 --- src/sys/dev/dkwedge/dkwedge_mbr.c:1.7 Sat Apr 7 05:09:09 2012 +++ src/sys/dev/dkwedge/dkwedge_mbr.c Tue Nov 4 07:46:26 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_mbr.c,v 1.7 2012/04/07 05:09:09 christos Exp $ */ +/* $NetBSD: dkwedge_mbr.c,v 1.8 2014/11/04 07:46:26 mlelstv 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.7 2012/04/07 05:09:09 christos Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_mbr.c,v 1.8 2014/11/04 07:46:26 mlelstv Exp $); #include sys/param.h #include sys/systm.h @@ -168,7 +168,7 @@ dkwedge_discover_mbr(struct disk *pdk, s mbr_args_t a; a.pdk = pdk; - a.secsize = pdk-dk_label-d_secsize; + a.secsize = DEV_BSIZE pdk-dk_blkshift; a.vp = vp; a.buf = malloc(a.secsize, M_DEVBUF, M_WAITOK); a.error = 0;
CVS commit: src/sys/dev/dkwedge
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. */
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Tue Nov 4 07:50:39 UTC 2014 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Implement DIOCMWEDGES ioctl that triggers wedge autodiscovery. Also fix a reference counting bug and clean up some code. To generate a diff of this commit: cvs rdiff -u -r1.73 -r1.74 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.73 src/sys/dev/dkwedge/dk.c:1.74 --- src/sys/dev/dkwedge/dk.c:1.73 Thu Aug 28 19:37:46 2014 +++ src/sys/dev/dkwedge/dk.c Tue Nov 4 07:50:39 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.73 2014/08/28 19:37:46 riastradh Exp $ */ +/* $NetBSD: dk.c,v 1.74 2014/11/04 07:50:39 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.73 2014/08/28 19:37:46 riastradh Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.74 2014/11/04 07:50:39 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -98,7 +98,10 @@ static void dkrestart(void *); static void dkminphys(struct buf *); static int dklastclose(struct dkwedge_softc *); +static int dkwedge_cleanup_parent(struct dkwedge_softc *, int); static int dkwedge_detach(device_t, int); +static void dkwedge_delall1(struct disk *, bool); +static int dkwedge_del1(struct dkwedge_info *, int); static dev_type_open(dkopen); static dev_type_close(dkclose); @@ -198,7 +201,7 @@ dkwedge_wait_drain(struct dkwedge_softc * Compute the parent disk's dev_t. */ static int -dkwedge_compute_pdev(const char *pname, dev_t *pdevp) +dkwedge_compute_pdev(const char *pname, dev_t *pdevp, enum vtype type) { const char *name, *cp; devmajor_t pmaj; @@ -206,7 +209,18 @@ dkwedge_compute_pdev(const char *pname, char devname[16]; name = pname; - if ((pmaj = devsw_name2blk(name, devname, sizeof(devname))) == -1) + switch (type) { + case VBLK: + pmaj = devsw_name2blk(name, devname, sizeof(devname)); + break; + case VCHR: + pmaj = devsw_name2chr(name, devname, sizeof(devname)); + break; + default: + pmaj = -1; + break; + } + if (pmaj == -1) return (ENODEV); name += strlen(devname); @@ -282,7 +296,7 @@ dkwedge_add(struct dkwedge_info *dkw) if (pdk == NULL) return (ENODEV); - error = dkwedge_compute_pdev(pdk-dk_name, pdev); + error = dkwedge_compute_pdev(pdk-dk_name, pdev, VBLK); if (error) return (error); @@ -331,9 +345,14 @@ dkwedge_add(struct dkwedge_info *dkw) break; } } - if (lsc != NULL) - error = EINVAL; - else { + if (lsc != NULL) { + if (sc-sc_offset == lsc-sc_offset + sc-sc_size == lsc-sc_size + strcmp(sc-sc_wname, lsc-sc_wname) == 0) +error = EEXIST; + else +error = EINVAL; + } else { pdk-dk_nwedges++; LIST_INSERT_HEAD(pdk-dk_wedges, sc, sc_plink); } @@ -497,17 +516,23 @@ dkwedge_find(struct dkwedge_info *dkw, u int dkwedge_del(struct dkwedge_info *dkw) { + return dkwedge_del1(dkw, 0); +} + +int +dkwedge_del1(struct dkwedge_info *dkw, int flags) +{ struct dkwedge_softc *sc = NULL; /* Find our softc. */ if ((sc = dkwedge_find(dkw, NULL)) == NULL) return (ESRCH); - return config_detach(sc-sc_dev, DETACH_FORCE | DETACH_QUIET); + return config_detach(sc-sc_dev, flags); } static int -dkwedge_begindetach(struct dkwedge_softc *sc, int flags) +dkwedge_cleanup_parent(struct dkwedge_softc *sc, int flags) { struct disk *dk = sc-sc_dk; int rc; @@ -546,7 +571,7 @@ dkwedge_detach(device_t self, int flags) } if (unit == ndkwedges) rc = ENXIO; - else if ((rc = dkwedge_begindetach(sc, flags)) == 0) { + else if ((rc = dkwedge_cleanup_parent(sc, flags)) == 0) { /* Mark the wedge as dying. */ sc-sc_state = DKW_STATE_DYING; } @@ -579,20 +604,7 @@ dkwedge_detach(device_t self, int flags) vdevgone(cmaj, unit, unit, VCHR); /* Clean up the parent. */ - mutex_enter(sc-sc_dk.dk_openlock); - if (sc-sc_dk.dk_openmask) { - mutex_enter(sc-sc_parent-dk_rawlock); - if (sc-sc_parent-dk_rawopens-- == 1) { - KASSERT(sc-sc_parent-dk_rawvp != NULL); - mutex_exit(sc-sc_parent-dk_rawlock); - (void) vn_close(sc-sc_parent-dk_rawvp, FREAD | FWRITE, - NOCRED); - sc-sc_parent-dk_rawvp = NULL; - } else - mutex_exit(sc-sc_parent-dk_rawlock); - sc-sc_dk.dk_openmask = 0; - } - mutex_exit(sc-sc_dk.dk_openlock); + dkwedge_cleanup_parent(sc, flags | DETACH_FORCE); /* Announce our departure. */ aprint_normal(%s at %s (%s) deleted\n, device_xname(sc-sc_dev), @@ -631,13 +643,27 @@ dkwedge_detach(device_t self, int flags) void dkwedge_delall(struct disk *pdk) { + dkwedge_delall1(pdk, false); +} + +static void +dkwedge_delall1(struct disk *pdk, bool idleonly) +{ struct dkwedge_info dkw; struct dkwedge_softc *sc; + int flags; + + flags = DETACH_QUIET; + if (!idleonly) flags |= DETACH_FORCE;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: apb Date: Sat Aug 30 09:35:10 UTC 2014 Modified Files: src/sys/dev/dkwedge: dkwedge_bsdlabel.c Log Message: When converting a disklabel partition type integer to a wedge partition type string, use the strings defined in DKW_PTYPE_* in sys/disk.h, not the strings defined in FSTYPE_DEFN in sys/disklabel.h. This corrects a problem introduced in revision 1.21 dated 2014-08-18. That change was intended to add additional case to the list, but it accidentally also changed from the strings in the DKW_PTYPE_* macros to the strings in the FSTYPE_DEFN macro. Many of the strings are the same, but there are differences such as RAID versus raidframe and MSDOS versus FAT. XXX: There seems to be no good reason for the differences in string names for partition types. One or both of the lists should probably be edited to align them. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 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.21 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.22 --- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.21 Mon Aug 18 14:18:59 2014 +++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c Sat Aug 30 09:35:10 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_bsdlabel.c,v 1.21 2014/08/18 14:18:59 apb Exp $ */ +/* $NetBSD: dkwedge_bsdlabel.c,v 1.22 2014/08/30 09:35:10 apb 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.21 2014/08/18 14:18:59 apb Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_bsdlabel.c,v 1.22 2014/08/30 09:35:10 apb Exp $); #include sys/param.h #ifdef _KERNEL @@ -150,7 +150,7 @@ bsdlabel_fstype_to_str(uint8_t fstype) */ switch (fstype) { #define FSTYPE_TO_STR_CASE(tag, number, name, fsck, mount) \ - case __CONCAT(FS_,tag): str = name; break; + case __CONCAT(FS_,tag): str = __CONCAT(DKW_PTYPE_,tag); break; FSTYPE_DEFN(FSTYPE_TO_STR_CASE) #undef FSTYPE_TO_STR_CASE default: str = NULL; break;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: riastradh Date: Thu Aug 28 19:37:46 UTC 2014 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Make dk(4) discard from partition start, not from disk start. Otherwise, anything mounted with `-o discard' will pretty quickly munch itself up and barf up an unrecoverably corrupted file system! XXX pullup to netbsd-7 To generate a diff of this commit: cvs rdiff -u -r1.72 -r1.73 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.72 src/sys/dev/dkwedge/dk.c:1.73 --- src/sys/dev/dkwedge/dk.c:1.72 Fri Jul 25 08:23:56 2014 +++ src/sys/dev/dkwedge/dk.c Thu Aug 28 19:37:46 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $ */ +/* $NetBSD: dk.c,v 1.73 2014/08/28 19:37:46 riastradh Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.73 2014/08/28 19:37:46 riastradh Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -1350,6 +1350,8 @@ static int dkdiscard(dev_t dev, off_t pos, off_t len) { struct dkwedge_softc *sc = dkwedge_lookup(dev); + unsigned shift; + off_t offset, maxlen; if (sc == NULL) return (ENODEV); @@ -1358,6 +1360,21 @@ dkdiscard(dev_t dev, off_t pos, off_t le if (sc-sc_parent-dk_rawvp == NULL) return (ENXIO); + shift = (sc-sc_parent-dk_blkshift + DEV_BSHIFT); + KASSERT(__type_fit(off_t, sc-sc_size)); + KASSERT(__type_fit(off_t, sc-sc_offset)); + KASSERT(0 = sc-sc_offset); + KASSERT(sc-sc_size = (__type_max(off_t) shift)); + KASSERT(sc-sc_offset = ((__type_max(off_t) shift) - sc-sc_size)); + offset = ((off_t)sc-sc_offset shift); + maxlen = ((off_t)sc-sc_size shift); + + if (len maxlen) + return (EINVAL); + if (pos (maxlen - len)) + return (EINVAL); + + pos += offset; return VOP_FDISCARD(sc-sc_parent-dk_rawvp, pos, len); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: apb Date: Mon Aug 18 13:46:07 UTC 2014 Modified Files: src/sys/dev/dkwedge: dkwedge_bsdlabel.c Log Message: Don't ignore unrecognised partition types in BSD disklabels; instead, add them with wedge partition type unknown#%u, where %u is the underlying numeric partition type from the BSD disklabel. To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 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.19 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.20 --- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.19 Mon Mar 31 11:25:49 2014 +++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c Mon Aug 18 13:46:07 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_bsdlabel.c,v 1.19 2014/03/31 11:25:49 martin Exp $ */ +/* $NetBSD: dkwedge_bsdlabel.c,v 1.20 2014/08/18 13:46:07 apb 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.19 2014/03/31 11:25:49 martin Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_bsdlabel.c,v 1.20 2014/08/18 13:46:07 apb Exp $); #include sys/param.h #ifdef _KERNEL @@ -232,18 +232,15 @@ addwedges(const mbr_args_t *a, const str if (p-p_fstype == FS_UNUSED) continue; - if ((ptype = bsdlabel_fstype_to_str(p-p_fstype)) == NULL) { - /* - * XXX Should probably just add these... - * XXX maybe just have an empty ptype? - */ - aprint_verbose(%s: skipping partition %d, type %d\n, - a-pdk-dk_name, i, p-p_fstype); - continue; - } - strcpy(dkw.dkw_ptype, ptype); + ptype = bsdlabel_fstype_to_str(p-p_fstype); + if (ptype == NULL) + snprintf(dkw.dkw_ptype, sizeof(dkw.dkw_ptype), + unknown#%u, p-p_fstype); + else + strlcpy(dkw.dkw_ptype, ptype, sizeof(dkw.dkw_ptype)); - strcpy(dkw.dkw_parent, a-pdk-dk_name); + strlcpy(dkw.dkw_parent, a-pdk-dk_name, + sizeof(dkw.dkw_parent)); dkw.dkw_offset = p-p_offset; dkw.dkw_size = p-p_size;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: apb Date: Mon Aug 18 14:18:59 UTC 2014 Modified Files: src/sys/dev/dkwedge: dkwedge_bsdlabel.c Log Message: Use FSTYPE_DEFN from sys/disklabel.h to generate case branches for conversions from all known disklabel fstypes to strings. This replaces the hand-coded list of conversions for only a few of the known types. To generate a diff of this commit: cvs rdiff -u -r1.20 -r1.21 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.20 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.21 --- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.20 Mon Aug 18 13:46:07 2014 +++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c Mon Aug 18 14:18:59 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_bsdlabel.c,v 1.20 2014/08/18 13:46:07 apb Exp $ */ +/* $NetBSD: dkwedge_bsdlabel.c,v 1.21 2014/08/18 14:18:59 apb 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.20 2014/08/18 13:46:07 apb Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_bsdlabel.c,v 1.21 2014/08/18 14:18:59 apb Exp $); #include sys/param.h #ifdef _KERNEL @@ -144,21 +144,15 @@ bsdlabel_fstype_to_str(uint8_t fstype) { const char *str; + /* + * For each type known to FSTYPE_DEFN (from sys/disklabel.h), + * a suitable case branch will convert the type number to a string. + */ switch (fstype) { - case FS_UNUSED: str = DKW_PTYPE_UNUSED; break; - case FS_SWAP: str = DKW_PTYPE_SWAP; break; - case FS_BSDFFS: str = DKW_PTYPE_FFS; break; - case FS_MSDOS: str = DKW_PTYPE_FAT; break; - case FS_BSDLFS: str = DKW_PTYPE_LFS; break; - case FS_ISO9660: str = DKW_PTYPE_ISO9660; break; - case FS_ADOS: str = DKW_PTYPE_AMIGADOS; break; - case FS_HFS: str = DKW_PTYPE_APPLEHFS; break; - case FS_FILECORE: str = DKW_PTYPE_FILECORE; break; - case FS_EX2FS: str = DKW_PTYPE_EXT2FS; break; - case FS_NTFS: str = DKW_PTYPE_NTFS; break; - case FS_RAID: str = DKW_PTYPE_RAIDFRAME; break; - case FS_CCD: str = DKW_PTYPE_CCD; break; - case FS_APPLEUFS: str = DKW_PTYPE_APPLEUFS; break; +#define FSTYPE_TO_STR_CASE(tag, number, name, fsck, mount) \ + case __CONCAT(FS_,tag): str = name; break; + FSTYPE_DEFN(FSTYPE_TO_STR_CASE) +#undef FSTYPE_TO_STR_CASE default: str = NULL; break; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: dholland Date: Fri Jul 25 08:23:57 UTC 2014 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Implement d_discard for dk. This closes PR 47940. To generate a diff of this commit: cvs rdiff -u -r1.71 -r1.72 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.71 src/sys/dev/dkwedge/dk.c:1.72 --- src/sys/dev/dkwedge/dk.c:1.71 Fri Jul 25 08:10:36 2014 +++ src/sys/dev/dkwedge/dk.c Fri Jul 25 08:23:56 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.71 2014/07/25 08:10:36 dholland Exp $ */ +/* $NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.71 2014/07/25 08:10:36 dholland Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.72 2014/07/25 08:23:56 dholland Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -108,6 +108,7 @@ static dev_type_ioctl(dkioctl); static dev_type_strategy(dkstrategy); static dev_type_dump(dkdump); static dev_type_size(dksize); +static dev_type_discard(dkdiscard); const struct bdevsw dk_bdevsw = { .d_open = dkopen, @@ -116,7 +117,7 @@ const struct bdevsw dk_bdevsw = { .d_ioctl = dkioctl, .d_dump = dkdump, .d_psize = dksize, - .d_discard = nodiscard, + .d_discard = dkdiscard, .d_flag = D_DISK }; @@ -131,7 +132,7 @@ const struct cdevsw dk_cdevsw = { .d_poll = nopoll, .d_mmap = nommap, .d_kqfilter = nokqfilter, - .d_discard = nodiscard, + .d_discard = dkdiscard, .d_flag = D_DISK }; @@ -1341,6 +1342,26 @@ dkioctl(dev_t dev, u_long cmd, void *dat } /* + * dkdiscard: [devsw entry point] + * + * Perform a discard-range request on a wedge. + */ +static int +dkdiscard(dev_t dev, off_t pos, off_t len) +{ + struct dkwedge_softc *sc = dkwedge_lookup(dev); + + if (sc == NULL) + return (ENODEV); + if (sc-sc_state != DKW_STATE_RUNNING) + return (ENXIO); + if (sc-sc_parent-dk_rawvp == NULL) + return (ENXIO); + + return VOP_FDISCARD(sc-sc_parent-dk_rawvp, pos, len); +} + +/* * dksize: [devsw entry point] * * Query the size of a wedge for the purpose of performing a dump
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: soren Date: Sat Aug 3 18:30:57 UTC 2013 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Don't complain about not being able to open empty removable media drives. To generate a diff of this commit: cvs rdiff -u -r1.66 -r1.67 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.66 src/sys/dev/dkwedge/dk.c:1.67 --- src/sys/dev/dkwedge/dk.c:1.66 Wed May 29 00:47:48 2013 +++ src/sys/dev/dkwedge/dk.c Sat Aug 3 18:30:57 2013 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.66 2013/05/29 00:47:48 christos Exp $ */ +/* $NetBSD: dk.c,v 1.67 2013/08/03 18:30:57 soren Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.66 2013/05/29 00:47:48 christos Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.67 2013/08/03 18:30:57 soren Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -846,8 +846,9 @@ dkwedge_discover(struct disk *pdk) error = VOP_OPEN(vp, FREAD | FSILENT, NOCRED); if (error) { - aprint_error(%s: unable to open device, error = %d\n, - pdk-dk_name, error); + if (error != ENODEV) + aprint_error(%s: unable to open device, error = %d\n, + pdk-dk_name, error); vput(vp); goto out; }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Thu Jun 7 16:15:32 UTC 2012 Modified Files: src/sys/dev/dkwedge: dkwedge_bsdlabel.c Log Message: Use the label's packname to create wedge names instead of the classic device names. Fall back to classic device names when the label has an empty name or the default name 'fictitious'. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 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.16 src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.17 --- src/sys/dev/dkwedge/dkwedge_bsdlabel.c:1.16 Sat Dec 5 16:29:14 2009 +++ src/sys/dev/dkwedge/dkwedge_bsdlabel.c Thu Jun 7 16:15:31 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_bsdlabel.c,v 1.16 2009/12/05 16:29:14 pooka Exp $ */ +/* $NetBSD: dkwedge_bsdlabel.c,v 1.17 2012/06/07 16:15:31 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.16 2009/12/05 16:29:14 pooka Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_bsdlabel.c,v 1.17 2012/06/07 16:15:31 mlelstv Exp $); #include sys/param.h #ifdef _KERNEL @@ -248,11 +248,20 @@ addwedges(const mbr_args_t *a, const str dkw.dkw_size = p-p_size; /* - * These get historical disk naming style + * If the label defines a name, append the partition + * letter and use it as the wedge name. + * Otherwise use historical disk naming style * wedge names. */ - snprintf((char *)dkw.dkw_wname, sizeof(dkw.dkw_wname), - %s%c, a-pdk-dk_name, 'a' + i); + if (lp-d_packname[0] + strcmp(lp-d_packname,fictitious) != 0) { + snprintf((char *)dkw.dkw_wname, sizeof(dkw.dkw_wname), + %.*s/%c, (int)sizeof(dkw.dkw_wname)-3, +lp-d_packname, 'a' + i); + } else { + snprintf((char *)dkw.dkw_wname, sizeof(dkw.dkw_wname), + %s%c, a-pdk-dk_name, 'a' + i); + } error = dkwedge_add(dkw); if (error == EEXIST)
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Sat Apr 7 05:09:09 UTC 2012 Modified Files: src/sys/dev/dkwedge: dkwedge_mbr.c Log Message: use the partition sector size. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 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_mbr.c diff -u src/sys/dev/dkwedge/dkwedge_mbr.c:1.6 src/sys/dev/dkwedge/dkwedge_mbr.c:1.7 --- src/sys/dev/dkwedge/dkwedge_mbr.c:1.6 Mon Apr 28 16:23:48 2008 +++ src/sys/dev/dkwedge/dkwedge_mbr.c Sat Apr 7 01:09:09 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_mbr.c,v 1.6 2008/04/28 20:23:48 martin Exp $ */ +/* $NetBSD: dkwedge_mbr.c,v 1.7 2012/04/07 05:09:09 christos 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.6 2008/04/28 20:23:48 martin Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_mbr.c,v 1.7 2012/04/07 05:09:09 christos Exp $); #include sys/param.h #include sys/systm.h @@ -45,12 +45,14 @@ __KERNEL_RCSID(0, $NetBSD: dkwedge_mbr. #include sys/malloc.h #include sys/bootblock.h +#include sys/disklabel.h typedef struct mbr_args { struct disk *pdk; struct vnode *vp; void *buf; int error; + uint32_t secsize; int mbr_count; } mbr_args_t; @@ -86,10 +88,10 @@ 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, DEV_BSIZE); + error = dkwedge_read(a-pdk, a-vp, off, a-buf, a-secsize); if (error) { - aprint_error(%s: unable to read MBR @ %u, - error = %d\n, a-pdk-dk_name, off, a-error); + aprint_error(%s: unable to read MBR @ %u/%u, + error = %d\n, a-pdk-dk_name, off, a-secsize, a-error); a-error = error; return; } @@ -166,8 +168,9 @@ dkwedge_discover_mbr(struct disk *pdk, s mbr_args_t a; a.pdk = pdk; + a.secsize = pdk-dk_label-d_secsize; a.vp = vp; - a.buf = malloc(DEV_BSIZE, M_DEVBUF, M_WAITOK); + a.buf = malloc(a.secsize, M_DEVBUF, M_WAITOK); a.error = 0; a.mbr_count = 0;
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Thu Mar 3 03:39:08 UTC 2011 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: check rawvp before doing ioctl or strategy. To generate a diff of this commit: cvs rdiff -u -r1.59 -r1.60 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.59 src/sys/dev/dkwedge/dk.c:1.60 --- src/sys/dev/dkwedge/dk.c:1.59 Mon Feb 28 13:28:20 2011 +++ src/sys/dev/dkwedge/dk.c Wed Mar 2 22:39:08 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.59 2011/02/28 18:28:20 christos Exp $ */ +/* $NetBSD: dk.c,v 1.60 2011/03/03 03:39:08 christos Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.59 2011/02/28 18:28:20 christos Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.60 2011/03/03 03:39:08 christos Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -1115,7 +1115,9 @@ bp-b_error = ENODEV; goto done; } - if (sc-sc_state != DKW_STATE_RUNNING) { + + if (sc-sc_state != DKW_STATE_RUNNING || + sc-sc_parent-dk_rawvp == NULL) { bp-b_error = ENXIO; goto done; } @@ -1330,6 +1332,8 @@ return (ENODEV); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); + if (sc-sc_parent-dk_rawvp == NULL) + return (ENXIO); error = disk_ioctl(sc-sc_dk, cmd, data, flag, l); if (error != EPASSTHROUGH)
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: christos Date: Mon Feb 28 18:28:20 UTC 2011 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Make error checking consistent, possibly fixes PR/44652. To generate a diff of this commit: cvs rdiff -u -r1.58 -r1.59 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.58 src/sys/dev/dkwedge/dk.c:1.59 --- src/sys/dev/dkwedge/dk.c:1.58 Thu Dec 23 09:22:03 2010 +++ src/sys/dev/dkwedge/dk.c Mon Feb 28 13:28:20 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.58 2010/12/23 14:22:03 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.59 2011/02/28 18:28:20 christos Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.58 2010/12/23 14:22:03 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.59 2011/02/28 18:28:20 christos Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -993,7 +993,6 @@ if (sc == NULL) return (ENODEV); - if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); @@ -1073,6 +1072,11 @@ struct dkwedge_softc *sc = dkwedge_lookup(dev); int error = 0; + if (sc == NULL) + return (ENODEV); + if (sc-sc_state != DKW_STATE_RUNNING) + return (ENXIO); + KASSERT(sc-sc_dk.dk_openmask != 0); mutex_enter(sc-sc_dk.dk_openlock); @@ -1107,6 +,10 @@ uint64_t p_size, p_offset; int s; + if (sc == NULL) { + bp-b_error = ENODEV; + goto done; + } if (sc-sc_state != DKW_STATE_RUNNING) { bp-b_error = ENXIO; goto done; @@ -1281,6 +1289,8 @@ { struct dkwedge_softc *sc = dkwedge_lookup(dev); + if (sc == NULL) + return (ENODEV); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); @@ -1297,6 +1307,8 @@ { struct dkwedge_softc *sc = dkwedge_lookup(dev); + if (sc == NULL) + return (ENODEV); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); @@ -1314,6 +1326,8 @@ struct dkwedge_softc *sc = dkwedge_lookup(dev); int error = 0; + if (sc == NULL) + return (ENODEV); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); @@ -1373,7 +1387,6 @@ if (sc == NULL) return (-1); - if (sc-sc_state != DKW_STATE_RUNNING) return (-1); @@ -1409,8 +1422,7 @@ int rv = 0; if (sc == NULL) - return (ENXIO); - + return (ENODEV); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Thu Dec 23 14:22:03 UTC 2010 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Make wedges aware of underlying physical block size. To generate a diff of this commit: cvs rdiff -u -r1.57 -r1.58 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.57 src/sys/dev/dkwedge/dk.c:1.58 --- src/sys/dev/dkwedge/dk.c:1.57 Wed Aug 4 12:34:00 2010 +++ src/sys/dev/dkwedge/dk.c Thu Dec 23 14:22:03 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.57 2010/08/04 12:34:00 bouyer Exp $ */ +/* $NetBSD: dk.c,v 1.58 2010/12/23 14:22:03 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.57 2010/08/04 12:34:00 bouyer Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.58 2010/12/23 14:22:03 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -235,10 +235,11 @@ geom = prop_dictionary_create(); - prop_dictionary_set_uint64(geom, sectors-per-unit, dkw-dkw_size); + prop_dictionary_set_uint64(geom, sectors-per-unit, + dkw-dkw_size disk-dk_blkshift); prop_dictionary_set_uint32(geom, sector-size, - DEV_BSIZE /* XXX 512? */); + DEV_BSIZE disk-dk_blkshift); prop_dictionary_set_uint32(geom, sectors-per-track, 32); @@ -432,6 +433,7 @@ */ disk_init(sc-sc_dk, device_xname(sc-sc_dev), NULL); + disk_blocksize(sc-sc_dk, DEV_BSIZE pdk-dk_blkshift); dkgetproperties(sc-sc_dk, dkw); disk_attach(sc-sc_dk);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: bouyer Date: Wed Aug 4 12:34:00 UTC 2010 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Make sure to release sc_parent-dk_rawlock before calling vn_close(sc-sc_parent-dk_rawvp). Avoids a lockdebug panic: error: mutex_destroy: assertion failed: !MUTEX_OWNED(mtx-mtx_owner) !MUTEX_HAS_WAITERS(mtx) when the parent is a raidframe device. See also: http://mail-index.netbsd.org/tech-kern/2010/07/27/msg008612.html To generate a diff of this commit: cvs rdiff -u -r1.56 -r1.57 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.56 src/sys/dev/dkwedge/dk.c:1.57 --- src/sys/dev/dkwedge/dk.c:1.56 Thu Jun 24 13:03:08 2010 +++ src/sys/dev/dkwedge/dk.c Wed Aug 4 12:34:00 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.56 2010/06/24 13:03:08 hannken Exp $ */ +/* $NetBSD: dk.c,v 1.57 2010/08/04 12:34:00 bouyer Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.56 2010/06/24 13:03:08 hannken Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.57 2010/08/04 12:34:00 bouyer Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -511,14 +511,14 @@ rc = 0; mutex_enter(dk-dk_openlock); - mutex_enter(sc-sc_parent-dk_rawlock); if (dk-dk_openmask == 0) ; /* nothing to do */ else if ((flags DETACH_FORCE) == 0) rc = EBUSY; - else - rc = dklastclose(sc); - mutex_exit(sc-sc_parent-dk_rawlock); + else { + mutex_enter(sc-sc_parent-dk_rawlock); + rc = dklastclose(sc); /* releases dk_rawlock */ + } mutex_exit(dk-dk_openlock); return rc; @@ -577,17 +577,18 @@ /* Clean up the parent. */ mutex_enter(sc-sc_dk.dk_openlock); - mutex_enter(sc-sc_parent-dk_rawlock); if (sc-sc_dk.dk_openmask) { + mutex_enter(sc-sc_parent-dk_rawlock); if (sc-sc_parent-dk_rawopens-- == 1) { KASSERT(sc-sc_parent-dk_rawvp != NULL); + mutex_exit(sc-sc_parent-dk_rawlock); (void) vn_close(sc-sc_parent-dk_rawvp, FREAD | FWRITE, NOCRED); sc-sc_parent-dk_rawvp = NULL; - } + } else + mutex_exit(sc-sc_parent-dk_rawlock); sc-sc_dk.dk_openmask = 0; } - mutex_exit(sc-sc_parent-dk_rawlock); mutex_exit(sc-sc_dk.dk_openlock); /* Announce our departure. */ @@ -1050,10 +1051,12 @@ if (sc-sc_parent-dk_rawopens-- == 1) { KASSERT(sc-sc_parent-dk_rawvp != NULL); + mutex_exit(sc-sc_parent-dk_rawlock); error = vn_close(sc-sc_parent-dk_rawvp, FREAD | FWRITE, NOCRED); sc-sc_parent-dk_rawvp = NULL; - } + } else + mutex_exit(sc-sc_parent-dk_rawlock); return error; } @@ -1081,9 +1084,10 @@ sc-sc_dk.dk_copenmask | sc-sc_dk.dk_bopenmask; if (sc-sc_dk.dk_openmask == 0) - error = dklastclose(sc); + error = dklastclose(sc); /* releases dk_rawlock */ + else + mutex_exit(sc-sc_parent-dk_rawlock); - mutex_exit(sc-sc_parent-dk_rawlock); mutex_exit(sc-sc_dk.dk_openlock); return (error);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jakllsch Date: Mon May 17 23:09:52 UTC 2010 Modified Files: src/sys/dev/dkwedge: dkwedge_gpt.c Log Message: Use wput_utf8() to improve conversion of UTF-16 GPT partition names to UTF-8. Drop static CRC32 function in favor of the one from libkern. To generate a diff of this commit: cvs rdiff -u -r1.11 -r1.12 src/sys/dev/dkwedge/dkwedge_gpt.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_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.11 src/sys/dev/dkwedge/dkwedge_gpt.c:1.12 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.11 Mon Jan 25 14:51:03 2010 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Mon May 17 23:09:52 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.11 2010/01/25 14:51:03 mlelstv Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.12 2010/05/17 23:09:52 jakllsch 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.11 2010/01/25 14:51:03 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_gpt.c,v 1.12 2010/05/17 23:09:52 jakllsch Exp $); #include sys/param.h #include sys/systm.h @@ -47,6 +47,9 @@ #include sys/disklabel_gpt.h #include sys/uuid.h +/* UTF-8 encoding stuff */ +#include fs/unicode.h + /* * GUID to dkw_ptype mapping information. * @@ -86,29 +89,6 @@ return (DKW_PTYPE_UNKNOWN); } -static const uint32_t gpt_crc_tab[16] = { - 0xU, 0x1db71064U, 0x3b6e20c8U, 0x26d930acU, - 0x76dc4190U, 0x6b6b51f4U, 0x4db26158U, 0x5005713cU, - 0xedb88320U, 0xf00f9344U, 0xd6d6a3e8U, 0xcb61b38cU, - 0x9b64c2b0U, 0x86d3d2d4U, 0xa00ae278U, 0xbdbdf21cU -}; - -static uint32_t -gpt_crc32(const void *vbuf, size_t len) -{ - const uint8_t *buf = vbuf; - uint32_t crc; - - crc = 0xU; - while (len--) { - crc ^= *buf++; - crc = (crc 4) ^ gpt_crc_tab[crc 0xf]; - crc = (crc 4) ^ gpt_crc_tab[crc 0xf]; - } - - return (crc ^ 0xU); -} - static int gpt_verify_header_crc(struct gpt_hdr *hdr) { @@ -117,7 +97,7 @@ crc = hdr-hdr_crc_self; hdr-hdr_crc_self = 0; - rv = le32toh(crc) == gpt_crc32(hdr, le32toh(hdr-hdr_size)); + rv = le32toh(crc) == crc32(0, (void *)hdr, le32toh(hdr-hdr_size)); hdr-hdr_crc_self = crc; return (rv); @@ -138,6 +118,8 @@ uint32_t gpe_crc; int error; u_int i; + size_t r, n; + uint8_t *c; secsize = DEV_BSIZE pdk-dk_blkshift; buf = malloc(secsize, M_DEVBUF, M_WAITOK); @@ -224,7 +206,7 @@ goto out; } - if (gpt_crc32(buf, entries * entsz) != gpe_crc) { + if (crc32(0, buf, entries * entsz) != gpe_crc) { /* XXX Should check alternate location. */ aprint_error(%s: bad GPT partition array CRC\n, pdk-dk_name); @@ -268,12 +250,15 @@ if (ent-ent_name[0] == 0x) strcpy(dkw.dkw_wname, ent_guid_str); else { + c = dkw.dkw_wname; + r = sizeof(dkw.dkw_wname) - 1; for (j = 0; ent-ent_name[j] != 0x; j++) { -/* XXX UTF-16 - UTF-8 */ -dkw.dkw_wname[j] = -le16toh(ent-ent_name[j]) 0xff; +n = wput_utf8(c, r, le16toh(ent-ent_name[j])); +if (n == 0) + break; +c += n; r -= n; } - dkw.dkw_wname[j] = '\0'; + *c = '\0'; } /*
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Sun Feb 7 16:04:31 UTC 2010 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: d_psize routine returns a number of blocks or -1 on error. d_dump routine returns 0 or an error code. To generate a diff of this commit: cvs rdiff -u -r1.54 -r1.55 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.54 src/sys/dev/dkwedge/dk.c:1.55 --- src/sys/dev/dkwedge/dk.c:1.54 Mon Jan 25 14:51:03 2010 +++ src/sys/dev/dkwedge/dk.c Sun Feb 7 16:04:31 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.54 2010/01/25 14:51:03 mlelstv Exp $ */ +/* $NetBSD: dk.c,v 1.55 2010/02/07 16:04:31 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.54 2010/01/25 14:51:03 mlelstv Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.55 2010/02/07 16:04:31 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -1369,7 +1369,7 @@ return (-1); if (sc-sc_state != DKW_STATE_RUNNING) - return (ENXIO); + return (-1); mutex_enter(sc-sc_dk.dk_openlock); mutex_enter(sc-sc_parent-dk_rawlock); @@ -1403,7 +1403,7 @@ int rv = 0; if (sc == NULL) - return (-1); + return (ENXIO); if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: mlelstv Date: Mon Jan 25 14:51:03 UTC 2010 Modified Files: src/sys/dev/dkwedge: dk.c dkwedge_gpt.c Log Message: GPTs are defined in terms of physical blocks. - Fix reading of GPT for devices with non-512byte sectors - Fix bounds check to use DEV_BSIZE units. To generate a diff of this commit: cvs rdiff -u -r1.53 -r1.54 src/sys/dev/dkwedge/dk.c cvs rdiff -u -r1.10 -r1.11 src/sys/dev/dkwedge/dkwedge_gpt.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.53 src/sys/dev/dkwedge/dk.c:1.54 --- src/sys/dev/dkwedge/dk.c:1.53 Sat Jan 23 18:31:04 2010 +++ src/sys/dev/dkwedge/dk.c Mon Jan 25 14:51:03 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.53 2010/01/23 18:31:04 bouyer Exp $ */ +/* $NetBSD: dk.c,v 1.54 2010/01/25 14:51:03 mlelstv Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.53 2010/01/23 18:31:04 bouyer Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.54 2010/01/25 14:51:03 mlelstv Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -1098,6 +1098,7 @@ dkstrategy(struct buf *bp) { struct dkwedge_softc *sc = dkwedge_lookup(bp-b_dev); + uint64_t p_size, p_offset; int s; if (sc-sc_state != DKW_STATE_RUNNING) { @@ -1109,12 +1110,15 @@ if (bp-b_bcount == 0) goto done; + p_offset = sc-sc_offset sc-sc_parent-dk_blkshift; + p_size = sc-sc_size sc-sc_parent-dk_blkshift; + /* Make sure it's in-range. */ - if (bounds_check_with_mediasize(bp, DEV_BSIZE, sc-sc_size) = 0) + if (bounds_check_with_mediasize(bp, DEV_BSIZE, p_size) = 0) goto done; /* Translate it to the parent's raw LBA. */ - bp-b_rawblkno = bp-b_blkno + sc-sc_offset; + bp-b_rawblkno = bp-b_blkno + p_offset; /* Place it in the queue and start I/O on the unit. */ s = splbio(); Index: src/sys/dev/dkwedge/dkwedge_gpt.c diff -u src/sys/dev/dkwedge/dkwedge_gpt.c:1.10 src/sys/dev/dkwedge/dkwedge_gpt.c:1.11 --- src/sys/dev/dkwedge/dkwedge_gpt.c:1.10 Thu Oct 23 19:37:40 2008 +++ src/sys/dev/dkwedge/dkwedge_gpt.c Mon Jan 25 14:51:03 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: dkwedge_gpt.c,v 1.10 2008/10/23 19:37:40 jakllsch Exp $ */ +/* $NetBSD: dkwedge_gpt.c,v 1.11 2010/01/25 14:51:03 mlelstv 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.10 2008/10/23 19:37:40 jakllsch Exp $); +__KERNEL_RCSID(0, $NetBSD: dkwedge_gpt.c,v 1.11 2010/01/25 14:51:03 mlelstv Exp $); #include sys/param.h #include sys/systm.h @@ -130,6 +130,7 @@ static const char gpt_hdr_sig[] = GPT_HDR_SIG; struct dkwedge_info dkw; void *buf; + uint32_t secsize; struct gpt_hdr *hdr; struct gpt_ent *ent; uint32_t entries, entsz; @@ -138,7 +139,8 @@ int error; u_int i; - buf = malloc(DEV_BSIZE, M_DEVBUF, M_WAITOK); + secsize = DEV_BSIZE pdk-dk_blkshift; + buf = malloc(secsize, M_DEVBUF, M_WAITOK); /* * Note: We don't bother with a Legacy or Protective MBR @@ -147,7 +149,7 @@ */ /* Read in the GPT Header. */ - error = dkwedge_read(pdk, vp, GPT_HDR_BLKNO, buf, DEV_BSIZE); + error = dkwedge_read(pdk, vp, GPT_HDR_BLKNO pdk-dk_blkshift, buf, secsize); if (error) goto out; hdr = buf; @@ -163,7 +165,7 @@ error = ESRCH; goto out; } - if (le32toh(hdr-hdr_size) DEV_BSIZE) { + if (le32toh(hdr-hdr_size) secsize) { /* XXX Should check at end-of-disk. */ error = ESRCH; goto out; @@ -212,9 +214,9 @@ } free(buf, M_DEVBUF); - buf = malloc(roundup(entries * entsz, DEV_BSIZE), M_DEVBUF, M_WAITOK); - error = dkwedge_read(pdk, vp, lba_table, buf, - roundup(entries * entsz, DEV_BSIZE)); + 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)); if (error) { /* XXX Should check alternate location. */ aprint_error(%s: unable to read GPT partition array,
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: jakllsch Date: Sun Dec 27 01:37:17 UTC 2009 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Implement and use a dkminphys() that calls the parent device's minphys function with b_dev temporarily adjusted to the parent device's dev_t. Fixes PR/37390. To generate a diff of this commit: cvs rdiff -u -r1.51 -r1.52 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.51 src/sys/dev/dkwedge/dk.c:1.52 --- src/sys/dev/dkwedge/dk.c:1.51 Tue Sep 8 21:14:33 2009 +++ src/sys/dev/dkwedge/dk.c Sun Dec 27 01:37:17 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $ */ +/* $NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.52 2009/12/27 01:37:17 jakllsch Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -95,6 +95,7 @@ static void dkstart(struct dkwedge_softc *); static void dkiodone(struct buf *); static void dkrestart(void *); +static void dkminphys(struct buf *); static int dklastclose(struct dkwedge_softc *); static int dkwedge_detach(device_t, int); @@ -1242,6 +1243,23 @@ } /* + * dkminphys: + * + * Call parent's minphys function. + */ +static void +dkminphys(struct buf *bp) +{ + struct dkwedge_softc *sc = dkwedge_lookup(bp-b_dev); + dev_t dev; + + dev = bp-b_dev; + bp-b_dev = sc-sc_pdev; + (*sc-sc_parent-dk_driver-d_minphys)(bp); + bp-b_dev = dev; +} + +/* * dkread: [devsw entry point] * * Read from a wedge. @@ -1254,8 +1272,7 @@ if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); - return (physio(dkstrategy, NULL, dev, B_READ, - sc-sc_parent-dk_driver-d_minphys, uio)); + return (physio(dkstrategy, NULL, dev, B_READ, dkminphys, uio)); } /* @@ -1271,8 +1288,7 @@ if (sc-sc_state != DKW_STATE_RUNNING) return (ENXIO); - return (physio(dkstrategy, NULL, dev, B_WRITE, - sc-sc_parent-dk_driver-d_minphys, uio)); + return (physio(dkstrategy, NULL, dev, B_WRITE, dkminphys, uio)); } /*
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: pooka Date: Tue Sep 8 21:14:33 UTC 2009 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: dkwedge_list() is currently called only from ioctl routines where l == curlwp. Since there is no perceived case where we'd ever want to copy the list to non-curlwp, simplify the code a bit. (the struct lwp * argument could probably be dropped too, but that's another commit) To generate a diff of this commit: cvs rdiff -u -r1.50 -r1.51 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.50 src/sys/dev/dkwedge/dk.c:1.51 --- src/sys/dev/dkwedge/dk.c:1.50 Mon Sep 7 13:59:38 2009 +++ src/sys/dev/dkwedge/dk.c Tue Sep 8 21:14:33 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.50 2009/09/07 13:59:38 pooka Exp $ */ +/* $NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.50 2009/09/07 13:59:38 pooka Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.51 2009/09/08 21:14:33 pooka Exp $); #ifdef _KERNEL_OPT #include opt_dkwedge.h @@ -658,7 +658,6 @@ struct iovec iov; struct dkwedge_softc *sc; struct dkwedge_info dkw; - struct vmspace *vm; int error = 0; iov.iov_base = dkwl-dkwl_buf; @@ -669,15 +668,8 @@ uio.uio_offset = 0; uio.uio_resid = dkwl-dkwl_bufsize; uio.uio_rw = UIO_READ; - if (l == NULL) { - UIO_SETUP_SYSSPACE(uio); - } else { - error = proc_vmspace_getref(l-l_proc, vm); - if (error) { - return error; - } - uio.uio_vmspace = vm; - } + KASSERT(l == curlwp); + uio.uio_vmspace = l-l_proc-p_vmspace; dkwl-dkwl_ncopied = 0; @@ -706,10 +698,6 @@ dkwl-dkwl_nwedges = pdk-dk_nwedges; mutex_exit(pdk-dk_openlock); - if (l != NULL) { - uvmspace_free(vm); - } - return (error); }
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: pooka Date: Mon Sep 7 13:59:38 UTC 2009 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: grow some _KERNEL_POT To generate a diff of this commit: cvs rdiff -u -r1.49 -r1.50 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.49 src/sys/dev/dkwedge/dk.c:1.50 --- src/sys/dev/dkwedge/dk.c:1.49 Sun Sep 6 16:18:55 2009 +++ src/sys/dev/dkwedge/dk.c Mon Sep 7 13:59:38 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.49 2009/09/06 16:18:55 pooka Exp $ */ +/* $NetBSD: dk.c,v 1.50 2009/09/07 13:59:38 pooka Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,9 +30,11 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.49 2009/09/06 16:18:55 pooka Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.50 2009/09/07 13:59:38 pooka Exp $); +#ifdef _KERNEL_OPT #include opt_dkwedge.h +#endif #include sys/param.h #include sys/systm.h
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: dyoung Date: Thu Jul 2 00:56:48 UTC 2009 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: Extract subroutine dklastclose(). This is a step toward detachable dk(4). To generate a diff of this commit: cvs rdiff -u -r1.45 -r1.46 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.45 src/sys/dev/dkwedge/dk.c:1.46 --- src/sys/dev/dkwedge/dk.c:1.45 Tue May 12 14:19:40 2009 +++ src/sys/dev/dkwedge/dk.c Thu Jul 2 00:56:48 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.45 2009/05/12 14:19:40 cegger Exp $ */ +/* $NetBSD: dk.c,v 1.46 2009/07/02 00:56:48 dyoung Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.45 2009/05/12 14:19:40 cegger Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.46 2009/07/02 00:56:48 dyoung Exp $); #include opt_dkwedge.h @@ -94,6 +94,8 @@ static void dkiodone(struct buf *); static void dkrestart(void *); +static int dklastclose(struct dkwedge_softc *); + static dev_type_open(dkopen); static dev_type_close(dkclose); static dev_type_read(dkread); @@ -954,6 +956,23 @@ } /* + * Caller must hold sc-sc_dk.dk_openlock and sc-sc_parent-dk_rawlock. + */ +static int +dklastclose(struct dkwedge_softc *sc) +{ + int error = 0; + + if (sc-sc_parent-dk_rawopens-- == 1) { + KASSERT(sc-sc_parent-dk_rawvp != NULL); + error = vn_close(sc-sc_parent-dk_rawvp, + FREAD | FWRITE, NOCRED); + sc-sc_parent-dk_rawvp = NULL; + } + return error; +} + +/* * dkclose: [devsw entry point] * * Close a wedge. @@ -976,14 +995,8 @@ sc-sc_dk.dk_openmask = sc-sc_dk.dk_copenmask | sc-sc_dk.dk_bopenmask; - if (sc-sc_dk.dk_openmask == 0) { - if (sc-sc_parent-dk_rawopens-- == 1) { - KASSERT(sc-sc_parent-dk_rawvp != NULL); - error = vn_close(sc-sc_parent-dk_rawvp, - FREAD | FWRITE, NOCRED); - sc-sc_parent-dk_rawvp = NULL; - } - } + if (sc-sc_dk.dk_openmask == 0) + error = dklastclose(sc); mutex_exit(sc-sc_parent-dk_rawlock); mutex_exit(sc-sc_dk.dk_openlock);
CVS commit: src/sys/dev/dkwedge
Module Name:src Committed By: cegger Date: Tue May 12 12:12:26 UTC 2009 Modified Files: src/sys/dev/dkwedge: dk.c Log Message: struct cfdata * - cfdata_t, no functional changes intended. To generate a diff of this commit: cvs rdiff -u -r1.43 -r1.44 src/sys/dev/dkwedge/dk.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/dk.c diff -u src/sys/dev/dkwedge/dk.c:1.43 src/sys/dev/dkwedge/dk.c:1.44 --- src/sys/dev/dkwedge/dk.c:1.43 Tue Jan 13 13:35:53 2009 +++ src/sys/dev/dkwedge/dk.c Tue May 12 12:12:26 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.43 2009/01/13 13:35:53 yamt Exp $ */ +/* $NetBSD: dk.c,v 1.44 2009/05/12 12:12:26 cegger Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include sys/cdefs.h -__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.43 2009/01/13 13:35:53 yamt Exp $); +__KERNEL_RCSID(0, $NetBSD: dk.c,v 1.44 2009/05/12 12:12:26 cegger Exp $); #include opt_dkwedge.h @@ -125,7 +125,7 @@ * Autoconfiguration match function for pseudo-device glue. */ static int -dkwedge_match(struct device *parent, struct cfdata *match, +dkwedge_match(struct device *parent, cfdata_t match, void *aux) {