45
45
#include <inttypes.h>
46
46
#include <limits.h>
47
47
#include <string.h>
51
static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *, int *, int, int);
52
static void check_maps(u_char *, u_char *, int, ufs2_daddr_t, const char *,
53
int *, int, int, int);
54
static void clear_blocks(ufs2_daddr_t start, ufs2_daddr_t end);
56
59
int c, i, j, blk, frags, basesize, mapsize;
57
60
int inomapsize, blkmapsize;
58
61
struct fs *fs = &sblock;
59
struct cg *cg = &cgrp;
60
ufs2_daddr_t d, dbase, dmax;
61
int excessdirs, rewritecg = 0;
62
ufs2_daddr_t d, dbase, dmax, start;
63
65
struct csum_total cstotal;
64
66
struct inodesc idesc[3];
65
67
char buf[MAXBSIZE];
66
struct cg *newcg = (struct cg *)buf;
68
struct cg *cg, *newcg = (struct cg *)buf;
68
71
inoinfo(WINO)->ino_state = USTATE;
69
72
memset(newcg, 0, (size_t)fs->fs_cgsize);
159
162
c * 100 / sblock.fs_ncg);
160
163
got_sigalarm = 0;
162
getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize);
166
cg = cgbp->b_un.b_cg;
163
167
if (!cg_chkmagic(cg))
164
168
pfatal("CG %d: BAD MAGIC NUMBER\n", c);
165
169
newcg->cg_time = cg->cg_time;
241
245
setbit(cg_inosused(newcg), i);
242
246
newcg->cg_cs.cs_nifree--;
244
249
for (i = 0, d = dbase;
246
251
d += fs->fs_frag, i += fs->fs_frag) {
248
253
for (j = 0; j < fs->fs_frag; j++) {
254
if (testbmap(d + j)) {
255
if ((Eflag || Zflag) && start != -1) {
256
clear_blocks(start, d + j - 1);
251
263
setbit(cg_blksfree(newcg), i + j);
262
274
ffs_fragacct(fs, blk, newcg->cg_frsum, 1);
277
if ((Eflag || Zflag) && start != -1)
278
clear_blocks(start, d - 1);
265
279
if (fs->fs_contigsumsize > 0) {
266
280
int32_t *sump = cg_clustersum(newcg);
267
281
u_char *mapp = cg_clustersfree(newcg);
313
327
memmove(cg, newcg, (size_t)fs->fs_cgsize);
317
331
if (cursnapshot == 0 &&
318
332
memcmp(newcg, cg, basesize) != 0 &&
319
333
dofix(&idesc[2], "SUMMARY INFORMATION BAD")) {
320
334
memmove(cg, newcg, (size_t)basesize);
323
if (bkgrdflag != 0 || usedsoftdep || debug) {
324
excessdirs = cg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
325
if (excessdirs < 0) {
326
pfatal("LOST %d DIRECTORIES\n", -excessdirs);
330
check_maps(cg_inosused(newcg), cg_inosused(cg),
332
cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg,
334
freedirs, 0, excessdirs);
335
check_maps(cg_inosused(newcg), cg_inosused(cg),
337
cg->cg_cgx * (ufs2_daddr_t) fs->fs_ipg, "FILE",
338
freefiles, excessdirs, fs->fs_ipg);
339
check_maps(cg_blksfree(cg), cg_blksfree(newcg),
341
cg->cg_cgx * (ufs2_daddr_t) fs->fs_fpg, "FRAG",
342
freeblks, 0, fs->fs_fpg);
337
if (bkgrdflag != 0 || usedsoftdep || debug)
338
update_maps(cg, newcg, bkgrdflag);
344
339
if (cursnapshot == 0 &&
345
340
memcmp(cg_inosused(newcg), cg_inosused(cg), mapsize) != 0 &&
346
341
dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) {
347
342
memmove(cg_inosused(cg), cg_inosused(newcg),
348
343
(size_t)mapsize);
352
347
if (cursnapshot == 0 &&
412
* Compare the original cylinder group inode and block bitmaps with the
413
* updated cylinder group inode and block bitmaps. Free inodes and blocks
414
* that have been added. Complain if any previously freed inodes blocks
419
struct cg *oldcg, /* cylinder group of claimed allocations */
420
struct cg *newcg, /* cylinder group of determined allocations */
421
int usesysctl) /* 1 => use sysctl interface to update maps */
423
int inomapsize, excessdirs;
424
struct fs *fs = &sblock;
426
inomapsize = howmany(fs->fs_ipg, CHAR_BIT);
427
excessdirs = oldcg->cg_cs.cs_ndir - newcg->cg_cs.cs_ndir;
428
if (excessdirs < 0) {
429
pfatal("LOST %d DIRECTORIES\n", -excessdirs);
433
check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
434
oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "DIR", freedirs,
435
0, excessdirs, usesysctl);
436
check_maps(cg_inosused(newcg), cg_inosused(oldcg), inomapsize,
437
oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_ipg, "FILE", freefiles,
438
excessdirs, fs->fs_ipg, usesysctl);
439
check_maps(cg_blksfree(oldcg), cg_blksfree(newcg),
440
howmany(fs->fs_fpg, CHAR_BIT),
441
oldcg->cg_cgx * (ufs2_daddr_t)fs->fs_fpg, "FRAG",
442
freeblks, 0, fs->fs_fpg, usesysctl);
418
447
u_char *map1, /* map of claimed allocations */
422
451
const char *name, /* name of resource found in maps */
423
452
int *opcode, /* sysctl opcode to free resource */
424
453
int skip, /* number of entries to skip before starting to free */
425
int limit) /* limit on number of entries to free */
454
int limit, /* limit on number of entries to free */
455
int usesysctl) /* 1 => use sysctl interface to update maps */
427
457
# define BUFSIZE 16
428
458
char buf[BUFSIZE];
493
523
" MARKED USED\n",
494
524
"UNALLOCATED", name, ustart,
495
525
ustart + size - 1);
496
if (bkgrdflag != 0) {
526
if (usesysctl != 0) {
497
527
cmd.value = ustart;
499
529
if (sysctl(opcode, MIBSIZE, 0, 0,
539
569
" MARKED USED\n",
540
570
name, ustart, ustart + size - 1);
542
if (bkgrdflag != 0) {
572
if (usesysctl != 0) {
543
573
cmd.value = ustart;
545
575
if (sysctl(opcode, MIBSIZE, 0, 0, &cmd,
585
clear_blocks(ufs2_daddr_t start, ufs2_daddr_t end)
589
printf("Zero frags %jd to %jd\n", start, end);
591
blzero(fswritefd, fsbtodb(&sblock, start),
592
lfragtosize(&sblock, end - start + 1));
594
blerase(fswritefd, fsbtodb(&sblock, start),
595
lfragtosize(&sblock, end - start + 1));