summaryrefslogtreecommitdiffstats
path: root/sys/fs/cd9660
diff options
context:
space:
mode:
authorphk <phk@FreeBSD.org>2004-09-24 07:24:02 +0000
committerphk <phk@FreeBSD.org>2004-09-24 07:24:02 +0000
commit9f34214d762ee3d8ca3564722da5b555fc92b107 (patch)
treea17e56d2b291e62b3a147420f017bb3be654f6ef /sys/fs/cd9660
parent14a7813f8649aa7e254c347446945d4db7c65a2e (diff)
downloadFreeBSD-src-9f34214d762ee3d8ca3564722da5b555fc92b107.zip
FreeBSD-src-9f34214d762ee3d8ca3564722da5b555fc92b107.tar.gz
Hold proper thread count while frobbing drivers ioctl.
Diffstat (limited to 'sys/fs/cd9660')
-rw-r--r--sys/fs/cd9660/cd9660_vfsops.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/sys/fs/cd9660/cd9660_vfsops.c b/sys/fs/cd9660/cd9660_vfsops.c
index f904888..1da9893 100644
--- a/sys/fs/cd9660/cd9660_vfsops.c
+++ b/sys/fs/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;
OpenPOWER on IntegriCloud