static void make_bad_inode_v1(struct fs_control *ctl) { struct minix_inode * inode = &Inode[MINIX_BAD_INO]; int i,j,zone; int ind=0,dind=0; unsigned short ind_block[MINIX_BLOCK_SIZE>>1]; unsigned short dind_block[MINIX_BLOCK_SIZE>>1]; #define NEXT_BAD (zone = next(zone)) if (!ctl->fs_bad_blocks) return; mark_inode(MINIX_BAD_INO); inode->i_nlinks = 1; inode->i_time = mkfs_minix_time(NULL); inode->i_mode = S_IFREG + 0000; inode->i_size = ctl->fs_bad_blocks * MINIX_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(ctl); memset(ind_block,0,MINIX_BLOCK_SIZE); for (i=0 ; i<512 ; i++) { ind_block[i] = zone; if (!NEXT_BAD) goto end_bad; } inode->i_zone[8] = dind = get_free_block(ctl); memset(dind_block,0,MINIX_BLOCK_SIZE); for (i=0 ; i<512 ; i++) { write_block(ctl, ind,(char *) ind_block); dind_block[i] = ind = get_free_block(ctl); memset(ind_block,0,MINIX_BLOCK_SIZE); for (j=0 ; j<512 ; j++) { ind_block[j] = zone; if (!NEXT_BAD) goto end_bad; } } errx(MKFS_EX_ERROR, _("%s: too many bad blocks"), ctl->device_name); end_bad: if (ind) write_block(ctl, ind, (char *) ind_block); if (dind) write_block(ctl, dind, (char *) dind_block); }
static void make_bad_inode_v2_v3 (struct fs_control *ctl) { struct minix2_inode *inode = &Inode2[MINIX_BAD_INO]; int i, j, zone; int ind = 0, dind = 0; unsigned long ind_block[MINIX_BLOCK_SIZE >> 2]; unsigned long dind_block[MINIX_BLOCK_SIZE >> 2]; if (!ctl->fs_bad_blocks) return; mark_inode (MINIX_BAD_INO); inode->i_nlinks = 1; inode->i_atime = inode->i_mtime = inode->i_ctime = mkfs_minix_time(NULL); inode->i_mode = S_IFREG + 0000; inode->i_size = ctl->fs_bad_blocks * MINIX_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 (ctl); memset (ind_block, 0, MINIX_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 (ctl); memset (dind_block, 0, MINIX_BLOCK_SIZE); for (i = 0; i < 256; i++) { write_block (ctl, ind, (char *) ind_block); dind_block[i] = ind = get_free_block (ctl); memset (ind_block, 0, MINIX_BLOCK_SIZE); for (j = 0; j < 256; j++) { ind_block[j] = zone; if (!NEXT_BAD) goto end_bad; } } /* Could make triple indirect block here */ errx(MKFS_EX_ERROR, _("%s: too many bad blocks"), ctl->device_name); end_bad: if (ind) write_block (ctl, ind, (char *) ind_block); if (dind) write_block (ctl, dind, (char *) dind_block); }
static void make_root_inode_v1(struct fs_control *ctl) { struct minix_inode * inode = &Inode[MINIX_ROOT_INO]; mark_inode(MINIX_ROOT_INO); inode->i_zone[0] = get_free_block(ctl); inode->i_nlinks = 2; inode->i_time = mkfs_minix_time(NULL); if (ctl->fs_bad_blocks) inode->i_size = 3 * ctl->fs_dirsize; else { memset(&root_block[2 * ctl->fs_dirsize], 0, ctl->fs_dirsize); inode->i_size = 2 * ctl->fs_dirsize; } inode->i_mode = S_IFDIR + 0755; inode->i_uid = getuid(); if (inode->i_uid) inode->i_gid = getgid(); write_block(ctl, inode->i_zone[0],root_block); }