6549112 writes to /dev/zfs panic system
authorgw25295
Wed, 25 Apr 2007 12:50:34 -0700
changeset 4107 5b13dedb1ea7
parent 4106 dd61d0159830
child 4108 f12bcec19e0e
6549112 writes to /dev/zfs panic system
usr/src/uts/common/fs/zfs/zvol.c
--- a/usr/src/uts/common/fs/zfs/zvol.c	Wed Apr 25 11:54:45 2007 -0700
+++ b/usr/src/uts/common/fs/zfs/zvol.c	Wed Apr 25 12:50:34 2007 -0700
@@ -903,10 +903,18 @@
 int
 zvol_read(dev_t dev, uio_t *uio, cred_t *cr)
 {
-	zvol_state_t *zv = ddi_get_soft_state(zvol_state, getminor(dev));
+	minor_t minor = getminor(dev);
+	zvol_state_t *zv;
 	rl_t *rl;
 	int error = 0;
 
+	if (minor == 0)			/* This is the control device */
+		return (ENXIO);
+
+	zv = ddi_get_soft_state(zvol_state, minor);
+	if (zv == NULL)
+		return (ENXIO);
+
 	rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
 	    RL_READER);
 	while (uio->uio_resid > 0) {
@@ -924,10 +932,18 @@
 int
 zvol_write(dev_t dev, uio_t *uio, cred_t *cr)
 {
-	zvol_state_t *zv = ddi_get_soft_state(zvol_state, getminor(dev));
+	minor_t minor = getminor(dev);
+	zvol_state_t *zv;
 	rl_t *rl;
 	int error = 0;
 
+	if (minor == 0)			/* This is the control device */
+		return (ENXIO);
+
+	zv = ddi_get_soft_state(zvol_state, minor);
+	if (zv == NULL)
+		return (ENXIO);
+
 	rl = zfs_range_lock(&zv->zv_znode, uio->uio_loffset, uio->uio_resid,
 	    RL_WRITER);
 	while (uio->uio_resid > 0) {