summaryrefslogtreecommitdiff
path: root/sys/kern/subr_disk.c
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>1999-11-06 10:25:58 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>1999-11-06 10:25:58 +0000
commit8db34b3a11d2a0f0b243ac756cc7c192b52f9b54 (patch)
treee54f14b9b7b4144b798c299e0ab03a31ffae3320 /sys/kern/subr_disk.c
parent91eef0b87387d4916724b74a5a5fc87a8c927ffe (diff)
Notes
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r--sys/kern/subr_disk.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index b68948ed6c09..50cb1d827fdb 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -52,7 +52,7 @@ disk_create(int unit, struct disk *dp, int flags, struct cdevsw *cdevsw, struct
dev->si_disk = dp;
dp->d_dev = dev;
- dp->d_flags = flags;
+ dp->d_dsflags = flags;
dp->d_devsw = cdevsw;
return (dev);
}
@@ -114,6 +114,12 @@ diskopen(dev_t dev, int oflags, int devtype, struct proc *p)
if (!dp)
return (ENXIO);
+ while (dp->d_flags & DISKFLAG_LOCK) {
+ dp->d_flags |= DISKFLAG_WANTED;
+ tsleep(dp, PRIBIO | PCATCH, "diskopen", hz);
+ }
+ dp->d_flags |= DISKFLAG_LOCK;
+
if (!dsisopen(dp->d_slice)) {
if (!pdev->si_iosize_max)
pdev->si_iosize_max = dev->si_iosize_max;
@@ -129,12 +135,18 @@ diskopen(dev_t dev, int oflags, int devtype, struct proc *p)
dev->si_bsize_best = pdev->si_bsize_best;
if (error)
- return(error);
+ goto out;
- error = dsopen(dev, devtype, dp->d_flags, &dp->d_slice, &dp->d_label);
+ error = dsopen(dev, devtype, dp->d_dsflags, &dp->d_slice, &dp->d_label);
if (!dsisopen(dp->d_slice))
dp->d_devsw->d_close(pdev, oflags, devtype, p);
+out:
+ dp->d_flags &= ~DISKFLAG_LOCK;
+ if (dp->d_flags & DISKFLAG_WANTED) {
+ dp->d_flags &= ~DISKFLAG_WANTED;
+ wakeup(dp);
+ }
return(error);
}