summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r--sys/kern/subr_disk.c40
1 files changed, 39 insertions, 1 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index 5d8f8fda806..a166a72c4a1 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_disk.c,v 1.17 1999/11/17 04:31:22 d Exp $ */
+/* $OpenBSD: subr_disk.c,v 1.18 2000/04/09 19:26:35 csapuntz Exp $ */
/* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */
/*
@@ -53,9 +53,11 @@
#include <sys/time.h>
#include <sys/disklabel.h>
#include <sys/conf.h>
+#include <sys/lock.h>
#include <sys/disk.h>
#include <sys/dkio.h>
#include <sys/dkstat.h> /* XXX */
+#include <sys/proc.h>
#include <dev/rndvar.h>
@@ -266,6 +268,19 @@ disk_find(name)
return (NULL);
}
+int
+disk_construct(diskp, lockname)
+ struct disk *diskp;
+ char *lockname;
+{
+ lockinit(&diskp->dk_lock, PRIBIO | PCATCH, lockname,
+ 0, LK_CANRECURSE);
+
+ diskp->dk_flags |= DKF_CONSTRUCTED;
+
+ return (0);
+}
+
/*
* Attach a disk.
*/
@@ -275,6 +290,9 @@ disk_attach(diskp)
{
int s;
+ if (!diskp->dk_flags & DKF_CONSTRUCTED)
+ disk_construct(diskp, diskp->dk_name);
+
/*
* Allocate and initialize the disklabel structures. Note that
* it's not safe to sleep here, since we're probably going to be
@@ -378,6 +396,26 @@ disk_unbusy(diskp, bcount)
add_disk_randomness(bcount ^ diff_time.tv_usec);
}
+
+int
+disk_lock(dk)
+ struct disk *dk;
+{
+ int error;
+
+ error = lockmgr(&dk->dk_lock, LK_EXCLUSIVE, 0, curproc);
+
+ return (error);
+}
+
+void
+disk_unlock(dk)
+ struct disk *dk;
+{
+ lockmgr(&dk->dk_lock, LK_RELEASE, 0, curproc);
+}
+
+
/*
* Reset the metrics counters on the given disk. Note that we cannot
* reset the busy counter, as it may case a panic in disk_unbusy().