📄 fsck_minix.c
字号:
block = check_zone_nr(inode->i_zone + 7, &changed); read_block(block, (char *) ind); blk_chg = 0; result = check_zone_nr(blknr + ind, &blk_chg); if (blk_chg) write_block(block, (char *) ind); return result; } blknr -= 512; block = check_zone_nr(inode->i_zone + 8, &changed); read_block(block, (char *) dind); blk_chg = 0; result = check_zone_nr(dind + (blknr / 512), &blk_chg); if (blk_chg) write_block(block, (char *) dind); block = result; read_block(block, (char *) ind); blk_chg = 0; result = check_zone_nr(ind + (blknr % 512), &blk_chg); if (blk_chg) write_block(block, (char *) ind); return result;}#ifdef BB_FEATURE_MINIX2static int map_block2(struct minix2_inode *inode, unsigned int blknr){ unsigned int ind[BLOCK_SIZE >> 2]; unsigned int dind[BLOCK_SIZE >> 2]; unsigned int tind[BLOCK_SIZE >> 2]; int blk_chg, block, result; if (blknr < 7) return check_zone_nr2(inode->i_zone + blknr, &changed); blknr -= 7; if (blknr < 256) { block = check_zone_nr2(inode->i_zone + 7, &changed); read_block(block, (char *) ind); blk_chg = 0; result = check_zone_nr2(blknr + ind, &blk_chg); if (blk_chg) write_block(block, (char *) ind); return result; } blknr -= 256; if (blknr >= 256 * 256) { block = check_zone_nr2(inode->i_zone + 8, &changed); read_block(block, (char *) dind); blk_chg = 0; result = check_zone_nr2(dind + blknr / 256, &blk_chg); if (blk_chg) write_block(block, (char *) dind); block = result; read_block(block, (char *) ind); blk_chg = 0; result = check_zone_nr2(ind + blknr % 256, &blk_chg); if (blk_chg) write_block(block, (char *) ind); return result; } blknr -= 256 * 256; block = check_zone_nr2(inode->i_zone + 9, &changed); read_block(block, (char *) tind); blk_chg = 0; result = check_zone_nr2(tind + blknr / (256 * 256), &blk_chg); if (blk_chg) write_block(block, (char *) tind); block = result; read_block(block, (char *) dind); blk_chg = 0; result = check_zone_nr2(dind + (blknr / 256) % 256, &blk_chg); if (blk_chg) write_block(block, (char *) dind); block = result; read_block(block, (char *) ind); blk_chg = 0; result = check_zone_nr2(ind + blknr % 256, &blk_chg); if (blk_chg) write_block(block, (char *) ind); return result;}#endifstatic void write_super_block(void){ /* * Set the state of the filesystem based on whether or not there * are uncorrected errors. The filesystem valid flag is * unconditionally set if we get this far. */ Super.s_state |= MINIX_VALID_FS; if (errors_uncorrected) Super.s_state |= MINIX_ERROR_FS; else Super.s_state &= ~MINIX_ERROR_FS; if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET)) die("seek failed in write_super_block"); if (BLOCK_SIZE != write(IN, super_block_buffer, BLOCK_SIZE)) die("unable to write super-block"); return;}static void write_tables(void){ write_super_block(); if (IMAPS * BLOCK_SIZE != write(IN, inode_map, IMAPS * BLOCK_SIZE)) die("Unable to write inode map"); if (ZMAPS * BLOCK_SIZE != write(IN, zone_map, ZMAPS * BLOCK_SIZE)) die("Unable to write zone map"); if (INODE_BUFFER_SIZE != write(IN, inode_buffer, INODE_BUFFER_SIZE)) die("Unable to write inodes");}static void get_dirsize(void){ int block; char blk[BLOCK_SIZE]; int size;#ifdef BB_FEATURE_MINIX2 if (version2) block = Inode2[ROOT_INO].i_zone[0]; else#endif block = Inode[ROOT_INO].i_zone[0]; read_block(block, blk); for (size = 16; size < BLOCK_SIZE; size <<= 1) { if (strcmp(blk + size + 2, "..") == 0) { dirsize = size; namelen = size - 2; return; } } /* use defaults */}static void read_superblock(void){ if (BLOCK_SIZE != lseek(IN, BLOCK_SIZE, SEEK_SET)) die("seek failed"); if (BLOCK_SIZE != read(IN, super_block_buffer, BLOCK_SIZE)) die("unable to read super block"); if (MAGIC == MINIX_SUPER_MAGIC) { namelen = 14; dirsize = 16; version2 = 0; } else if (MAGIC == MINIX_SUPER_MAGIC2) { namelen = 30; dirsize = 32; version2 = 0;#ifdef BB_FEATURE_MINIX2 } else if (MAGIC == MINIX2_SUPER_MAGIC) { namelen = 14; dirsize = 16; version2 = 1; } else if (MAGIC == MINIX2_SUPER_MAGIC2) { namelen = 30; dirsize = 32; version2 = 1;#endif } else die("bad magic number in super-block"); if (ZONESIZE != 0 || BLOCK_SIZE != 1024) die("Only 1k blocks/zones supported"); if (IMAPS * BLOCK_SIZE * 8 < INODES + 1) die("bad s_imap_blocks field in super-block"); if (ZMAPS * BLOCK_SIZE * 8 < ZONES - FIRSTZONE + 1) die("bad s_zmap_blocks field in super-block");}static void read_tables(void){ inode_map = xmalloc(IMAPS * BLOCK_SIZE); zone_map = xmalloc(ZMAPS * BLOCK_SIZE); memset(inode_map, 0, sizeof(inode_map)); memset(zone_map, 0, sizeof(zone_map)); inode_buffer = xmalloc(INODE_BUFFER_SIZE); inode_count = xmalloc(INODES + 1); zone_count = xmalloc(ZONES); if (IMAPS * BLOCK_SIZE != read(IN, inode_map, IMAPS * BLOCK_SIZE)) die("Unable to read inode map"); if (ZMAPS * BLOCK_SIZE != read(IN, zone_map, ZMAPS * BLOCK_SIZE)) die("Unable to read zone map"); if (INODE_BUFFER_SIZE != read(IN, inode_buffer, INODE_BUFFER_SIZE)) die("Unable to read inodes"); if (NORM_FIRSTZONE != FIRSTZONE) { printf("Warning: Firstzone != Norm_firstzone\n"); errors_uncorrected = 1; } get_dirsize(); if (show) { 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", MAXSIZE); printf("Filesystem state=%d\n", Super.s_state); printf("namelen=%d\n\n", namelen); }}static struct minix_inode *get_inode(unsigned int nr){ struct minix_inode *inode; if (!nr || nr > INODES) return NULL; total++; inode = Inode + nr; if (!inode_count[nr]) { if (!inode_in_use(nr)) { printf("Inode %d marked not used, but used for file '", nr); print_current_name(); printf("'\n"); if (repair) { if (ask("Mark in use", 1)) mark_inode(nr); } else { errors_uncorrected = 1; } } if (S_ISDIR(inode->i_mode)) directory++; else if (S_ISREG(inode->i_mode)) regular++; else if (S_ISCHR(inode->i_mode)) chardev++; else if (S_ISBLK(inode->i_mode)) blockdev++; else if (S_ISLNK(inode->i_mode)) symlinks++; else if (S_ISSOCK(inode->i_mode)); else if (S_ISFIFO(inode->i_mode)); else { print_current_name(); printf(" has mode %05o\n", inode->i_mode); } } else links++; if (!++inode_count[nr]) { printf("Warning: inode count too big.\n"); inode_count[nr]--; errors_uncorrected = 1; } return inode;}#ifdef BB_FEATURE_MINIX2static struct minix2_inode *get_inode2(unsigned int nr){ struct minix2_inode *inode; if (!nr || nr > INODES) return NULL; total++; inode = Inode2 + nr; if (!inode_count[nr]) { if (!inode_in_use(nr)) { printf("Inode %d marked not used, but used for file '", nr); print_current_name(); printf("'\n"); if (repair) { if (ask("Mark in use", 1)) mark_inode(nr); else errors_uncorrected = 1; } } if (S_ISDIR(inode->i_mode)) directory++; else if (S_ISREG(inode->i_mode)) regular++; else if (S_ISCHR(inode->i_mode)) chardev++; else if (S_ISBLK(inode->i_mode)) blockdev++; else if (S_ISLNK(inode->i_mode)) symlinks++; else if (S_ISSOCK(inode->i_mode)); else if (S_ISFIFO(inode->i_mode)); else { print_current_name(); printf(" has mode %05o\n", inode->i_mode); } } else links++; if (!++inode_count[nr]) { printf("Warning: inode count too big.\n"); inode_count[nr]--; errors_uncorrected = 1; } return inode;}#endifstatic void check_root(void){ struct minix_inode *inode = Inode + ROOT_INO; if (!inode || !S_ISDIR(inode->i_mode)) die("root inode isn't a directory");}#ifdef BB_FEATURE_MINIX2static void check_root2(void){ struct minix2_inode *inode = Inode2 + ROOT_INO; if (!inode || !S_ISDIR(inode->i_mode)) die("root inode isn't a directory");}#endifstatic int add_zone(unsigned short *znr, int *corrected){ int result; int block; result = 0; block = check_zone_nr(znr, corrected); if (!block) return 0; if (zone_count[block]) { printf("Block has been used before. Now in file `"); print_current_name(); printf("'."); if (ask("Clear", 1)) { *znr = 0; block = 0; *corrected = 1; } } if (!block) return 0; if (!zone_in_use(block)) { printf("Block %d in file `", block); print_current_name(); printf("' is marked not in use."); if (ask("Correct", 1)) mark_zone(block); } if (!++zone_count[block]) zone_count[block]--; return block;}#ifdef BB_FEATURE_MINIX2static int add_zone2(unsigned int *znr, int *corrected){ int result; int block; result = 0; block = check_zone_nr2(znr, corrected); if (!block) return 0; if (zone_count[block]) { printf("Block has been used before. Now in file `"); print_current_name(); printf("'."); if (ask("Clear", 1)) { *znr = 0; block = 0; *corrected = 1; } } if (!block) return 0; if (!zone_in_use(block)) { printf("Block %d in file `", block); print_current_name(); printf("' is marked not in use."); if (ask("Correct", 1)) mark_zone(block); } if (!++zone_count[block]) zone_count[block]--; return block;}#endifstatic void add_zone_ind(unsigned short *znr, int *corrected){ static char blk[BLOCK_SIZE]; int i, chg_blk = 0; int block; block = add_zone(znr, corrected); if (!block) return; read_block(block, blk); for (i = 0; i < (BLOCK_SIZE >> 1); i++) add_zone(i + (unsigned short *) blk, &chg_blk); if (chg_blk) write_block(block, blk);}#ifdef BB_FEATURE_MINIX2static void add_zone_ind2(unsigned int *znr, int *corrected){ static char blk[BLOCK_SIZE]; int i, chg_blk = 0; int block; block = add_zone2(znr, corrected); if (!block) return; read_block(block, blk); for (i = 0; i < BLOCK_SIZE >> 2; i++) add_zone2(i + (unsigned int *) blk, &chg_blk); if (chg_blk) write_block(block, blk);}#endifstatic void add_zone_dind(unsigned short *znr, int *corrected){ static char blk[BLOCK_SIZE]; int i, blk_chg = 0; int block; block = add_zone(znr, corrected); if (!block) return; read_block(block, blk); for (i = 0; i < (BLOCK_SIZE >> 1); i++) add_zone_ind(i + (unsigned short *) blk, &blk_chg); if (blk_chg) write_block(block, blk);}#ifdef BB_FEATURE_MINIX2static void add_zone_dind2(unsigned int *znr, int *corrected){ static char blk[BLOCK_SIZE]; int i, blk_chg = 0; int block; block = add_zone2(znr, corrected); if (!block) return; read_block(block, blk); for (i = 0; i < BLOCK_SIZE >> 2; i++) add_zone_ind2(i + (unsigned int *) blk, &blk_chg); if (blk_chg) write_block(block, blk);}static void add_zone_tind2(unsigned int *znr, int *corrected){ static char blk[BLOCK_SIZE]; int i, blk_chg = 0; int block; block = add_zone2(znr, corrected); if (!block) return; read_block(block, blk); for (i = 0; i < BLOCK_SIZE >> 2; i++) add_zone_dind2(i + (unsigned int *) blk, &blk_chg); if (blk_chg) write_block(block, blk);}#endifstatic void check_zones(unsigned int i){ struct minix_inode *inode; if (!i || i > INODES) return; if (inode_count[i] > 1) /* have we counted this file already? */ return; inode = Inode + i; if (!S_ISDIR(inode->i_mode) && !S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode)) return; for (i = 0; i < 7; i++) add_zone(i + inode->i_zone, &changed); add_zone_ind(7 + inode->i_zone, &changed); add_zone_dind(8 + inode->i_zone, &changed);}#ifdef BB_FEATURE_MINIX2static void check_zones2(unsigned int i){ struct minix2_inode *inode; if (!i || i > INODES) return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -