CVS commit: src/sys/dev/dkwedge

2021-08-04 Thread Michael van Elst
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

2021-06-02 Thread Michael van Elst
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

2021-06-02 Thread Michael van Elst
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

2021-05-22 Thread Michael van Elst
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

2020-10-06 Thread Michael van Elst
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

2020-05-24 Thread Jared D. McNeill
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

2020-05-03 Thread Rin Okuyama
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

2020-04-11 Thread Jaromir Dolecek
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

2020-02-29 Thread Taylor R Campbell
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

2020-02-27 Thread Shoichi YAMAGUCHI
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

2019-04-10 Thread Michael van Elst
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

2017-09-07 Thread Christos Zoulas
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

2017-09-06 Thread Christos Zoulas
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

2017-02-27 Thread Rin Okuyama
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

2017-02-27 Thread Rin Okuyama
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

2017-02-27 Thread Rin Okuyama
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

2017-02-27 Thread Jaromir Dolecek
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

2017-01-18 Thread Maya Rashish
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

2016-12-24 Thread Michael van Elst
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

2016-12-16 Thread Michael van Elst
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

2016-05-29 Thread Michael van Elst
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

2016-05-29 Thread Michael van Elst
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

2016-04-27 Thread Christos Zoulas
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

2016-04-27 Thread Christos Zoulas
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

2016-01-14 Thread Michael van Elst
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

2015-12-26 Thread Michael van Elst
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

2015-12-01 Thread Christos Zoulas
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

2015-11-28 Thread Michael van Elst
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

2015-10-10 Thread Christos Zoulas
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

2015-10-06 Thread Jared D. McNeill
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

2015-08-25 Thread Antti Kantee
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

2015-08-23 Thread Jonathan A. Kollasch
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

2015-08-22 Thread Michael van Elst
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

2015-08-22 Thread Michael van Elst
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

2015-08-20 Thread Michael van Elst
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

2015-01-23 Thread Christos Zoulas
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

2014-12-08 Thread Michael van Elst
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

2014-11-22 Thread Michael van Elst
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

2014-11-03 Thread Michael van Elst
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

2014-11-03 Thread Michael van Elst
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

2014-11-03 Thread Michael van Elst
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

2014-11-03 Thread Michael van Elst
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

2014-08-30 Thread Alan Barrett
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

2014-08-28 Thread Taylor R Campbell
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

2014-08-18 Thread Alan Barrett
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

2014-08-18 Thread Alan Barrett
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

2014-07-25 Thread David A. Holland
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

2013-08-03 Thread Soren S. Jorvang
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

2012-06-07 Thread Michael van Elst
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

2012-04-06 Thread Christos Zoulas
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

2011-03-02 Thread Christos Zoulas
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

2011-02-28 Thread Christos Zoulas
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

2010-12-23 Thread Michael van Elst
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

2010-08-04 Thread Manuel Bouyer
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

2010-05-17 Thread Jonathan A. Kollasch
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

2010-02-07 Thread Michael van Elst
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

2010-01-25 Thread Michael van Elst
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

2009-12-26 Thread Jonathan A. Kollasch
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

2009-09-08 Thread Antti Kantee
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

2009-09-07 Thread Antti Kantee
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

2009-07-01 Thread David Young
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

2009-05-12 Thread Christoph Egger
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)
 {