From: csapuntz Date: Sun, 9 Apr 2000 19:26:35 +0000 (+0000) Subject: Move a locking function that was spread throughout disk device drivers into X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=501b64689d39b8491dc3beb65e0b3af882e305bd;p=openbsd 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 --- 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 #include #include +#include #include #include #include /* XXX */ +#include #include @@ -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(). diff --git a/sys/sys/disk.h b/sys/sys/disk.h index 1fc3da62527..3802fc6243d 100644 --- a/sys/sys/disk.h +++ b/sys/sys/disk.h @@ -1,4 +1,4 @@ -/* $OpenBSD: disk.h,v 1.4 1996/05/02 13:13:21 deraadt Exp $ */ +/* $OpenBSD: disk.h,v 1.5 2000/04/09 19:26:35 csapuntz Exp $ */ /* $NetBSD: disk.h,v 1.11 1996/04/28 20:22:50 thorpej Exp $ */ /* @@ -54,6 +54,7 @@ #include #include +#include struct buf; struct disklabel; @@ -61,7 +62,10 @@ struct cpu_disklabel; struct disk { TAILQ_ENTRY(disk) dk_link; /* link in global disklist */ + struct lock dk_lock; /* disk lock */ char *dk_name; /* disk name */ + int dk_flags; /* disk flags */ +#define DKF_CONSTRUCTED 0x0001 int dk_bopenmask; /* block devices open */ int dk_copenmask; /* character devices open */ int dk_openmask; /* composite (bopen|copen) */ @@ -138,6 +142,7 @@ TAILQ_HEAD(disklist_head, disk); /* the disklist is a TAILQ */ extern int disk_count; /* number of disks in global disklist */ void disk_init __P((void)); +int disk_construct __P((struct disk *, char *)); void disk_attach __P((struct disk *)); void disk_detach __P((struct disk *)); void disk_busy __P((struct disk *)); @@ -145,6 +150,9 @@ void disk_unbusy __P((struct disk *, long)); void disk_resetstat __P((struct disk *)); struct disk *disk_find __P((char *)); +int disk_lock __P((struct disk *)); +void disk_unlock __P((struct disk *)); + struct device; void dk_establish __P((struct disk *, struct device *)); #endif