X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/blobdiff_plain/23dc68ce9b32d0cd219dc928df15e1beabd74be5..590ba11dd1b31a5cbd5ae62f96ba8eea413eceee:/sys/dev/raid/mfi/mfi_syspd.c diff --git a/sys/dev/raid/mfi/mfi_syspd.c b/sys/dev/raid/mfi/mfi_syspd.c index c96e7fb3a2..f56a80335e 100644 --- a/sys/dev/raid/mfi/mfi_syspd.c +++ b/sys/dev/raid/mfi/mfi_syspd.c @@ -29,6 +29,7 @@ * official policies,either expressed or implied, of the FreeBSD Project. * * $FreeBSD: src/sys/dev/mfi/mfi_pddisk.c,v 1.2.2.6 2007/08/24 17:29:18 jhb Exp $ + * FreeBSD projects/head_mfi/ r232888 */ #include "opt_mfi.h" @@ -88,7 +89,7 @@ static driver_t mfi_syspd_driver = { sizeof(struct mfi_system_pd) }; -DRIVER_MODULE(mfisyspd, mfi, mfi_syspd_driver, mfi_syspd_devclass, 0, 0); +DRIVER_MODULE(mfisyspd, mfi, mfi_syspd_driver, mfi_syspd_devclass, NULL, NULL); static int mfi_syspd_probe(device_t dev) @@ -212,7 +213,8 @@ mfi_syspd_disable(struct mfi_system_pd *sc) if (sc->pd_flags & MFI_DISK_FLAGS_OPEN) { if (sc->pd_controller->mfi_delete_busy_volumes) return (0); - device_printf(sc->pd_dev, "Unable to delete busy syspd device\n"); + device_printf(sc->pd_dev, + "Unable to delete busy syspd device\n"); return (EBUSY); } sc->pd_flags |= MFI_DISK_FLAGS_DISABLED; @@ -233,7 +235,7 @@ mfi_syspd_strategy(struct dev_strategy_args *ap) struct bio *bio = ap->a_bio; struct buf *bp = bio->bio_buf; struct mfi_system_pd *sc = ap->a_head.a_dev->si_drv1; - struct mfi_softc *controller; + struct mfi_softc *controller = sc->pd_controller; if (sc == NULL) { bp->b_error = EINVAL; @@ -243,6 +245,16 @@ mfi_syspd_strategy(struct dev_strategy_args *ap) return (0); } + if (controller->hw_crit_error) { + bp->b_error = EBUSY; + return (0); + } + + if (controller->issuepend_done == 0) { + bp->b_error = EBUSY; + return (0); + } + /* * XXX swildner * @@ -262,7 +274,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap) return (0); } - controller = sc->pd_controller; bio->bio_driver_info = sc; lockmgr(&controller->mfi_io_lock, LK_EXCLUSIVE); mfi_enqueue_bio(controller, bio); @@ -272,26 +283,6 @@ mfi_syspd_strategy(struct dev_strategy_args *ap) return (0); } -#if 0 -void -mfi_disk_complete(struct bio *bio) -{ - struct mfi_system_pd *sc = bio->bio_driver_info; - struct buf *bp = bio->bio_buf; - - devstat_end_transaction_buf(&sc->pd_devstat, bp); - if (bio->b_flags & B_ERROR) { - if (bp->b_error == 0) - bp->b_error = EIO; - diskerr(bio, sc->pd_disk.d_cdev, "hard error", -1, 1); - kprintf("\n"); - } else { - bp->b_resid = 0; - } - biodone(bio); -} -#endif - static int mfi_syspd_dump(struct dev_dump_args *ap) { @@ -307,8 +298,8 @@ mfi_syspd_dump(struct dev_dump_args *ap) parent_sc = sc->pd_controller; if (len > 0) { - if ((error = mfi_dump_syspd_blocks(parent_sc, sc->pd_id, offset / - MFI_SECTOR_LEN, virt, len)) != 0) + if ((error = mfi_dump_syspd_blocks(parent_sc, + sc->pd_id, offset / MFI_SECTOR_LEN, virt, len)) != 0) return (error); } else { /* mfi_sync_cache(parent_sc, sc->ld_id); */