aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/mlx/mlx_disk.c
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2012-09-17 15:27:30 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2012-09-17 15:27:30 +0000
commit0fca6f8bf5de47b6d016500bf066d584959800f4 (patch)
tree101051e595babb417c37add67ba9f87bd7904b6a /sys/dev/mlx/mlx_disk.c
parent8b3daf895a629984a7c3ef5449c280288fd9dccb (diff)
Notes
Diffstat (limited to 'sys/dev/mlx/mlx_disk.c')
-rw-r--r--sys/dev/mlx/mlx_disk.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/sys/dev/mlx/mlx_disk.c b/sys/dev/mlx/mlx_disk.c
index db86bf85e2e7..8276a4a740e9 100644
--- a/sys/dev/mlx/mlx_disk.c
+++ b/sys/dev/mlx/mlx_disk.c
@@ -36,7 +36,9 @@ __FBSDID("$FreeBSD$");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/kernel.h>
+#include <sys/lock.h>
#include <sys/module.h>
+#include <sys/sx.h>
#include <sys/bus.h>
#include <sys/conf.h>
@@ -84,10 +86,17 @@ mlxd_open(struct disk *dp)
return (ENXIO);
/* controller not active? */
- if (sc->mlxd_controller->mlx_state & MLX_STATE_SHUTDOWN)
+ MLX_CONFIG_LOCK(sc->mlxd_controller);
+ MLX_IO_LOCK(sc->mlxd_controller);
+ if (sc->mlxd_controller->mlx_state & MLX_STATE_SHUTDOWN) {
+ MLX_IO_UNLOCK(sc->mlxd_controller);
+ MLX_CONFIG_UNLOCK(sc->mlxd_controller);
return(ENXIO);
+ }
sc->mlxd_flags |= MLXD_OPEN;
+ MLX_IO_UNLOCK(sc->mlxd_controller);
+ MLX_CONFIG_UNLOCK(sc->mlxd_controller);
return (0);
}
@@ -97,10 +106,14 @@ mlxd_close(struct disk *dp)
struct mlxd_softc *sc = (struct mlxd_softc *)dp->d_drv1;
debug_called(1);
-
+
if (sc == NULL)
return (ENXIO);
+ MLX_CONFIG_LOCK(sc->mlxd_controller);
+ MLX_IO_LOCK(sc->mlxd_controller);
sc->mlxd_flags &= ~MLXD_OPEN;
+ MLX_IO_UNLOCK(sc->mlxd_controller);
+ MLX_CONFIG_UNLOCK(sc->mlxd_controller);
return (0);
}
@@ -142,13 +155,16 @@ mlxd_strategy(mlx_bio *bp)
}
/* XXX may only be temporarily offline - sleep? */
+ MLX_IO_LOCK(sc->mlxd_controller);
if (sc->mlxd_drive->ms_state == MLX_SYSD_OFFLINE) {
+ MLX_IO_UNLOCK(sc->mlxd_controller);
MLX_BIO_SET_ERROR(bp, ENXIO);
goto bad;
}
MLX_BIO_STATS_START(bp);
mlx_submit_buf(sc->mlxd_controller, bp);
+ MLX_IO_UNLOCK(sc->mlxd_controller);
return;
bad:
@@ -232,7 +248,6 @@ mlxd_attach(device_t dev)
sc->mlxd_disk->d_mediasize = MLX_BLKSIZE * (off_t)sc->mlxd_drive->ms_size;
sc->mlxd_disk->d_fwsectors = sc->mlxd_drive->ms_sectors;
sc->mlxd_disk->d_fwheads = sc->mlxd_drive->ms_heads;
- sc->mlxd_disk->d_flags = DISKFLAG_NEEDSGIANT;
/*
* Set maximum I/O size to the lesser of the recommended maximum and the practical