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

📄 mkfs.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
		printf(" cylinders per group to %d.\n", sblock.fs_cpg);		if (cpgflg)			exit(27);	}	sblock.fs_cgsize = fragroundup(&sblock, CGSIZE(&sblock));	/*	 * Now have size for file system and nsect and ntrak.	 * Determine number of cylinders and blocks in the file system.	 */	sblock.fs_size = fssize = dbtofsb(&sblock, fssize);	sblock.fs_ncyl = fssize * NSPF(&sblock) / sblock.fs_spc;	if (fssize * NSPF(&sblock) > sblock.fs_ncyl * sblock.fs_spc) {		sblock.fs_ncyl++;		warn = 1;	}	if (sblock.fs_ncyl < 1) {		printf("file systems must have at least one cylinder\n");		exit(28);	}	/*	 * Determine feasability/values of rotational layout tables.	 *	 * The size of the rotational layout tables is limited by the	 * size of the superblock, SBSIZE. The amount of space available	 * for tables is calculated as (SBSIZE - sizeof (struct fs)).	 * The size of these tables is inversely proportional to the block	 * size of the file system. The size increases if sectors per track	 * are not powers of two, because more cylinders must be described	 * by the tables before the rotational pattern repeats (fs_cpc).	 */	sblock.fs_interleave = interleave;	sblock.fs_trackskew = trackskew;	sblock.fs_npsect = nphyssectors;	sblock.fs_postblformat = FS_DYNAMICPOSTBLFMT;	sblock.fs_sbsize = fragroundup(&sblock, sizeof(struct fs));	if (sblock.fs_ntrak == 1) {		sblock.fs_cpc = 0;		goto next;	}	postblsize = sblock.fs_nrpos * sblock.fs_cpc * sizeof(short);	rotblsize = sblock.fs_cpc * sblock.fs_spc / NSPB(&sblock);	totalsbsize = sizeof(struct fs) + rotblsize;	if (sblock.fs_nrpos == 8 && sblock.fs_cpc <= 16) {		/* use old static table space */		sblock.fs_postbloff = (char *)(&sblock.fs_opostbl[0][0]) -		    (char *)(&sblock.fs_link);		sblock.fs_rotbloff = &sblock.fs_space[0] -		    (u_char *)(&sblock.fs_link);	} else {		/* use dynamic table space */		sblock.fs_postbloff = &sblock.fs_space[0] -		    (u_char *)(&sblock.fs_link);		sblock.fs_rotbloff = sblock.fs_postbloff + postblsize;		totalsbsize += postblsize;	}	if (totalsbsize > SBSIZE ||	    sblock.fs_nsect > (1 << NBBY) * NSPB(&sblock)) {		printf("%s %s %d %s %d.%s",		    "Warning: insufficient space in super block for\n",		    "rotational layout tables with nsect", sblock.fs_nsect,		    "and ntrak", sblock.fs_ntrak,		    "\nFile system performance may be impaired.\n");		sblock.fs_cpc = 0;		goto next;	}	sblock.fs_sbsize = fragroundup(&sblock, totalsbsize);	/*	 * calculate the available blocks for each rotational position	 */	for (cylno = 0; cylno < sblock.fs_cpc; cylno++)		for (rpos = 0; rpos < sblock.fs_nrpos; rpos++)			fs_postbl(&sblock, cylno)[rpos] = -1;	for (i = (rotblsize - 1) * sblock.fs_frag;	     i >= 0; i -= sblock.fs_frag) {		cylno = cbtocylno(&sblock, i);		rpos = cbtorpos(&sblock, i);		blk = fragstoblks(&sblock, i);		if (fs_postbl(&sblock, cylno)[rpos] == -1)			fs_rotbl(&sblock)[blk] = 0;		else			fs_rotbl(&sblock)[blk] =			    fs_postbl(&sblock, cylno)[rpos] - blk;		fs_postbl(&sblock, cylno)[rpos] = blk;	}next:	/*	 * Compute/validate number of cylinder groups.	 */	sblock.fs_ncg = sblock.fs_ncyl / sblock.fs_cpg;	if (sblock.fs_ncyl % sblock.fs_cpg)		sblock.fs_ncg++;	sblock.fs_dblkno = sblock.fs_iblkno + sblock.fs_ipg / INOPF(&sblock);	i = MIN(~sblock.fs_cgmask, sblock.fs_ncg - 1);	if (cgdmin(&sblock, i) - cgbase(&sblock, i) >= sblock.fs_fpg) {		printf("inode blocks/cyl group (%d) >= data blocks (%d)\n",		    cgdmin(&sblock, i) - cgbase(&sblock, i) / sblock.fs_frag,		    sblock.fs_fpg / sblock.fs_frag);		printf("number of cylinders per cylinder group (%d) %s.\n",		    sblock.fs_cpg, "must be increased");		exit(29);	}	j = sblock.fs_ncg - 1;	if ((i = fssize - j * sblock.fs_fpg) < sblock.fs_fpg &&	    cgdmin(&sblock, j) - cgbase(&sblock, j) > i) {		if (j == 0) {			printf("Filesystem must have at least %d sectors\n",			    NSPF(&sblock) *			    (cgdmin(&sblock, 0) + 3 * sblock.fs_frag));			exit(30);		}		printf("Warning: inode blocks/cyl group (%d) >= data blocks (%d) in last\n",		    (cgdmin(&sblock, j) - cgbase(&sblock, j)) / sblock.fs_frag,		    i / sblock.fs_frag);		printf("    cylinder group. This implies %d sector(s) cannot be allocated.\n",		    i * NSPF(&sblock));		sblock.fs_ncg--;		sblock.fs_ncyl -= sblock.fs_ncyl % sblock.fs_cpg;		sblock.fs_size = fssize = sblock.fs_ncyl * sblock.fs_spc /		    NSPF(&sblock);		warn = 0;	}	if (warn && !mfs) {		printf("Warning: %d sector(s) in last cylinder unallocated\n",		    sblock.fs_spc -		    (fssize * NSPF(&sblock) - (sblock.fs_ncyl - 1)		    * sblock.fs_spc));	}	/*	 * fill in remaining fields of the super block	 */	sblock.fs_csaddr = cgdmin(&sblock, 0);	sblock.fs_cssize =	    fragroundup(&sblock, sblock.fs_ncg * sizeof(struct csum));	i = sblock.fs_bsize / sizeof(struct csum);	sblock.fs_csmask = ~(i - 1);	for (sblock.fs_csshift = 0; i > 1; i >>= 1)		sblock.fs_csshift++;	fscs = (struct csum *)calloc(1, sblock.fs_cssize);	sblock.fs_magic = FS_MAGIC;	sblock.fs_rotdelay = rotdelay;	sblock.fs_minfree = minfree;	sblock.fs_maxcontig = maxcontig;	sblock.fs_headswitch = headswitch;	sblock.fs_trkseek = trackseek;	sblock.fs_maxbpg = maxbpg;	sblock.fs_rps = rpm / 60;	sblock.fs_optim = opt;	sblock.fs_cgrotor = 0;	sblock.fs_cstotal.cs_ndir = 0;	sblock.fs_cstotal.cs_nbfree = 0;	sblock.fs_cstotal.cs_nifree = 0;	sblock.fs_cstotal.cs_nffree = 0;	sblock.fs_fmod = 0;	sblock.fs_ronly = 0;	/*	 * Dump out summary information about file system.	 */	if (!mfs) {		printf("%s:\t%d sectors in %d %s of %d tracks, %d sectors\n",		    fsys, sblock.fs_size * NSPF(&sblock), sblock.fs_ncyl,		    "cylinders", sblock.fs_ntrak, sblock.fs_nsect);#define B2MBFACTOR (1 / (1024.0 * 1024.0))		printf("\t%.1fMB in %d cyl groups (%d c/g, %.2fMB/g, %d i/g)\n",		    (float)sblock.fs_size * sblock.fs_fsize * B2MBFACTOR,		    sblock.fs_ncg, sblock.fs_cpg,		    (float)sblock.fs_fpg * sblock.fs_fsize * B2MBFACTOR,		    sblock.fs_ipg);#undef B2MBFACTOR	}	/*	 * Now build the cylinders group blocks and	 * then print out indices of cylinder groups.	 */	if (!mfs)		printf("super-block backups (for fsck -b #) at:");	for (cylno = 0; cylno < sblock.fs_ncg; cylno++) {		initcg(cylno, utime);		if (mfs)			continue;		if (cylno % 9 == 0)			printf("\n");		printf(" %d,", fsbtodb(&sblock, cgsblock(&sblock, cylno)));	}	if (!mfs)		printf("\n");	if (Nflag && !mfs)		exit(0);	/*	 * Now construct the initial file system,	 * then write out the super-block.	 */	fsinit(utime);	sblock.fs_time = utime;	wtfs((int)SBOFF / sectorsize, sbsize, (char *)&sblock);	for (i = 0; i < sblock.fs_cssize; i += sblock.fs_bsize)		wtfs(fsbtodb(&sblock, sblock.fs_csaddr + numfrags(&sblock, i)),			sblock.fs_cssize - i < sblock.fs_bsize ?			    sblock.fs_cssize - i : sblock.fs_bsize,			((char *)fscs) + i);	/* 	 * Write out the duplicate super blocks	 */	for (cylno = 0; cylno < sblock.fs_ncg; cylno++)		wtfs(fsbtodb(&sblock, cgsblock(&sblock, cylno)),		    sbsize, (char *)&sblock);	/*	 * Update information about this partion in pack	 * label, to that it may be updated on disk.	 */	pp->p_fstype = FS_BSDFFS;	pp->p_fsize = sblock.fs_fsize;	pp->p_frag = sblock.fs_frag;	pp->p_cpg = sblock.fs_cpg;	/*	 * Notify parent process of success.	 * Dissociate from session and tty.	 */	if (mfs) {		kill(ppid, SIGUSR1);		(void) setsid();		(void) close(0);		(void) close(1);		(void) close(2);		(void) chdir("/");	}}/* * Initialize a cylinder group. */initcg(cylno, utime)	int cylno;	time_t utime;{	daddr_t cbase, d, dlower, dupper, dmax, blkno;	long i, j, s;	register struct csum *cs;	/*	 * Determine block bounds for cylinder group.	 * Allow space for super block summary information in first	 * cylinder group.	 */	cbase = cgbase(&sblock, cylno);	dmax = cbase + sblock.fs_fpg;	if (dmax > sblock.fs_size)		dmax = sblock.fs_size;	dlower = cgsblock(&sblock, cylno) - cbase;	dupper = cgdmin(&sblock, cylno) - cbase;	if (cylno == 0)		dupper += howmany(sblock.fs_cssize, sblock.fs_fsize);	cs = fscs + cylno;	bzero(&acg, sblock.fs_cgsize);	acg.cg_time = utime;	acg.cg_magic = CG_MAGIC;	acg.cg_cgx = cylno;	if (cylno == sblock.fs_ncg - 1)		acg.cg_ncyl = sblock.fs_ncyl % sblock.fs_cpg;	else		acg.cg_ncyl = sblock.fs_cpg;	acg.cg_niblk = sblock.fs_ipg;	acg.cg_ndblk = dmax - cbase;	if (sblock.fs_contigsumsize > 0)		acg.cg_nclusterblks = acg.cg_ndblk / sblock.fs_frag;	acg.cg_btotoff = &acg.cg_space[0] - (u_char *)(&acg.cg_link);	acg.cg_boff = acg.cg_btotoff + sblock.fs_cpg * sizeof(long);	acg.cg_iusedoff = acg.cg_boff + 		sblock.fs_cpg * sblock.fs_nrpos * sizeof(short);	acg.cg_freeoff = acg.cg_iusedoff + howmany(sblock.fs_ipg, NBBY);	if (sblock.fs_contigsumsize <= 0) {		acg.cg_nextfreeoff = acg.cg_freeoff +		   howmany(sblock.fs_cpg * sblock.fs_spc / NSPF(&sblock), NBBY);	} else {		acg.cg_clustersumoff = acg.cg_freeoff + howmany		    (sblock.fs_cpg * sblock.fs_spc / NSPF(&sblock), NBBY) -		    sizeof(long);		acg.cg_clustersumoff =		    roundup(acg.cg_clustersumoff, sizeof(long));		acg.cg_clusteroff = acg.cg_clustersumoff +		    (sblock.fs_contigsumsize + 1) * sizeof(long);		acg.cg_nextfreeoff = acg.cg_clusteroff + howmany		    (sblock.fs_cpg * sblock.fs_spc / NSPB(&sblock), NBBY);	}	if (acg.cg_nextfreeoff - (long)(&acg.cg_link) > sblock.fs_cgsize) {		printf("Panic: cylinder group too big\n");		exit(37);	}	acg.cg_cs.cs_nifree += sblock.fs_ipg;	if (cylno == 0)		for (i = 0; i < ROOTINO; i++) {			setbit(cg_inosused(&acg), i);			acg.cg_cs.cs_nifree--;		}	for (i = 0; i < sblock.fs_ipg / INOPF(&sblock); i += sblock.fs_frag)		wtfs(fsbtodb(&sblock, cgimin(&sblock, cylno) + i),		    sblock.fs_bsize, (char *)zino);	if (cylno > 0) {		/*		 * In cylno 0, beginning space is reserved		 * for boot and super blocks.		 */		for (d = 0; d < dlower; d += sblock.fs_frag) {			blkno = d / sblock.fs_frag;			setblock(&sblock, cg_blksfree(&acg), blkno);			if (sblock.fs_contigsumsize > 0)				setbit(cg_clustersfree(&acg), blkno);			acg.cg_cs.cs_nbfree++;			cg_blktot(&acg)[cbtocylno(&sblock, d)]++;			cg_blks(&sblock, &acg, cbtocylno(&sblock, d))			    [cbtorpos(&sblock, d)]++;		}		sblock.fs_dsize += dlower;	}	sblock.fs_dsize += acg.cg_ndblk - dupper;	if (i = dupper % sblock.fs_frag) {		acg.cg_frsum[sblock.fs_frag - i]++;		for (d = dupper + sblock.fs_frag - i; dupper < d; dupper++) {			setbit(cg_blksfree(&acg), dupper);			acg.cg_cs.cs_nffree++;		}	}	for (d = dupper; d + sblock.fs_frag <= dmax - cbase; ) {		blkno = d / sblock.fs_frag;		setblock(&sblock, cg_blksfree(&acg), blkno);		if (sblock.fs_contigsumsize > 0)			setbit(cg_clustersfree(&acg), blkno);		acg.cg_cs.cs_nbfree++;		cg_blktot(&acg)[cbtocylno(&sblock, d)]++;		cg_blks(&sblock, &acg, cbtocylno(&sblock, d))		    [cbtorpos(&sblock, d)]++;		d += sblock.fs_frag;	}	if (d < dmax - cbase) {		acg.cg_frsum[dmax - cbase - d]++;		for (; d < dmax - cbase; d++) {			setbit(cg_blksfree(&acg), d);			acg.cg_cs.cs_nffree++;		}	}	if (sblock.fs_contigsumsize > 0) {		long *sump = cg_clustersum(&acg);		u_char *mapp = cg_clustersfree(&acg);		int map = *mapp++;		int bit = 1;		int run = 0;		for (i = 0; i < acg.cg_nclusterblks; i++) {			if ((map & bit) != 0) {				run++;			} else if (run != 0) {				if (run > sblock.fs_contigsumsize)					run = sblock.fs_contigsumsize;				sump[run]++;				run = 0;			}			if ((i & (NBBY - 1)) != (NBBY - 1)) {				bit <<= 1;			} else {				map = *mapp++;				bit = 1;			}		}		if (run != 0) {			if (run > sblock.fs_contigsumsize)				run = sblock.fs_contigsumsize;			sump[run]++;		}	}	sblock.fs_cstotal.cs_ndir += acg.cg_cs.cs_ndir;	sblock.fs_cstotal.cs_nffree += acg.cg_cs.cs_nffree;	sblock.fs_cstotal.cs_nbfree += acg.cg_cs.cs_nbfree;	sblock.fs_cstotal.cs_nifree += acg.cg_cs.cs_nifree;	*cs = acg.cg_cs;	wtfs(fsbtodb(&sblock, cgtod(&sblock, cylno)),		sblock.fs_bsize, (char *)&acg);}/* * initialize the file system */struct dinode node;#ifdef LOSTDIR#define PREDEFDIR 3#else#define PREDEFDIR 2#endifstruct direct root_dir[] = {	{ ROOTINO, sizeof(struct direct), DT_DIR, 1, "." },	{ ROOTINO, sizeof(struct direct), DT_DIR, 2, ".." },#ifdef LOSTDIR	{ LOSTFOUNDINO, sizeof(struct direct), DT_DIR, 10, "lost+found" },#endif};struct odirect {	u_long	d_ino;	u_short	d_reclen;	u_short	d_namlen;	u_char	d_name[MAXNAMLEN + 1];} oroot_dir[] = {	{ ROOTINO, sizeof(struct direct), 1, "." },	{ ROOTINO, sizeof(struct direct), 2, ".." },#ifdef LOSTDIR	{ LOSTFOUNDINO, sizeof(struct direct), 10, "lost+found" },#endif};#ifdef LOSTDIRstruct direct lost_found_dir[] = {	{ LOSTFOUNDINO, sizeof(struct direct), DT_DIR, 1, "." },

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -