diff options
author | phk <phk@FreeBSD.org> | 2004-09-24 07:24:02 +0000 |
---|---|---|
committer | phk <phk@FreeBSD.org> | 2004-09-24 07:24:02 +0000 |
commit | 9f34214d762ee3d8ca3564722da5b555fc92b107 (patch) | |
tree | a17e56d2b291e62b3a147420f017bb3be654f6ef /sys/isofs | |
parent | 14a7813f8649aa7e254c347446945d4db7c65a2e (diff) | |
download | FreeBSD-src-9f34214d762ee3d8ca3564722da5b555fc92b107.zip FreeBSD-src-9f34214d762ee3d8ca3564722da5b555fc92b107.tar.gz |
Hold proper thread count while frobbing drivers ioctl.
Diffstat (limited to 'sys/isofs')
-rw-r--r-- | sys/isofs/cd9660/cd9660_vfsops.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/isofs/cd9660/cd9660_vfsops.c b/sys/isofs/cd9660/cd9660_vfsops.c index f904888..1da9893 100644 --- a/sys/isofs/cd9660/cd9660_vfsops.c +++ b/sys/isofs/cd9660/cd9660_vfsops.c @@ -108,27 +108,34 @@ iso_get_ssector(dev, td) { struct ioc_toc_header h; struct ioc_read_toc_single_entry t; - int i; + int i, error; struct cdevsw *bd; d_ioctl_t *ioctlp; - bd = devsw(dev); - ioctlp = bd->d_ioctl; - if (ioctlp == NULL) + bd = dev_refthread(dev); + if (bd == NULL) return 0; + ioctlp = bd->d_ioctl; - if (ioctlp(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, td) != 0) + error = ioctlp(dev, CDIOREADTOCHEADER, (caddr_t)&h, FREAD, td); + if (error) { + dev_relthread(dev); return 0; + } for (i = h.ending_track; i >= 0; i--) { t.address_format = CD_LBA_FORMAT; t.track = i; - if (ioctlp(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, td) != 0) + error = ioctlp(dev, CDIOREADTOCENTRY, (caddr_t)&t, FREAD, td); + if (error) { + dev_relthread(dev); return 0; + } if ((t.entry.control & 4) != 0) /* found a data track */ break; } + dev_relthread(dev); if (i < 0) return 0; |