⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cd9660_vfsops.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
		    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 + -