diff options
| author | mycroft <mycroft@NetBSD.org> | 1994-11-22 03:23:49 +0000 |
|---|---|---|
| committer | mycroft <mycroft@NetBSD.org> | 1994-11-22 03:23:49 +0000 |
| commit | 95edd299b074fd83bc96e2ba6f509efa6c84ae6e (patch) | |
| tree | ee6d7063b629d295de7289138f072e6ede8c3760 /sys/dev | |
| parent | 642eb11a8666725290ca748d487504c113c09bc7 (diff) | |
Add still more locking.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/ata/wd.c | 60 | ||||
| -rw-r--r-- | sys/dev/isa/wd.c | 60 | ||||
| -rw-r--r-- | sys/dev/scsipi/cd.c | 67 | ||||
| -rw-r--r-- | sys/dev/scsipi/sd.c | 65 |
4 files changed, 133 insertions, 119 deletions
diff --git a/sys/dev/ata/wd.c b/sys/dev/ata/wd.c index b2f9467ac70..8f4c75d1488 100644 --- a/sys/dev/ata/wd.c +++ b/sys/dev/ata/wd.c @@ -1,4 +1,4 @@ -/* $NetBSD: wd.c,v 1.108 1994/11/20 22:37:07 mycroft Exp $ */ +/* $NetBSD: wd.c,v 1.109 1994/11/22 03:24:53 mycroft Exp $ */ /* * Copyright (c) 1994 Charles Hannum. @@ -811,9 +811,9 @@ wdopen(dev, flag, fmt) dev_t dev; int flag, fmt; { + int error; int unit, part; struct wd_softc *wd; - int error, s; unit = WDUNIT(dev); if (unit >= wdcd.cd_ndevs) @@ -824,31 +824,22 @@ wdopen(dev, flag, fmt) part = WDPART(dev); - s = splbio(); - while ((wd->sc_flags & WDF_LOCKED) != 0) { wd->sc_flags |= WDF_WANTED; - if ((error = tsleep(wd, PRIBIO | PCATCH, "wdopn", 0)) != 0) { - splx(s); + if ((error = tsleep(wd, PRIBIO | PCATCH, "wdopn", 0)) != 0) return error; - } - } - - /* - * If any partition is open, but the disk has been invalidated, - * disallow further opens. - */ - if (wd->sc_dk.dk_openmask != 0 && - (wd->sc_flags & WDF_LOADED) == 0) { - splx(s); - return ENXIO; } - if (wd->sc_dk.dk_openmask == 0) { + if (wd->sc_dk.dk_openmask != 0) { + /* + * If any partition is open, but the disk has been invalidated, + * disallow further opens. + */ + if ((wd->sc_flags & WDF_LOADED) == 0) + return ENXIO; + } else { wd->sc_flags |= WDF_LOCKED; - splx(s); - if ((wd->sc_flags & WDF_LOADED) == 0) { wd->sc_flags &= ~WDF_BSDLABEL; wd->sc_flags |= WDF_LOADED; @@ -863,8 +854,6 @@ wdopen(dev, flag, fmt) wdgetdisklabel(wd); } - s = splbio(); - wd->sc_flags &= ~WDF_LOCKED; if ((wd->sc_flags & WDF_WANTED) != 0) { wd->sc_flags &= ~WDF_WANTED; @@ -872,8 +861,7 @@ wdopen(dev, flag, fmt) } } - splx(s); - + /* Check that the partition exists. */ if (part != RAW_PART && (part >= wd->sc_dk.dk_label.d_npartitions || wd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) { @@ -898,15 +886,12 @@ bad2: wd->sc_flags &= ~WDF_LOADED; bad: - s = splbio(); - wd->sc_flags &= ~WDF_LOCKED; if ((wd->sc_flags & WDF_WANTED) != 0) { wd->sc_flags &= ~WDF_WANTED; wakeup(wd); } - splx(s); return error; } @@ -1185,6 +1170,7 @@ wdclose(dev, flag, fmt) { struct wd_softc *wd = wdcd.cd_devs[WDUNIT(dev)]; int part = WDPART(dev); + int s; switch (fmt) { case S_IFCHR: @@ -1196,6 +1182,26 @@ wdclose(dev, flag, fmt) } wd->sc_dk.dk_openmask = wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask; +#if 0 + if (wd->sc_dk.dk_openmask == 0) { + wd->sc_flags |= WDF_LOCKED; + + s = splbio(); + while (...) { + wd->sc_flags |= WDF_WAITING; + if ((error = tsleep(wd, PRIBIO | PCATCH, "wdcls", 0)) != 0) + return error; + } + splx(s); + + wd->sc_flags &= ~WDF_LOCKED; + if ((wd->sc_flags & WDF_WANTED) != 0) { + wd->sc_flags &= WDF_WANTED; + wakeup(wd); + } + } +#endif + return 0; } diff --git a/sys/dev/isa/wd.c b/sys/dev/isa/wd.c index b2f9467ac70..8f4c75d1488 100644 --- a/sys/dev/isa/wd.c +++ b/sys/dev/isa/wd.c @@ -1,4 +1,4 @@ -/* $NetBSD: wd.c,v 1.108 1994/11/20 22:37:07 mycroft Exp $ */ +/* $NetBSD: wd.c,v 1.109 1994/11/22 03:24:53 mycroft Exp $ */ /* * Copyright (c) 1994 Charles Hannum. @@ -811,9 +811,9 @@ wdopen(dev, flag, fmt) dev_t dev; int flag, fmt; { + int error; int unit, part; struct wd_softc *wd; - int error, s; unit = WDUNIT(dev); if (unit >= wdcd.cd_ndevs) @@ -824,31 +824,22 @@ wdopen(dev, flag, fmt) part = WDPART(dev); - s = splbio(); - while ((wd->sc_flags & WDF_LOCKED) != 0) { wd->sc_flags |= WDF_WANTED; - if ((error = tsleep(wd, PRIBIO | PCATCH, "wdopn", 0)) != 0) { - splx(s); + if ((error = tsleep(wd, PRIBIO | PCATCH, "wdopn", 0)) != 0) return error; - } - } - - /* - * If any partition is open, but the disk has been invalidated, - * disallow further opens. - */ - if (wd->sc_dk.dk_openmask != 0 && - (wd->sc_flags & WDF_LOADED) == 0) { - splx(s); - return ENXIO; } - if (wd->sc_dk.dk_openmask == 0) { + if (wd->sc_dk.dk_openmask != 0) { + /* + * If any partition is open, but the disk has been invalidated, + * disallow further opens. + */ + if ((wd->sc_flags & WDF_LOADED) == 0) + return ENXIO; + } else { wd->sc_flags |= WDF_LOCKED; - splx(s); - if ((wd->sc_flags & WDF_LOADED) == 0) { wd->sc_flags &= ~WDF_BSDLABEL; wd->sc_flags |= WDF_LOADED; @@ -863,8 +854,6 @@ wdopen(dev, flag, fmt) wdgetdisklabel(wd); } - s = splbio(); - wd->sc_flags &= ~WDF_LOCKED; if ((wd->sc_flags & WDF_WANTED) != 0) { wd->sc_flags &= ~WDF_WANTED; @@ -872,8 +861,7 @@ wdopen(dev, flag, fmt) } } - splx(s); - + /* Check that the partition exists. */ if (part != RAW_PART && (part >= wd->sc_dk.dk_label.d_npartitions || wd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) { @@ -898,15 +886,12 @@ bad2: wd->sc_flags &= ~WDF_LOADED; bad: - s = splbio(); - wd->sc_flags &= ~WDF_LOCKED; if ((wd->sc_flags & WDF_WANTED) != 0) { wd->sc_flags &= ~WDF_WANTED; wakeup(wd); } - splx(s); return error; } @@ -1185,6 +1170,7 @@ wdclose(dev, flag, fmt) { struct wd_softc *wd = wdcd.cd_devs[WDUNIT(dev)]; int part = WDPART(dev); + int s; switch (fmt) { case S_IFCHR: @@ -1196,6 +1182,26 @@ wdclose(dev, flag, fmt) } wd->sc_dk.dk_openmask = wd->sc_dk.dk_copenmask | wd->sc_dk.dk_bopenmask; +#if 0 + if (wd->sc_dk.dk_openmask == 0) { + wd->sc_flags |= WDF_LOCKED; + + s = splbio(); + while (...) { + wd->sc_flags |= WDF_WAITING; + if ((error = tsleep(wd, PRIBIO | PCATCH, "wdcls", 0)) != 0) + return error; + } + splx(s); + + wd->sc_flags &= ~WDF_LOCKED; + if ((wd->sc_flags & WDF_WANTED) != 0) { + wd->sc_flags &= WDF_WANTED; + wakeup(wd); + } + } +#endif + return 0; } diff --git a/sys/dev/scsipi/cd.c b/sys/dev/scsipi/cd.c index ee9fc01b824..08cf221f22d 100644 --- a/sys/dev/scsipi/cd.c +++ b/sys/dev/scsipi/cd.c @@ -1,4 +1,4 @@ -/* $NetBSD: cd.c,v 1.42 1994/11/21 10:39:09 mycroft Exp $ */ +/* $NetBSD: cd.c,v 1.43 1994/11/22 03:23:49 mycroft Exp $ */ /* * Copyright (c) 1994 Charles Hannum. All rights reserved. @@ -186,11 +186,10 @@ cdopen(dev, flag, fmt) dev_t dev; int flag, fmt; { - int error = 0; + int error; int unit, part; struct cd_data *cd; struct scsi_link *sc_link; - int s; unit = CDUNIT(dev); if (unit >= cdcd.cd_ndevs) @@ -206,36 +205,27 @@ cdopen(dev, flag, fmt) ("cdopen: dev=0x%x (unit %d (of %d), partition %d)\n", dev, unit, cdcd.cd_ndevs, part)); - s = splbio(); - while ((cd->flags & CDF_LOCKED) != 0) { cd->flags |= CDF_WANTED; - if ((error = tsleep(cd, PRIBIO | PCATCH, "cdopn", 0)) != 0) { - splx(s); + if ((error = tsleep(cd, PRIBIO | PCATCH, "cdopn", 0)) != 0) return error; - } - } - - /* - * If any partition is open, but the disk has been invalidated, - * disallow further opens. - */ - if (cd->sc_dk.dk_openmask != 0 && - (sc_link->flags & SDEV_MEDIA_LOADED) == 0) { - splx(s); - return ENXIO; } - if (cd->sc_dk.dk_openmask == 0) { + if (cd->sc_dk.dk_openmask != 0) { + /* + * If any partition is open, but the disk has been invalidated, + * disallow further opens. + */ + if ((sc_link->flags & SDEV_MEDIA_LOADED) == 0) + return ENXIO; + } else { cd->flags |= CDF_LOCKED; - splx(s); - /* * Check that it is still responding and ok. * if the media has been changed this will result in a * "unit attention" error which the error code will - * disregard because the SDEV_MEDIA_LOADED flag is not yet set + * disregard because the SDEV_OPEN flag is not yet set. */ scsi_test_unit_ready(sc_link, SCSI_SILENT); @@ -246,7 +236,7 @@ cdopen(dev, flag, fmt) scsi_start(sc_link, SSS_START, SCSI_ERR_OK | SCSI_SILENT); /* - * Next time actually take notice of error returns + * Check that it is still responding and ok. */ sc_link->flags |= SDEV_OPEN; /* unit attn errors are now errors */ if (scsi_test_unit_ready(sc_link, 0) != 0) { @@ -275,8 +265,6 @@ cdopen(dev, flag, fmt) SC_DEBUG(sc_link, SDEV_DB3, ("Disklabel fabricated ")); } - s = splbio(); - cd->flags &= ~CDF_LOCKED; if ((cd->flags & CDF_WANTED) != 0) { cd->flags &= ~CDF_WANTED; @@ -284,11 +272,7 @@ cdopen(dev, flag, fmt) } } - splx(s); - - /* - * Check that the partition exists - */ + /* Check that the partition exists. */ if (part != RAW_PART && (part >= cd->sc_dk.dk_label.d_npartitions || cd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) { @@ -319,15 +303,12 @@ bad: sc_link->flags &= ~SDEV_OPEN; } - s = splbio(); - cd->flags &= ~CDF_LOCKED; if ((cd->flags & CDF_WANTED) != 0) { cd->flags &= ~CDF_WANTED; wakeup(cd); } - splx(s); return error; } @@ -342,6 +323,7 @@ cdclose(dev, flag, fmt) { struct cd_data *cd = cdcd.cd_devs[CDUNIT(dev)]; int part = CDPART(dev); + int s; switch (fmt) { case S_IFCHR: @@ -354,9 +336,28 @@ cdclose(dev, flag, fmt) cd->sc_dk.dk_openmask = cd->sc_dk.dk_copenmask | cd->sc_dk.dk_bopenmask; if (cd->sc_dk.dk_openmask == 0) { + cd->flags |= CDF_LOCKED; + +#if 0 + s = splbio(); + while (...) { + cd->flags |= CDF_WAITING; + if ((error = tsleep(cd, PRIBIO | PCATCH, "cdcls", 0)) != 0) + return error; + } + splx(s); +#endif + scsi_prevent(cd->sc_link, PR_ALLOW, SCSI_ERR_OK | SCSI_SILENT); cd->sc_link->flags &= ~SDEV_OPEN; + + cd->flags &= ~CDF_LOCKED; + if ((cd->flags & CDF_WANTED) != 0) { + cd->flags &= ~CDF_WANTED; + wakeup(cd); + } } + return 0; } diff --git a/sys/dev/scsipi/sd.c b/sys/dev/scsipi/sd.c index a633a11689e..3c68f6b23ce 100644 --- a/sys/dev/scsipi/sd.c +++ b/sys/dev/scsipi/sd.c @@ -1,4 +1,4 @@ -/* $NetBSD: sd.c,v 1.46 1994/11/21 10:39:25 mycroft Exp $ */ +/* $NetBSD: sd.c,v 1.47 1994/11/22 03:23:55 mycroft Exp $ */ /* * Copyright (c) 1994 Charles Hannum. All rights reserved. @@ -183,11 +183,10 @@ sdopen(dev, flag, fmt) dev_t dev; int flag, fmt; { - int error = 0; + int error; int unit, part; struct sd_data *sd; struct scsi_link *sc_link; - int s; unit = SDUNIT(dev); if (unit >= sdcd.cd_ndevs) @@ -203,31 +202,22 @@ sdopen(dev, flag, fmt) ("sdopen: dev=0x%x (unit %d (of %d), partition %d)\n", dev, unit, sdcd.cd_ndevs, part)); - s = splbio(); - while ((sd->flags & SDF_LOCKED) != 0) { sd->flags |= SDF_WANTED; - if ((error = tsleep(sd, PRIBIO | PCATCH, "sdopn", 0)) != 0) { - splx(s); + if ((error = tsleep(sd, PRIBIO | PCATCH, "sdopn", 0)) != 0) return error; - } - } - - /* - * If any partition is open, but the disk has been invalidated, - * disallow further opens. - */ - if (sd->sc_dk.dk_openmask != 0 && - (sc_link->flags & SDEV_MEDIA_LOADED) == 0) { - splx(s); - return ENXIO; } - if (sd->sc_dk.dk_openmask == 0) { + if (sd->sc_dk.dk_openmask != 0) { + /* + * If any partition is open, but the disk has been invalidated, + * disallow further opens. + */ + if ((sc_link->flags & SDEV_MEDIA_LOADED) == 0) + return ENXIO; + } else { sd->flags |= SDF_LOCKED; - splx(s); - /* * "unit attention" errors should occur here if the * drive has been restarted or the pack changed. @@ -248,7 +238,7 @@ sdopen(dev, flag, fmt) */ sc_link->flags |= SDEV_OPEN; /* unit attn becomes an err now */ if (scsi_test_unit_ready(sc_link, 0)) { - SC_DEBUG(sc_link, SDEV_DB3, ("device not reponding\n")); + SC_DEBUG(sc_link, SDEV_DB3, ("device not responding\n")); error = ENXIO; goto bad; } @@ -273,8 +263,6 @@ sdopen(dev, flag, fmt) SC_DEBUG(sc_link, SDEV_DB3, ("Disklabel loaded ")); } - s = splbio(); - sd->flags &= ~SDF_LOCKED; if ((sd->flags & SDF_WANTED) != 0) { sd->flags &= ~SDF_WANTED; @@ -282,11 +270,7 @@ sdopen(dev, flag, fmt) } } - splx(s); - - /* - * Check that the partition exists - */ + /* Check that the partition exists. */ if (part != RAW_PART && (part >= sd->sc_dk.dk_label.d_npartitions || sd->sc_dk.dk_label.d_partitions[part].p_fstype == FS_UNUSED)) { @@ -317,15 +301,12 @@ bad: sc_link->flags &= ~SDEV_OPEN; } - s = splbio(); - sd->flags &= ~SDF_LOCKED; if ((sd->flags & SDF_WANTED) != 0) { sd->flags &= ~SDF_WANTED; wakeup(sd); } - splx(s); return error; } @@ -340,6 +321,7 @@ sdclose(dev, flag, fmt) { struct sd_data *sd = sdcd.cd_devs[SDUNIT(dev)]; int part = SDPART(dev); + int s; switch (fmt) { case S_IFCHR: @@ -352,9 +334,28 @@ sdclose(dev, flag, fmt) sd->sc_dk.dk_openmask = sd->sc_dk.dk_copenmask | sd->sc_dk.dk_bopenmask; if (sd->sc_dk.dk_openmask == 0) { + sd->flags |= SDF_LOCKED; + +#if 0 + s = splbio(); + while (...) { + sd->flags |= SDF_WAITING; + if ((error = tsleep(sd, PRIBIO | PCATCH, "sdcls", 0)) != 0) + return error; + } + splx(s); +#endif + scsi_prevent(sd->sc_link, PR_ALLOW, SCSI_ERR_OK | SCSI_SILENT); sd->sc_link->flags &= ~SDEV_OPEN; + + sd->flags &= ~SDF_LOCKED; + if ((sd->flags & SDF_WANTED) != 0) { + sd->flags &= ~SDF_WANTED; + wakeup(sd); + } } + return 0; } |
