From 39cb4ddfb9df5d6d94b43dfbc17eb5469035669f Mon Sep 17 00:00:00 2001 From: tjr Date: Sun, 5 Sep 2004 11:18:53 +0000 Subject: Temporarily back out revision 1.77. This changed cd9660_getattr() and cd9660_readdir() to return the address of the file's first data block as the inode number instead of the address of the directory entry, but neglected to update cd9660_vget_internal() for the new inode numbering scheme. Since the NFS server calls VFS_VGET (cd9660_vget()) with inode numbers returned through VOP_READDIR (cd9660_readdir()) when servicing a READDIRPLUS request, these two interfaces must agree on the numbering scheme; failure to do so caused panics and/or bogus information about the entries to be returned to clients using READDIRPLUS (Solaris, FreeBSD w/ mount -o rdirplus). PR: 63446 --- sys/fs/cd9660/cd9660_vnops.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) (limited to 'sys/fs/cd9660') diff --git a/sys/fs/cd9660/cd9660_vnops.c b/sys/fs/cd9660/cd9660_vnops.c index a7b1558..40eb1dd 100644 --- a/sys/fs/cd9660/cd9660_vnops.c +++ b/sys/fs/cd9660/cd9660_vnops.c @@ -167,14 +167,7 @@ cd9660_getattr(ap) struct iso_node *ip = VTOI(vp); vap->va_fsid = dev2udev(ip->i_dev); - - /* - * Don't use ip->i_ino for this since it is wrong for hard links. - * ip->i_ino should be the same as ip->iso_start (or not exist), - * but this currently doesn't work since we abuse it to look up - * parent directories from inodes. - */ - vap->va_fileid = ip->iso_start; + vap->va_fileid = ip->i_number; vap->va_mode = ip->inode.iso_mode; vap->va_nlink = ip->inode.iso_links; @@ -528,12 +521,11 @@ cd9660_readdir(ap) break; } - /* - * The "inode number" is iso_start, not i_ino, as in - * cd9660_getattr(). - */ - idp->current.d_fileno = isonum_711(ep->ext_attr_length) + - isonum_733(ep->extent); + if (isonum_711(ep->flags)&2) + idp->current.d_fileno = isodirino(ep, imp); + else + idp->current.d_fileno = dbtob(bp->b_blkno) + + entryoffsetinblock; idp->curroff += reclen; -- cgit v1.1