summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authormycroft <mycroft@NetBSD.org>1994-11-22 03:23:49 +0000
committermycroft <mycroft@NetBSD.org>1994-11-22 03:23:49 +0000
commit95edd299b074fd83bc96e2ba6f509efa6c84ae6e (patch)
treeee6d7063b629d295de7289138f072e6ede8c3760 /sys/dev
parent642eb11a8666725290ca748d487504c113c09bc7 (diff)
Add still more locking.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ata/wd.c60
-rw-r--r--sys/dev/isa/wd.c60
-rw-r--r--sys/dev/scsipi/cd.c67
-rw-r--r--sys/dev/scsipi/sd.c65
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;
}