Index: cd9660_bmap.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_bmap.c,v
retrieving revision 1.4
diff -b -p -u -4 -r1.4 cd9660_bmap.c
--- cd9660_bmap.c	27 Feb 2008 19:43:36 -0000	1.4
+++ cd9660_bmap.c	9 Jun 2014 13:50:08 -0000
@@ -73,9 +73,9 @@ cd9660_bmap(void *v)
 	 * Check for underlying vnode requests and ensure that logical
 	 * to physical mapping is requested.
 	 */
 	if (ap->a_vpp != NULL)
-		*ap->a_vpp = ip->i_devvp;
+		*ap->a_vpp = ip->i_mnt->im_devvp;
 	if (ap->a_bnp == NULL)
 		return (0);
 
 	/*
Index: cd9660_lookup.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_lookup.c,v
retrieving revision 1.26
diff -b -p -u -4 -r1.26 cd9660_lookup.c
--- cd9660_lookup.c	7 Feb 2014 15:29:21 -0000	1.26
+++ cd9660_lookup.c	9 Jun 2014 13:50:08 -0000
@@ -380,20 +380,18 @@ found:
 	 */
 	brelse(bp, 0);
 	if (flags & ISDOTDOT) {
 		VOP_UNLOCK(pdp);	/* race to get the inode */
-		error = cd9660_vget_internal(vdp->v_mount, dp->i_ino, &tdp,
-					     dp->i_ino != ino, ep);
+		error = cd9660_vget_internal(vdp->v_mount, dp->i_ino, &tdp);
 		vn_lock(pdp, LK_EXCLUSIVE | LK_RETRY);
 		if (error)
 			return error;
 		*vpp = tdp;
 	} else if (dp->i_number == dp->i_ino) {
 		vref(vdp);	/* we want ourself, ie "." */
 		*vpp = vdp;
 	} else {
-		error = cd9660_vget_internal(vdp->v_mount, dp->i_ino, &tdp,
-					     dp->i_ino != ino, ep);
+		error = cd9660_vget_internal(vdp->v_mount, dp->i_ino, &tdp);
 		if (error)
 			return (error);
 		*vpp = tdp;
 	}
@@ -417,8 +415,9 @@ int
 cd9660_blkatoff(struct vnode *vp, off_t offset, char **res, struct buf **bpp)
 {
 	struct iso_node *ip;
 	struct iso_mnt *imp;
+	struct vnode *devvp;
 	struct buf *bp;
 	daddr_t lbn;
 	int bsize, error;
 
@@ -426,9 +425,13 @@ cd9660_blkatoff(struct vnode *vp, off_t 
 	imp = ip->i_mnt;
 	lbn = cd9660_lblkno(imp, offset);
 	bsize = cd9660_blksize(imp, ip, lbn);
 
-	if ((error = bread(vp, lbn, bsize, NOCRED, 0, &bp)) != 0) {
+	if ((error = VOP_BMAP(vp, lbn, &devvp, &lbn, NULL)) != 0) {
+		*bpp = NULL;
+		return error;
+	}
+	if ((error = bread(devvp, lbn, bsize, NOCRED, 0, &bp)) != 0) {
 		*bpp = NULL;
 		return (error);
 	}
 	if (res)
Index: cd9660_node.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_node.c,v
retrieving revision 1.31
diff -b -p -u -4 -r1.31 cd9660_node.c
--- cd9660_node.c	10 May 2014 14:11:58 -0000	1.31
+++ cd9660_node.c	9 Jun 2014 13:50:09 -0000
@@ -240,12 +240,8 @@ cd9660_reclaim(void *v)
 	cd9660_ihashrem(ip);
 	/*
 	 * Purge old data structures associated with the inode.
 	 */
-	if (ip->i_devvp) {
-		vrele(ip->i_devvp);
-		ip->i_devvp = 0;
-	}
 	genfs_node_destroy(vp);
 	pool_put(&cd9660_node_pool, vp->v_data);
 	vp->v_data = NULL;
 	return (0);
Index: cd9660_node.h
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_node.h,v
retrieving revision 1.14
diff -b -p -u -4 -r1.14 cd9660_node.h
--- cd9660_node.h	27 Feb 2008 19:43:36 -0000	1.14
+++ cd9660_node.h	9 Jun 2014 13:50:09 -0000
@@ -132,10 +132,9 @@ struct	vnode *cd9660_ihashget(dev_t, ino
 void	cd9660_ihashins(struct iso_node *);
 void	cd9660_ihashrem(struct iso_node *);
 int	cd9660_tstamp_conv7(const u_char *, struct timespec *);
 int	cd9660_tstamp_conv17(const u_char *, struct timespec *);
-int	cd9660_vget_internal(struct mount *, ino_t, struct vnode **, int,
-			      struct iso_directory_record *);
+int	cd9660_vget_internal(struct mount *, ino_t, struct vnode **);
 
 extern kmutex_t cd9660_hashlock;
 
 #endif /* _KERNEL */
Index: cd9660_vfsops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_vfsops.c,v
retrieving revision 1.85
diff -b -p -u -4 -r1.85 cd9660_vfsops.c
--- cd9660_vfsops.c	13 May 2014 17:05:26 -0000	1.85
+++ cd9660_vfsops.c	9 Jun 2014 13:50:09 -0000
@@ -585,14 +585,9 @@ cd9660_root(struct mount *mp, struct vno
 	struct iso_directory_record *dp =
 	    (struct iso_directory_record *)imp->root;
 	ino_t ino = isodirino(dp, imp);
 
-	/*
-	 * With RRIP we must use the `.' entry of the root directory.
-	 * Simply tell vget, that it's a relocated directory.
-	 */
-	return (cd9660_vget_internal(mp, ino, vpp,
-				     imp->iso_ftype == ISO_FTYPE_RRIP, dp));
+	return cd9660_vget(mp, ino, vpp);
 }
 
 /*
  * Get file system statistics.
@@ -682,32 +677,21 @@ cd9660_fhtovp(struct mount *mp, struct f
 int
 cd9660_vget(struct mount *mp, ino_t ino, struct vnode **vpp)
 {
 
-	/*
-	 * XXXX
-	 * It would be nice if we didn't always set the `relocated' flag
-	 * and force the extra read, but I don't want to think about fixing
-	 * that right now.
-	 */
-	return (cd9660_vget_internal(mp, ino, vpp,
-#if 0
-				     VFSTOISOFS(mp)->iso_ftype == ISO_FTYPE_RRIP,
-#else
-				     0,
-#endif
-				     NULL));
+	return cd9660_vget_internal(mp, ino, vpp);
 }
 
 int
-cd9660_vget_internal(struct mount *mp, ino_t ino, struct vnode **vpp,
-	int relocated, struct iso_directory_record *isodir)
+cd9660_vget_internal(struct mount *mp, ino_t ino, struct vnode **vpp)
 {
 	struct iso_mnt *imp;
 	struct iso_node *ip;
+	struct iso_directory_record *isodir;
 	struct buf *bp;
 	struct vnode *vp;
 	dev_t dev;
+	int lbn, off;
 	int error;
 
 	imp = VFSTOISOFS(mp);
 	dev = imp->im_dev;
@@ -753,11 +737,8 @@ cd9660_vget_internal(struct mount *mp, i
 	 */
 	cd9660_ihashins(ip);
 	mutex_exit(&cd9660_hashlock);
 
-	if (isodir == 0) {
-		int lbn, off;
-
 		lbn = cd9660_lblkno(imp, ino);
 		if (lbn >= imp->volume_space_size) {
 			vput(vp);
 			printf("fhtovp: lbn exceed volume space %d\n", lbn);
@@ -781,10 +762,9 @@ cd9660_vget_internal(struct mount *mp, i
 			return (error);
 		}
 		isodir = (struct iso_directory_record *)((char *)bp->b_data + off);
 
-		if (off + isonum_711(isodir->length) >
-		    imp->logical_block_size) {
+	if (off + isonum_711(isodir->length) > imp->logical_block_size) {
 			vput(vp);
 			if (bp != 0)
 				brelse(bp, 0);
 			printf("fhtovp: directory crosses block boundary %d[off=%d/len=%d]\n",
@@ -803,27 +783,8 @@ cd9660_vget_internal(struct mount *mp, i
 			    ifhp->ifid_start);
 			return (ESTALE);
 		}
 #endif
-	} else
-		bp = 0;
-
-	vref(ip->i_devvp);
-
-	if (relocated) {
-		/*
-		 * On relocated directories we must
-		 * read the `.' entry out of a dir.
-		 */
-		ip->iso_start = ino >> imp->im_bshift;
-		if (bp != 0)
-			brelse(bp, 0);
-		if ((error = cd9660_blkatoff(vp, (off_t)0, NULL, &bp)) != 0) {
-			vput(vp);
-			return (error);
-		}
-		isodir = (struct iso_directory_record *)bp->b_data;
-	}
 
 	ip->iso_extent = isonum_733(isodir->extent);
 	ip->i_size = isonum_733(isodir->size);
 	ip->iso_start = isonum_711(isodir->ext_attr_length) + ip->iso_extent;
@@ -835,9 +796,8 @@ cd9660_vget_internal(struct mount *mp, i
 	switch (imp->iso_ftype) {
 	default:	/* ISO_FTYPE_9660 */
 	    {
 		struct buf *bp2;
-		int off;
 		if ((imp->im_flags & ISOFSMNT_EXTATT)
 		    && (off = isonum_711(isodir->ext_attr_length)))
 			cd9660_blkatoff(vp, (off_t)-(off << imp->im_bshift),
 			    NULL, &bp2);
Index: cd9660_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/cd9660/cd9660_vnops.c,v
retrieving revision 1.47
diff -b -p -u -4 -r1.47 cd9660_vnops.c
--- cd9660_vnops.c	23 Jan 2014 10:13:56 -0000	1.47
+++ cd9660_vnops.c	9 Jun 2014 13:50:09 -0000
@@ -722,9 +722,9 @@ cd9660_strategy(void *v)
 	if ((long)bp->b_blkno == -1) {
 		biodone(bp);
 		return (0);
 	}
-	vp = ip->i_devvp;
+	vp = ip->i_mnt->im_devvp;
 	return (VOP_STRATEGY(vp, bp));
 }
 
 /*
