static void create_bad_block_inode(ext2_filsys fs, badblocks_list bb_list) { errcode_t retval; ext2fs_mark_inode_bitmap(fs->inode_map, EXT2_BAD_INO); fs->group_desc[0].bg_free_inodes_count--; fs->super->s_free_inodes_count--; retval = ext2fs_update_bb_inode(fs, bb_list); if (retval) { com_err("ext2fs_update_bb_inode", retval, _("while setting bad block inode")); exit(1); } }
void read_bad_blocks_file(e2fsck_t ctx, const char *bad_blocks_file, int replace_bad_blocks) { ext2_filsys fs = ctx->fs; errcode_t retval; badblocks_list bb_list = 0; FILE *f; char buf[1024]; e2fsck_read_bitmaps(ctx); /* * Make sure the bad block inode is sane. If there are any * illegal blocks, clear them. */ retval = ext2fs_block_iterate(fs, EXT2_BAD_INO, 0, 0, check_bb_inode_blocks, 0); if (retval) { com_err("ext2fs_block_iterate", retval, "%s", _("while sanity checking the bad blocks inode")); goto fatal; } /* * If we're appending to the bad blocks inode, read in the * current bad blocks. */ if (!replace_bad_blocks) { retval = ext2fs_read_bb_inode(fs, &bb_list); if (retval) { com_err("ext2fs_read_bb_inode", retval, "%s", _("while reading the bad blocks inode")); goto fatal; } } /* * Now read in the bad blocks from the file; if * bad_blocks_file is null, then try to run the badblocks * command. */ if (bad_blocks_file) { f = fopen(bad_blocks_file, "r"); if (!f) { com_err("read_bad_blocks_file", errno, _("while trying to open %s"), bad_blocks_file); goto fatal; } } else { sprintf(buf, "badblocks -b %d -X %s%s%s %llu", fs->blocksize, (ctx->options & E2F_OPT_PREEN) ? "" : "-s ", (ctx->options & E2F_OPT_WRITECHECK) ? "-n " : "", fs->device_name, ext2fs_blocks_count(fs->super)-1); f = popen(buf, "r"); if (!f) { com_err("read_bad_blocks_file", errno, _("while trying popen '%s'"), buf); goto fatal; } } retval = ext2fs_read_bb_FILE(fs, f, &bb_list, invalid_block); if (bad_blocks_file) fclose(f); else pclose(f); if (retval) { com_err("ext2fs_read_bb_FILE", retval, "%s", _("while reading in list of bad blocks from file")); goto fatal; } /* * Finally, update the bad blocks from the bad_block_map */ printf("%s: Updating bad block inode.\n", ctx->device_name); retval = ext2fs_update_bb_inode(fs, bb_list); if (retval) { com_err("ext2fs_update_bb_inode", retval, "%s", _("while updating bad block inode")); goto fatal; } ext2fs_badblocks_list_free(bb_list); return; fatal: ctx->flags |= E2F_FLAG_ABORT; return; }
void read_bad_blocks_file(e2fsck_t ctx, const char *bad_blocks_file, int replace_bad_blocks) { ext2_filsys fs = ctx->fs; errcode_t retval; badblocks_list bb_list = 0; FILE *f; char buf[1024]; e2fsck_read_bitmaps(ctx); retval = ext2fs_block_iterate(fs, EXT2_BAD_INO, 0, 0, check_bb_inode_blocks, 0); if (retval) { com_err("ext2fs_block_iterate", retval, _("while sanity checking the bad blocks inode")); goto fatal; } if (!replace_bad_blocks) { retval = ext2fs_read_bb_inode(fs, &bb_list); if (retval) { com_err("ext2fs_read_bb_inode", retval, _("while reading the bad blocks inode")); goto fatal; } } if (bad_blocks_file) { f = fopen(bad_blocks_file, "r"); if (!f) { com_err("read_bad_blocks_file", errno, _("while trying to open %s"), bad_blocks_file); goto fatal; } } else { sprintf(buf, "badblocks -b %d -X %s%s%s %d", fs->blocksize, (ctx->options & E2F_OPT_PREEN) ? "" : "-s ", (ctx->options & E2F_OPT_WRITECHECK) ? "-n " : "", fs->device_name, fs->super->s_blocks_count-1); f = popen(buf, "r"); if (!f) { com_err("read_bad_blocks_file", errno, _("while trying popen '%s'"), buf); goto fatal; } } retval = ext2fs_read_bb_FILE(fs, f, &bb_list, invalid_block); if (bad_blocks_file) fclose(f); else pclose(f); if (retval) { com_err("ext2fs_read_bb_FILE", retval, _("while reading in list of bad blocks from file")); goto fatal; } printf("%s: Updating bad block inode.\n", ctx->device_name); retval = ext2fs_update_bb_inode(fs, bb_list); if (retval) { com_err("ext2fs_update_bb_inode", retval, _("while updating bad block inode")); goto fatal; } ext2fs_badblocks_list_free(bb_list); return; fatal: ctx->flags |= E2F_FLAG_ABORT; return; }