📄 mkfs.minix.c
字号:
unsigned long dind_block[BLOCK_SIZE >> 2]; if (!badblocks) return; mark_inode (MINIX_BAD_INO); inode->i_nlinks = 1; inode->i_atime = inode->i_mtime = inode->i_ctime = time (NULL); inode->i_mode = S_IFREG + 0000; inode->i_size = badblocks * BLOCK_SIZE; zone = next (0); for (i = 0; i < 7; i++) { inode->i_zone[i] = zone; if (!NEXT_BAD) goto end_bad; } inode->i_zone[7] = ind = get_free_block (); memset (ind_block, 0, BLOCK_SIZE); for (i = 0; i < 256; i++) { ind_block[i] = zone; if (!NEXT_BAD) goto end_bad; } inode->i_zone[8] = dind = get_free_block (); memset (dind_block, 0, BLOCK_SIZE); for (i = 0; i < 256; i++) { write_block (ind, (char *) ind_block); dind_block[i] = ind = get_free_block (); memset (ind_block, 0, BLOCK_SIZE); for (j = 0; j < 256; j++) { ind_block[j] = zone; if (!NEXT_BAD) goto end_bad; } } /* Could make triple indirect block here */ die (_("too many bad blocks")); end_bad: if (ind) write_block (ind, (char *) ind_block); if (dind) write_block (dind, (char *) dind_block);}static voidmake_root_inode(void) { struct minix_inode * inode = &Inode[MINIX_ROOT_INO]; mark_inode(MINIX_ROOT_INO); inode->i_zone[0] = get_free_block(); inode->i_nlinks = 2; inode->i_time = time(NULL); if (badblocks) inode->i_size = 3*dirsize; else { root_block[2*dirsize] = '\0'; root_block[2*dirsize+1] = '\0'; inode->i_size = 2*dirsize; } inode->i_mode = S_IFDIR + 0755; inode->i_uid = getuid(); if (inode->i_uid) inode->i_gid = getgid(); write_block(inode->i_zone[0],root_block);}static voidmake_root_inode2 (void) { struct minix2_inode *inode = &Inode2[MINIX_ROOT_INO]; mark_inode (MINIX_ROOT_INO); inode->i_zone[0] = get_free_block (); inode->i_nlinks = 2; inode->i_atime = inode->i_mtime = inode->i_ctime = time (NULL); if (badblocks) inode->i_size = 3 * dirsize; else { root_block[2 * dirsize] = '\0'; root_block[2 * dirsize + 1] = '\0'; inode->i_size = 2 * dirsize; } inode->i_mode = S_IFDIR + 0755; inode->i_uid = getuid(); if (inode->i_uid) inode->i_gid = getgid(); write_block (inode->i_zone[0], root_block);}static voidsetup_tables(void) { int i; unsigned long inodes; memset(super_block_buffer,0,BLOCK_SIZE); memset(boot_block_buffer,0,512); Super.s_magic = magic; Super.s_log_zone_size = 0; Super.s_max_size = version2 ? 0x7fffffff : (7+512+512*512)*1024; if (version2) Super.s_zones = BLOCKS; else Super.s_nzones = BLOCKS;/* some magic nrs: 1 inode / 3 blocks */ if ( req_nr_inodes == 0 ) inodes = BLOCKS/3; else inodes = req_nr_inodes; /* Round up inode count to fill block size */ if (version2) inodes = ((inodes + MINIX2_INODES_PER_BLOCK - 1) & ~(MINIX2_INODES_PER_BLOCK - 1)); else inodes = ((inodes + MINIX_INODES_PER_BLOCK - 1) & ~(MINIX_INODES_PER_BLOCK - 1)); if (inodes > 65535) inodes = 65535; Super.s_ninodes = inodes; /* The old code here * ZMAPS = 0; * while (ZMAPS != UPPER(BLOCKS - NORM_FIRSTZONE + 1,BITS_PER_BLOCK)) * ZMAPS = UPPER(BLOCKS - NORM_FIRSTZONE + 1,BITS_PER_BLOCK); * was no good, since it may loop. - aeb */ Super.s_imap_blocks = UPPER(INODES + 1, BITS_PER_BLOCK); Super.s_zmap_blocks = UPPER(BLOCKS - (1+IMAPS+INODE_BLOCKS), BITS_PER_BLOCK+1); Super.s_firstdatazone = NORM_FIRSTZONE; inode_map = malloc(IMAPS * BLOCK_SIZE); zone_map = malloc(ZMAPS * BLOCK_SIZE); if (!inode_map || !zone_map) die(_("unable to allocate buffers for maps")); memset(inode_map,0xff,IMAPS * BLOCK_SIZE); memset(zone_map,0xff,ZMAPS * BLOCK_SIZE); for (i = FIRSTZONE ; i<ZONES ; i++) unmark_zone(i); for (i = MINIX_ROOT_INO ; i<=INODES ; i++) unmark_inode(i); inode_buffer = malloc(INODE_BUFFER_SIZE); if (!inode_buffer) die(_("unable to allocate buffer for inodes")); memset(inode_buffer,0,INODE_BUFFER_SIZE); printf(_("%ld inodes\n"),INODES); printf(_("%ld blocks\n"),ZONES); printf(_("Firstdatazone=%ld (%ld)\n"),FIRSTZONE,NORM_FIRSTZONE); printf(_("Zonesize=%d\n"),BLOCK_SIZE<<ZONESIZE); printf(_("Maxsize=%ld\n\n"),MAXSIZE);}/* * Perform a test of a block; return the number of * blocks readable/writeable. */static longdo_check(char * buffer, int try, unsigned int current_block) { long got; /* Seek to the correct loc. */ if (lseek(DEV, current_block * BLOCK_SIZE, SEEK_SET) != current_block * BLOCK_SIZE ) { die(_("seek failed during testing of blocks")); } /* Try the read */ got = read(DEV, buffer, try * BLOCK_SIZE); if (got < 0) got = 0; if (got & (BLOCK_SIZE - 1 )) { printf(_("Weird values in do_check: probably bugs\n")); } got /= BLOCK_SIZE; return got;}static unsigned int currently_testing = 0;static voidalarm_intr(int alnum) { if (currently_testing >= ZONES) return; signal(SIGALRM,alarm_intr); alarm(5); if (!currently_testing) return; printf("%d ...", currently_testing); fflush(stdout);}static voidcheck_blocks(void) { int try,got; static char buffer[BLOCK_SIZE * TEST_BUFFER_BLOCKS]; currently_testing=0; signal(SIGALRM,alarm_intr); alarm(5); while (currently_testing < ZONES) { if (lseek(DEV,currently_testing*BLOCK_SIZE,SEEK_SET) != currently_testing*BLOCK_SIZE) die(_("seek failed in check_blocks")); try = TEST_BUFFER_BLOCKS; if (currently_testing + try > ZONES) try = ZONES-currently_testing; got = do_check(buffer, try, currently_testing); currently_testing += got; if (got == try) continue; if (currently_testing < FIRSTZONE) die(_("bad blocks before data-area: cannot make fs")); mark_zone(currently_testing); badblocks++; currently_testing++; } if (badblocks > 1) printf(_("%d bad blocks\n"), badblocks); else if (badblocks == 1) printf(_("one bad block\n"));}static voidget_list_blocks(char *filename) { FILE *listfile; unsigned long blockno; listfile = fopen(filename,"r"); if (listfile == NULL) die(_("can't open file of bad blocks")); while (!feof(listfile)) { fscanf(listfile,"%ld\n", &blockno); mark_zone(blockno); badblocks++; } fclose(listfile); if(badblocks > 1) printf(_("%d bad blocks\n"), badblocks); else if (badblocks == 1) printf(_("one bad block\n"));}intmain(int argc, char ** argv) { int i; char * tmp; struct stat statbuf; char * listfile = NULL; char * p; if (argc && *argv) program_name = *argv; if ((p = strrchr(program_name, '/')) != NULL) program_name = p+1; setlocale(LC_ALL, ""); bindtextdomain(PACKAGE, LOCALEDIR); textdomain(PACKAGE); if (argc == 2 && (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version"))) { printf(_("%s from %s\n"), program_name, util_linux_version); exit(0); } if (INODE_SIZE * MINIX_INODES_PER_BLOCK != BLOCK_SIZE) die(_("bad inode size")); if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE) die(_("bad inode size")); opterr = 0; while ((i = getopt(argc, argv, "ci:l:n:v")) != -1) switch (i) { case 'c': check=1; break; case 'i': req_nr_inodes = (unsigned long) atol(optarg); break; case 'l': listfile = optarg; break; case 'n': i = strtoul(optarg,&tmp,0); if (*tmp) usage(); if (i == 14) magic = MINIX_SUPER_MAGIC; else if (i == 30) magic = MINIX_SUPER_MAGIC2; else usage(); namelen = i; dirsize = i+2; break; case 'v': version2 = 1; break; default: usage(); } argc -= optind; argv += optind; if (argc > 0 && !device_name) { device_name = argv[0]; argc--; argv++; } if (argc > 0) { BLOCKS = strtol(argv[0],&tmp,0); if (*tmp) { printf(_("strtol error: number of blocks not specified")); usage(); } } if (device_name && !BLOCKS) BLOCKS = get_size (device_name) / 1024; if (!device_name || BLOCKS<10) { usage(); } if (version2) { if (namelen == 14) magic = MINIX2_SUPER_MAGIC; else magic = MINIX2_SUPER_MAGIC2; } else if (BLOCKS > 65535) BLOCKS = 65535; check_mount(); /* is it already mounted? */ tmp = root_block; *(short *)tmp = 1; strcpy(tmp+2,"."); tmp += dirsize; *(short *)tmp = 1; strcpy(tmp+2,".."); tmp += dirsize; *(short *)tmp = 2; strcpy(tmp+2,".badblocks"); DEV = open(device_name,O_RDWR ); if (DEV<0) die(_("unable to open %s")); if (fstat(DEV,&statbuf)<0) die(_("unable to stat %s")); if (!S_ISBLK(statbuf.st_mode)) check=0; else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340) die(_("will not try to make filesystem on '%s'")); setup_tables(); if (check) check_blocks(); else if (listfile) get_list_blocks(listfile); if (version2) { make_root_inode2 (); make_bad_inode2 (); } else { make_root_inode(); make_bad_inode(); } mark_good_blocks(); write_tables(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -