diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2008-01-11 11:53:04 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2008-01-11 11:53:04 +0000 |
| commit | fc9f8bcf4f25461d922731c3e114fbc76b45600e (patch) | |
| tree | 29d79169d7f769fa261c7e4b075c797cd0658e3d /sys/dev/fdc | |
| parent | 73b2958b9422da744c9e7ae6291874c03a2b4325 (diff) | |
Notes
Diffstat (limited to 'sys/dev/fdc')
| -rw-r--r-- | sys/dev/fdc/fdc.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/dev/fdc/fdc.c b/sys/dev/fdc/fdc.c index 50ba331602e7..df1e629f27af 100644 --- a/sys/dev/fdc/fdc.c +++ b/sys/dev/fdc/fdc.c @@ -1205,6 +1205,7 @@ fdc_thread(void *arg) mtx_lock(&fdc->fdc_mtx); } fdc->flags &= ~(FDC_KTHREAD_EXIT | FDC_KTHREAD_ALIVE); + wakeup(&fdc->fdc_thread); mtx_unlock(&fdc->fdc_mtx); kproc_exit(0); @@ -1383,6 +1384,7 @@ fd_access(struct g_provider *pp, int r, int w, int e) struct fd_data *fd; struct fdc_data *fdc; int ar, aw, ae; + int busy; fd = pp->geom->softc; fdc = fd->fdc; @@ -1403,6 +1405,7 @@ fd_access(struct g_provider *pp, int r, int w, int e) return (0); } + busy = 0; if (pp->acr == 0 && pp->acw == 0 && pp->ace == 0) { if (fdmisccmd(fd, BIO_PROBE, NULL)) return (ENXIO); @@ -1415,10 +1418,14 @@ fd_access(struct g_provider *pp, int r, int w, int e) mtx_unlock(&fdc->fdc_mtx); } device_busy(fd->dev); + busy = 1; } - if (w > 0 && (fd->flags & FD_WP)) + if (w > 0 && (fd->flags & FD_WP)) { + if (busy) + device_unbusy(fd->dev); return (EROFS); + } pp->sectorsize = fd->sectorsize; pp->stripesize = fd->ft->heads * fd->ft->sectrac * fd->sectorsize; |
