--- 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) {