From owner-freebsd-bugs Wed Apr 7 20:32: 5 1999 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 58D9C1521A for ; Wed, 7 Apr 1999 20:32:01 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.2/8.9.2) id UAA07679; Wed, 7 Apr 1999 20:30:02 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Date: Wed, 7 Apr 1999 20:30:02 -0700 (PDT) Message-Id: <199904080330.UAA07679@freefall.freebsd.org> To: freebsd-bugs@FreeBSD.org Cc: From: Motomichi Matsuzaki Subject: Re: kern/5038: FreeBSD can't read MS Joliet CDs. Reply-To: Motomichi Matsuzaki Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org The following reply was made to PR kern/5038; it has been noted by GNATS. From: Motomichi Matsuzaki To: freebsd-gnats-submit@freebsd.org, keith@email.gcn.net.tw Cc: byung@wam.umd.edu, joki@kuebart.stuttgart.netsurf.de Subject: Re: kern/5038: FreeBSD can't read MS Joliet CDs. Date: Thu, 08 Apr 1999 12:25:33 +0900 Hi. I have tried Byung's Joliet Patch(PR:kern/5038). This patch (and its ancestors) has the problem that 'ls -la' shows strange outputs for some CD-Rs. Note, there can be 2 or more PVDs, SVDs, and Boot records. The patch assumes that the SVD is the next sector to the PVD. This is wrong. On El Torito Bootable CD-ROMs, the first (#16) sector is PVD, and the second (#17) sector is *BOOT record*. Furthermore, there are some CD-Rs which have 2 PVDs and 2 SVDs. The following is the patch to Byung's considering multiple PVD/SVD/BOOTs. First, apply the Byung's patch at /usr/src (3.0-RELEASE or 3.1-STABLE), and then, apply this patch at /usr/src/sys/isofs/cd9660. --- cd9660_vfsops.c.prev Thu Apr 8 09:30:53 1999 +++ cd9660_vfsops.c Thu Apr 8 11:04:33 1999 @@ -283,7 +283,8 @@ struct iso_args *argp; { register struct iso_mnt *isomp = (struct iso_mnt *)0; - struct buf *bp = NULL, *joliet_bp = NULL; + struct buf *bp = NULL; + struct buf *pribp = NULL, *supbp = NULL; dev_t dev = devvp->v_rdev; int error = EINVAL; int needclose = 0; @@ -292,9 +293,9 @@ int iso_bsize; int iso_blknum; struct iso_volume_descriptor *vdp = 0; - struct iso_primary_descriptor *pri; + struct iso_primary_descriptor *pri = NULL; struct iso_supplementary_descriptor *sup = NULL; - struct iso_sierra_primary_descriptor *pri_sierra; + struct iso_sierra_primary_descriptor *pri_sierra = NULL; struct iso_directory_record *rootp; int logical_block_size; int joliet_level = -1; @@ -334,6 +335,7 @@ goto out; vdp = (struct iso_volume_descriptor *)bp->b_data; + high_sierra = 0; if (bcmp (vdp->id, ISO_STANDARD_ID, sizeof vdp->id) != 0) { if (bcmp (vdp->id_sierra, ISO_SIERRA_ID, sizeof vdp->id) != 0) { @@ -341,45 +343,50 @@ goto out; } else high_sierra = 1; - } else { - /* - * We know it's ISO9660 fs, now get Supplementary Volume - * Descriptor to check if it's Microsoft Joliet format. - */ - if (error = bread(devvp, (1 + iso_blknum) * btodb(iso_bsize), - iso_bsize, NOCRED, &joliet_bp)) - goto out; - - sup = (struct iso_supplementary_descriptor *)joliet_bp->b_data; - joliet_level = cd9660_joliet_level(sup); - - if (joliet_level < 0) { - argp->flags |= ISOFSMNT_NOJOLIET; - } else { - argp->flags |= ISOFSMNT_NORRIP; - argp->flags &= ~ISOFSMNT_GENS; - } - break; - } - if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) == ISO_VD_END) { - error = EINVAL; - goto out; } + switch (isonum_711 (high_sierra? vdp->type_sierra: vdp->type)){ + case ISO_VD_PRIMARY: + if (pribp == NULL) { + pribp = bp; + pri = (struct iso_primary_descriptor *)vdp; + pri_sierra = + (struct iso_sierra_primary_descriptor *)vdp; + } else + brelse(bp); + break; - if (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) == ISO_VD_PRIMARY) + case ISO_VD_SUPPLEMENTARY: + if (supbp == NULL) { + supbp = bp; + sup = (struct iso_supplementary_descriptor *)vdp; + joliet_level = cd9660_joliet_level(sup); + + if (joliet_level < 0) { + argp->flags |= ISOFSMNT_NOJOLIET; + } else { + argp->flags |= ISOFSMNT_NORRIP; + argp->flags &= ~ISOFSMNT_GENS; + } + } else + brelse(bp); break; - brelse(bp); + + case ISO_VD_END: + brelse(bp); + bp = NULL; + goto vd_end; + + default: + brelse(bp); + } } + vd_end: - if ((isonum_711 (high_sierra? vdp->type_sierra: vdp->type) != ISO_VD_PRIMARY) && (isonum_711 (high_sierra? vdp->type_sierra: vdp->type) != ISO_VD_SUPPLEMENTARY)){ + if (pri == NULL) { error = EINVAL; goto out; } - pri = (struct iso_primary_descriptor *)vdp; - pri_sierra = (struct iso_sierra_primary_descriptor *)vdp; - - logical_block_size = isonum_723 (high_sierra? pri_sierra->logical_block_size: @@ -422,12 +429,14 @@ while ((1 << isomp->im_bshift) < isomp->logical_block_size) isomp->im_bshift++; - bp->b_flags |= B_AGE; - brelse(bp); - bp = NULL; - brelse(joliet_bp); - joliet_bp = NULL; - + pribp->b_flags |= B_AGE; + brelse(pribp); + pribp = NULL; + if (supbp) { + if (joliet_level > 0) supbp->b_flags |= B_AGE; + brelse(supbp); + supbp = NULL; + } mp->mnt_data = (qaddr_t)isomp; mp->mnt_stat.f_fsid.val[0] = (long)dev; @@ -494,6 +503,10 @@ devvp->v_specmountpoint = NULL; if (bp) brelse(bp); + if (pribp) + brelse(pribp); + if (supbp) + brelse(supbp); if (needclose) (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); if (isomp) { -- Motomichi Matsuzaki Dept. of Biological Science, Fuculty of Sciences, Univ. of Tokyo, Japan To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message