summaryrefslogtreecommitdiff
path: root/sys/kern
diff options
context:
space:
mode:
authorConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>2000-04-09 19:26:36 +0000
committerConstantine Sapuntzakis <csapuntz@cvs.openbsd.org>2000-04-09 19:26:36 +0000
commit53d2fd71df7b46d6258ee64b46bb0cfb343cae8c (patch)
tree2d29df1fdd9667d02575ae3032a84f2af99949c8 /sys/kern
parent12ece17dccce8d44b4fddd3e91f7a76015763f1c (diff)
Move a locking function that was spread throughout disk device drivers into
the disk structure. The locking was mostly used in disk device drivers to prevent multiple disklabel operations from going on simultaneously against the device. Added disk_construct(), a constructor for the disk structure, that initializes the lock structure in disk. It is called by default in disk_attach() if it hasn't been called yet. Added disk_lock and disk_unlock
Diffstat (limited to 'sys/kern')
-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().