From 9f34214d762ee3d8ca3564722da5b555fc92b107 Mon Sep 17 00:00:00 2001 From: phk Date: Fri, 24 Sep 2004 07:24:02 +0000 Subject: Hold proper thread count while frobbing drivers ioctl. --- sys/fs/cd9660/cd9660_vfsops.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'sys/fs/cd9660') 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; -- cgit v1.1