summaryrefslogtreecommitdiffstats
path: root/sys/dev/mfi/mfi_disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/mfi/mfi_disk.c')
-rw-r--r--sys/dev/mfi/mfi_disk.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/sys/dev/mfi/mfi_disk.c b/sys/dev/mfi/mfi_disk.c
index 4594ca2..b9d44a3 100644
--- a/sys/dev/mfi/mfi_disk.c
+++ b/sys/dev/mfi/mfi_disk.c
@@ -223,7 +223,7 @@ mfi_disk_disable(struct mfi_disk *sc)
if (sc->ld_flags & MFI_DISK_FLAGS_OPEN) {
if (sc->ld_controller->mfi_delete_busy_volumes)
return (0);
- device_printf(sc->ld_dev, "Unable to delete busy device\n");
+ device_printf(sc->ld_dev, "Unable to delete busy ld device\n");
return (EBUSY);
}
sc->ld_flags |= MFI_DISK_FLAGS_DISABLED;
@@ -245,6 +245,7 @@ mfi_disk_strategy(struct bio *bio)
struct mfi_softc *controller;
sc = bio->bio_disk->d_drv1;
+ controller = sc->ld_controller;
if (sc == NULL) {
bio->bio_error = EINVAL;
@@ -254,8 +255,24 @@ mfi_disk_strategy(struct bio *bio)
return;
}
- controller = sc->ld_controller;
+ if (controller->adpreset){
+ bio->bio_error = EBUSY;
+ return;
+ }
+
+ if (controller->hw_crit_error){
+ bio->bio_error = EBUSY;
+ return;
+ }
+
+ if (controller->issuepend_done == 0){
+ bio->bio_error = EBUSY;
+ return;
+ }
+
bio->bio_driver1 = (void *)(uintptr_t)sc->ld_id;
+ /* Mark it as LD IO */
+ bio->bio_driver2 = (void *)MFI_LD_IO;
mtx_lock(&controller->mfi_io_lock);
mfi_enqueue_bio(controller, bio);
mfi_startio(controller);
OpenPOWER on IntegriCloud