summaryrefslogtreecommitdiff
path: root/sys/dev/ata
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/ata
parent642eb11a8666725290ca748d487504c113c09bc7 (diff)
Add still more locking.
Diffstat (limited to 'sys/dev/ata')
-rw-r--r--sys/dev/ata/wd.c60
1 files changed, 33 insertions, 27 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;
}