📄 cd9660_vfsops.c
字号:
argp->flags &= ~ISOFSMNT_GENS; } /* * The contents are valid, * but they will get reread as part of another vnode, so... */ bp->b_flags |= B_AGE; brelse(bp); bp = NULL; } isomp->im_flags = argp->flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS|ISOFSMNT_EXTATT); switch (isomp->im_flags&(ISOFSMNT_NORRIP|ISOFSMNT_GENS)) { default: isomp->iso_ftype = ISO_FTYPE_DEFAULT; break; case ISOFSMNT_GENS|ISOFSMNT_NORRIP: isomp->iso_ftype = ISO_FTYPE_9660; break; case 0: isomp->iso_ftype = ISO_FTYPE_RRIP; break; } return 0;out: if (bp) brelse(bp); if (needclose) (void)VOP_CLOSE(devvp, ronly ? FREAD : FREAD|FWRITE, NOCRED, p); if (isomp) { free((caddr_t)isomp, M_ISOFSMNT); mp->mnt_data = (qaddr_t)0; } return error;}/* * Make a filesystem operational. * Nothing to do at the moment. *//* ARGSUSED */cd9660_start(mp, flags, p) struct mount *mp; int flags; struct proc *p;{ return 0;}/* * unmount system call */intcd9660_unmount(mp, mntflags, p) struct mount *mp; int mntflags; struct proc *p;{ register struct iso_mnt *isomp; int i, error, ronly, flags = 0; if (mntflags & MNT_FORCE) { if (!iso_doforce || (mp->mnt_flag & MNT_ROOTFS)) return (EINVAL); flags |= FORCECLOSE; }#if 0 mntflushbuf(mp, 0); if (mntinvalbuf(mp)) return EBUSY;#endif if (error = vflush(mp, NULLVP, flags)) return (error); isomp = VFSTOISOFS(mp);#ifdef ISODEVMAP if (isomp->iso_ftype == ISO_FTYPE_RRIP) iso_dunmap(isomp->im_dev);#endif isomp->im_devvp->v_specflags &= ~SI_MOUNTEDON; error = VOP_CLOSE(isomp->im_devvp, FREAD, NOCRED, p); vrele(isomp->im_devvp); free((caddr_t)isomp, M_ISOFSMNT); mp->mnt_data = (qaddr_t)0; mp->mnt_flag &= ~MNT_LOCAL; return (error);}/* * Return root of a filesystem */cd9660_root(mp, vpp) struct mount *mp; struct vnode **vpp;{ register struct iso_node *ip; struct iso_node tip, *nip; struct vnode tvp; int error; struct iso_mnt *imp = VFSTOISOFS (mp); struct iso_directory_record *dp; tvp.v_mount = mp; tvp.v_data = &tip; ip = VTOI(&tvp); ip->i_vnode = &tvp; ip->i_dev = imp->im_dev; ip->i_diroff = 0; dp = (struct iso_directory_record *)imp->root; isodirino(&ip->i_number,dp,imp); /* * With RRIP we must use the `.' entry of the root directory. * Simply tell iget, that it's a relocated directory. */ error = iso_iget(ip,ip->i_number, imp->iso_ftype == ISO_FTYPE_RRIP, &nip,dp); if (error) return error; *vpp = ITOV(nip); return 0;}/* * Do operations associated with quotas, not supported *//* ARGSUSED */intcd9660_quotactl(mp, cmd, uid, arg, p) struct mount *mp; int cmd; uid_t uid; caddr_t arg; struct proc *p;{ return (EOPNOTSUPP);}/* * Get file system statistics. */cd9660_statfs(mp, sbp, p) struct mount *mp; register struct statfs *sbp; struct proc *p;{ register struct iso_mnt *isomp; register struct fs *fs; isomp = VFSTOISOFS(mp); sbp->f_type = MOUNT_CD9660; sbp->f_bsize = isomp->logical_block_size; sbp->f_iosize = sbp->f_bsize; /* XXX */ sbp->f_blocks = isomp->volume_space_size; sbp->f_bfree = 0; /* total free blocks */ sbp->f_bavail = 0; /* blocks free for non superuser */ sbp->f_files = 0; /* total files */ sbp->f_ffree = 0; /* free file nodes */ if (sbp != &mp->mnt_stat) { bcopy((caddr_t)mp->mnt_stat.f_mntonname, (caddr_t)&sbp->f_mntonname[0], MNAMELEN); bcopy((caddr_t)mp->mnt_stat.f_mntfromname, (caddr_t)&sbp->f_mntfromname[0], MNAMELEN); } /* Use the first spare for flags: */ sbp->f_spare[0] = isomp->im_flags; return 0;}/* ARGSUSED */intcd9660_sync(mp, waitfor, cred, p) struct mount *mp; int waitfor; struct ucred *cred; struct proc *p;{ return (0);}/* * Flat namespace lookup. * Currently unsupported. *//* ARGSUSED */intcd9660_vget(mp, ino, vpp) struct mount *mp; ino_t ino; struct vnode **vpp;{ return (EOPNOTSUPP);}/* * File handle to vnode * * Have to be really careful about stale file handles: * - check that the inode number is in range * - call iget() to get the locked inode * - check for an unallocated inode (i_mode == 0) * - check that the generation number matches */struct ifid { ushort ifid_len; ushort ifid_pad; int ifid_ino; long ifid_start;};/* ARGSUSED */intcd9660_fhtovp(mp, fhp, nam, vpp, exflagsp, credanonp) register struct mount *mp; struct fid *fhp; struct mbuf *nam; struct vnode **vpp; int *exflagsp; struct ucred **credanonp;{ struct vnode tvp; int error; int lbn, off; struct ifid *ifhp; struct iso_mnt *imp; struct buf *bp; struct iso_directory_record *dirp; struct iso_node tip, *ip, *nip; struct netcred *np; imp = VFSTOISOFS (mp); ifhp = (struct ifid *)fhp; #ifdef ISOFS_DBG printf("fhtovp: ino %d, start %ld\n", ifhp->ifid_ino, ifhp->ifid_start);#endif np = vfs_export_lookup(mp, &imp->im_export, nam); if (np == NULL) return (EACCES); lbn = iso_lblkno(imp, ifhp->ifid_ino); if (lbn >= imp->volume_space_size) { printf("fhtovp: lbn exceed volume space %d\n", lbn); return (ESTALE); } off = iso_blkoff(imp, ifhp->ifid_ino); if (off + ISO_DIRECTORY_RECORD_SIZE > imp->logical_block_size) { printf("fhtovp: crosses block boundary %d\n", off + ISO_DIRECTORY_RECORD_SIZE); return (ESTALE); } error = bread(imp->im_devvp, btodb(lbn * imp->logical_block_size), imp->logical_block_size, NOCRED, &bp); if (error) { printf("fhtovp: bread error %d\n",error); brelse(bp); return (error); } dirp = (struct iso_directory_record *)(bp->b_un.b_addr + off); if (off + isonum_711(dirp->length) > imp->logical_block_size) { brelse(bp); printf("fhtovp: directory crosses block boundary %d[off=%d/len=%d]\n", off+isonum_711(dirp->length), off, isonum_711(dirp->length)); return (ESTALE); } if (isonum_733(dirp->extent) + isonum_711(dirp->ext_attr_length) != ifhp->ifid_start) { brelse(bp); printf("fhtovp: file start miss %d vs %d\n", isonum_733(dirp->extent)+isonum_711(dirp->ext_attr_length), ifhp->ifid_start); return (ESTALE); } brelse(bp); ip = &tip; tvp.v_mount = mp; tvp.v_data = ip; ip->i_vnode = &tvp; ip->i_dev = imp->im_dev; if (error = iso_iget(ip, ifhp->ifid_ino, 0, &nip, dirp)) { *vpp = NULLVP; printf("fhtovp: failed to get inode\n"); return (error); } ip = nip; /* * XXX need generation number? */ if (ip->inode.iso_mode == 0) { iso_iput(ip); *vpp = NULLVP; printf("fhtovp: inode mode == 0\n"); return (ESTALE); } *vpp = ITOV(ip); *exflagsp = np->netc_exflags; *credanonp = &np->netc_anon; return 0;}/* * Vnode pointer to File handle *//* ARGSUSED */cd9660_vptofh(vp, fhp) struct vnode *vp; struct fid *fhp;{ register struct iso_node *ip = VTOI(vp); register struct ifid *ifhp; register struct iso_mnt *mp = ip->i_mnt; ifhp = (struct ifid *)fhp; ifhp->ifid_len = sizeof(struct ifid); ifhp->ifid_ino = ip->i_number; ifhp->ifid_start = ip->iso_start; #ifdef ISOFS_DBG printf("vptofh: ino %d, start %ld\n", ifhp->ifid_ino,ifhp->ifid_start);#endif return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -