/* * Utility routine to adjust the inode counts on an inode. */ errcode_t e2fsck_adjust_inode_count(e2fsck_t ctx, ext2_ino_t ino, int adj) { ext2_filsys fs = ctx->fs; errcode_t retval; struct ext2_inode inode; if (!ino) return 0; retval = ext2fs_read_inode(fs, ino, &inode); if (retval) return retval; #if 0 printf("Adjusting link count for inode %lu by %d (from %d)\n", ino, adj, inode.i_links_count); #endif if (adj == 1) { ext2fs_icount_increment(ctx->inode_count, ino, 0); if (inode.i_links_count == (__u16) ~0) return 0; ext2fs_icount_increment(ctx->inode_link_info, ino, 0); inode.i_links_count++; } else if (adj == -1) { ext2fs_icount_decrement(ctx->inode_count, ino, 0); if (inode.i_links_count == 0) return 0; ext2fs_icount_decrement(ctx->inode_link_info, ino, 0); inode.i_links_count--; } retval = ext2fs_write_inode(fs, ino, &inode); if (retval) return retval; return 0; }
void do_decrement(int argc, char **argv) { const char *usage = "usage: %s inode\n"; errcode_t retval; ext2_ino_t ino; __u16 count; if (argc < 2) { printf(usage, argv[0]); return; } if (check_icount(argv[0])) return; if (parse_inode(argv[0], "inode", argv[1], &ino)) return; retval = ext2fs_icount_decrement(test_icount, ino, &count); if (retval) { com_err(argv[0], retval, "while calling ext2fs_icount_decrement"); return; } printf("Count is now %u\n", count); }
int run_test(int flags, int size, char *dir, struct test_program *prog) { errcode_t retval; ext2_icount_t icount; struct test_program *pc; __u16 result; int problem = 0; if (dir) { retval = ext2fs_create_icount_tdb(test_fs, dir, flags, &icount); if (retval) { com_err("run_test", retval, "while creating icount using tdb"); exit(1); } } else { retval = ext2fs_create_icount2(test_fs, flags, size, 0, &icount); if (retval) { com_err("run_test", retval, "while creating icount"); exit(1); } } for (pc = prog; pc->cmd != EXIT; pc++) { switch (pc->cmd) { case FETCH: printf("icount_fetch(%u) = ", pc->ino); break; case STORE: retval = ext2fs_icount_store(icount, pc->ino, pc->arg); if (retval) { com_err("run_test", retval, "while calling icount_store"); exit(1); } printf("icount_store(%u, %u) = ", pc->ino, pc->arg); break; case INCREMENT: retval = ext2fs_icount_increment(icount, pc->ino, 0); if (retval) { com_err("run_test", retval, "while calling icount_increment"); exit(1); } printf("icount_increment(%u) = ", pc->ino); break; case DECREMENT: retval = ext2fs_icount_decrement(icount, pc->ino, 0); if (retval) { com_err("run_test", retval, "while calling icount_decrement"); exit(1); } printf("icount_decrement(%u) = ", pc->ino); break; } retval = ext2fs_icount_fetch(icount, pc->ino, &result); if (retval) { com_err("run_test", retval, "while calling icount_fetch"); exit(1); } printf("%u (%s)\n", result, (result == pc->expected) ? "OK" : "NOT OK"); if (result != pc->expected) problem++; } printf("icount size is %u\n", ext2fs_get_icount_size(icount)); retval = ext2fs_icount_validate(icount, stdout); if (retval) { com_err("run_test", retval, "while calling icount_validate"); exit(1); } ext2fs_free_icount(icount); return problem; }