setup.c (96483) | setup.c (98542) |
---|---|
1/* 2 * Copyright (c) 1980, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static const char sccsid[] = "@(#)setup.c 8.10 (Berkeley) 5/9/95"; 37#endif 38static const char rcsid[] = | 1/* 2 * Copyright (c) 1980, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static const char sccsid[] = "@(#)setup.c 8.10 (Berkeley) 5/9/95"; 37#endif 38static const char rcsid[] = |
39 "$FreeBSD: head/sbin/fsck_ffs/setup.c 96483 2002-05-12 23:44:15Z phk $"; | 39 "$FreeBSD: head/sbin/fsck_ffs/setup.c 98542 2002-06-21 06:18:05Z mckusick $"; |
40#endif /* not lint */ 41 42#define DKTYPENAMES 43#include <sys/param.h> 44#include <sys/stat.h> 45#include <sys/disklabel.h> 46#include <sys/file.h> 47#include <sys/sysctl.h> --- 157 unchanged lines hidden (view full) --- 205 if ((sblock.fs_minfree < 0 || sblock.fs_minfree > 99)) { 206 pfatal("IMPOSSIBLE MINFREE=%d IN SUPERBLOCK", 207 sblock.fs_minfree); 208 if (reply("SET TO DEFAULT") == 1) { 209 sblock.fs_minfree = 10; 210 sbdirty(); 211 } 212 } | 40#endif /* not lint */ 41 42#define DKTYPENAMES 43#include <sys/param.h> 44#include <sys/stat.h> 45#include <sys/disklabel.h> 46#include <sys/file.h> 47#include <sys/sysctl.h> --- 157 unchanged lines hidden (view full) --- 205 if ((sblock.fs_minfree < 0 || sblock.fs_minfree > 99)) { 206 pfatal("IMPOSSIBLE MINFREE=%d IN SUPERBLOCK", 207 sblock.fs_minfree); 208 if (reply("SET TO DEFAULT") == 1) { 209 sblock.fs_minfree = 10; 210 sbdirty(); 211 } 212 } |
213 if (sblock.fs_inodefmt < FS_44INODEFMT) { | 213 if (sblock.fs_magic == FS_UFS1_MAGIC && 214 sblock.fs_old_inodefmt < FS_44INODEFMT) { |
214 pwarn("Format of filesystem is too old.\n"); 215 pwarn("Must update to modern format using a version of fsck\n"); 216 pfatal("from before 2002 with the command ``fsck -c 2''\n"); 217 exit(EEXIT); 218 } 219 if (asblk.b_dirty && !bflag) { 220 memmove(&altsblock, &sblock, (size_t)sblock.fs_sbsize); 221 flush(fswritefd, &asblk); --- 59 unchanged lines hidden (view full) --- 281 return (1); 282 283badsb: 284 ckfini(0); 285 return (0); 286} 287 288/* | 215 pwarn("Format of filesystem is too old.\n"); 216 pwarn("Must update to modern format using a version of fsck\n"); 217 pfatal("from before 2002 with the command ``fsck -c 2''\n"); 218 exit(EEXIT); 219 } 220 if (asblk.b_dirty && !bflag) { 221 memmove(&altsblock, &sblock, (size_t)sblock.fs_sbsize); 222 flush(fswritefd, &asblk); --- 59 unchanged lines hidden (view full) --- 282 return (1); 283 284badsb: 285 ckfini(0); 286 return (0); 287} 288 289/* |
290 * Possible superblock locations ordered from most to least likely. 291 */ 292static int sblock_try[] = SBLOCKSEARCH; 293 294/* |
|
289 * Read in the super block and its summary info. 290 */ 291int 292readsb(int listerr) 293{ | 295 * Read in the super block and its summary info. 296 */ 297int 298readsb(int listerr) 299{ |
294 ufs_daddr_t super = bflag ? bflag : SBOFF / dev_bsize; | 300 ufs2_daddr_t super; 301 int i; |
295 | 302 |
296 if (bread(fsreadfd, (char *)&sblock, super, (long)SBSIZE) != 0) 297 return (0); 298 sblk.b_bno = super; 299 sblk.b_size = SBSIZE; | 303 if (bflag) { 304 super = bflag; 305 if ((bread(fsreadfd, (char *)&sblock, super, (long)SBLOCKSIZE))) 306 return (0); 307 } else { 308 for (i = 0; sblock_try[i] != -1; i++) { 309 super = sblock_try[i] / dev_bsize; 310 if ((bread(fsreadfd, (char *)&sblock, super, 311 (long)SBLOCKSIZE))) 312 return (0); 313 if ((sblock.fs_magic == FS_UFS1_MAGIC || 314 (sblock.fs_magic == FS_UFS2_MAGIC && 315 sblock.fs_sblockloc == 316 numfrags(&sblock, sblock_try[i]))) && 317 sblock.fs_ncg >= 1 && 318 sblock.fs_bsize >= SBLOCKSIZE && 319 sblock.fs_bsize >= sizeof(struct fs)) 320 break; 321 } 322 if (sblock_try[i] == -1) { 323 fprintf(stderr, "Cannot find filesystem superblock\n"); 324 return (0); 325 } 326 } |
300 /* | 327 /* |
301 * run a few consistency checks of the super block 302 */ 303 if (sblock.fs_magic != FS_MAGIC) 304 { badsb(listerr, "MAGIC NUMBER WRONG"); return (0); } 305 if (sblock.fs_ncg < 1) 306 { badsb(listerr, "NCG OUT OF RANGE"); return (0); } 307 if (sblock.fs_cpg < 1) 308 { badsb(listerr, "CPG OUT OF RANGE"); return (0); } 309 if (sblock.fs_sbsize > SBSIZE) 310 { badsb(listerr, "SIZE PREPOSTEROUSLY LARGE"); return (0); } 311 /* | |
312 * Compute block size that the filesystem is based on, 313 * according to fsbtodb, and adjust superblock block number 314 * so we can tell if this is an alternate later. 315 */ 316 super *= dev_bsize; 317 dev_bsize = sblock.fs_fsize / fsbtodb(&sblock, 1); 318 sblk.b_bno = super / dev_bsize; | 328 * Compute block size that the filesystem is based on, 329 * according to fsbtodb, and adjust superblock block number 330 * so we can tell if this is an alternate later. 331 */ 332 super *= dev_bsize; 333 dev_bsize = sblock.fs_fsize / fsbtodb(&sblock, 1); 334 sblk.b_bno = super / dev_bsize; |
335 sblk.b_size = SBLOCKSIZE; |
|
319 if (bflag) { 320 havesb = 1; 321 return (1); 322 } 323 /* 324 * Compare all fields that should not differ in alternate super block. 325 * When an alternate super-block is specified this check is skipped. 326 */ 327 getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1), sblock.fs_sbsize); 328 if (asblk.b_errs) 329 return (0); 330 if (altsblock.fs_sblkno != sblock.fs_sblkno || 331 altsblock.fs_cblkno != sblock.fs_cblkno || 332 altsblock.fs_iblkno != sblock.fs_iblkno || 333 altsblock.fs_dblkno != sblock.fs_dblkno || | 336 if (bflag) { 337 havesb = 1; 338 return (1); 339 } 340 /* 341 * Compare all fields that should not differ in alternate super block. 342 * When an alternate super-block is specified this check is skipped. 343 */ 344 getblk(&asblk, cgsblock(&sblock, sblock.fs_ncg - 1), sblock.fs_sbsize); 345 if (asblk.b_errs) 346 return (0); 347 if (altsblock.fs_sblkno != sblock.fs_sblkno || 348 altsblock.fs_cblkno != sblock.fs_cblkno || 349 altsblock.fs_iblkno != sblock.fs_iblkno || 350 altsblock.fs_dblkno != sblock.fs_dblkno || |
334 altsblock.fs_cgoffset != sblock.fs_cgoffset || 335 altsblock.fs_cgmask != sblock.fs_cgmask || | |
336 altsblock.fs_ncg != sblock.fs_ncg || 337 altsblock.fs_bsize != sblock.fs_bsize || 338 altsblock.fs_fsize != sblock.fs_fsize || 339 altsblock.fs_frag != sblock.fs_frag || 340 altsblock.fs_bmask != sblock.fs_bmask || 341 altsblock.fs_fmask != sblock.fs_fmask || 342 altsblock.fs_bshift != sblock.fs_bshift || 343 altsblock.fs_fshift != sblock.fs_fshift || 344 altsblock.fs_fragshift != sblock.fs_fragshift || 345 altsblock.fs_fsbtodb != sblock.fs_fsbtodb || 346 altsblock.fs_sbsize != sblock.fs_sbsize || 347 altsblock.fs_nindir != sblock.fs_nindir || 348 altsblock.fs_inopb != sblock.fs_inopb || 349 altsblock.fs_cssize != sblock.fs_cssize || | 351 altsblock.fs_ncg != sblock.fs_ncg || 352 altsblock.fs_bsize != sblock.fs_bsize || 353 altsblock.fs_fsize != sblock.fs_fsize || 354 altsblock.fs_frag != sblock.fs_frag || 355 altsblock.fs_bmask != sblock.fs_bmask || 356 altsblock.fs_fmask != sblock.fs_fmask || 357 altsblock.fs_bshift != sblock.fs_bshift || 358 altsblock.fs_fshift != sblock.fs_fshift || 359 altsblock.fs_fragshift != sblock.fs_fragshift || 360 altsblock.fs_fsbtodb != sblock.fs_fsbtodb || 361 altsblock.fs_sbsize != sblock.fs_sbsize || 362 altsblock.fs_nindir != sblock.fs_nindir || 363 altsblock.fs_inopb != sblock.fs_inopb || 364 altsblock.fs_cssize != sblock.fs_cssize || |
350 altsblock.fs_cpg != sblock.fs_cpg || | |
351 altsblock.fs_ipg != sblock.fs_ipg || 352 altsblock.fs_fpg != sblock.fs_fpg || 353 altsblock.fs_magic != sblock.fs_magic) { 354 badsb(listerr, 355 "VALUES IN SUPER BLOCK DISAGREE WITH THOSE IN FIRST ALTERNATE"); 356 return (0); 357 } | 365 altsblock.fs_ipg != sblock.fs_ipg || 366 altsblock.fs_fpg != sblock.fs_fpg || 367 altsblock.fs_magic != sblock.fs_magic) { 368 badsb(listerr, 369 "VALUES IN SUPER BLOCK DISAGREE WITH THOSE IN FIRST ALTERNATE"); 370 return (0); 371 } |
372 /* 373 * If not yet done, update UFS1 superblock with new wider fields. 374 */ 375 if (sblock.fs_magic == FS_UFS1_MAGIC && 376 sblock.fs_maxbsize != sblock.fs_bsize) { 377 sblock.fs_maxbsize = sblock.fs_bsize; 378 sblock.fs_time = sblock.fs_old_time; 379 sblock.fs_size = sblock.fs_old_size; 380 sblock.fs_dsize = sblock.fs_old_dsize; 381 sblock.fs_csaddr = sblock.fs_old_csaddr; 382 sblock.fs_cstotal.cs_ndir = sblock.fs_old_cstotal.cs_ndir; 383 sblock.fs_cstotal.cs_nbfree = sblock.fs_old_cstotal.cs_nbfree; 384 sblock.fs_cstotal.cs_nifree = sblock.fs_old_cstotal.cs_nifree; 385 sblock.fs_cstotal.cs_nffree = sblock.fs_old_cstotal.cs_nffree; 386 } |
|
358 havesb = 1; 359 return (1); 360} 361 362static void 363badsb(int listerr, char *s) 364{ 365 --- 9 unchanged lines hidden (view full) --- 375{ 376 struct disklabel *lp; 377 378 fswritefd = -1; 379 fsmodified = 0; 380 lfdir = 0; 381 initbarea(&sblk); 382 initbarea(&asblk); | 387 havesb = 1; 388 return (1); 389} 390 391static void 392badsb(int listerr, char *s) 393{ 394 --- 9 unchanged lines hidden (view full) --- 404{ 405 struct disklabel *lp; 406 407 fswritefd = -1; 408 fsmodified = 0; 409 lfdir = 0; 410 initbarea(&sblk); 411 initbarea(&asblk); |
383 sblk.b_un.b_buf = malloc(SBSIZE); 384 asblk.b_un.b_buf = malloc(SBSIZE); | 412 sblk.b_un.b_buf = malloc(SBLOCKSIZE); 413 asblk.b_un.b_buf = malloc(SBLOCKSIZE); |
385 if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL) 386 errx(EEXIT, "cannot allocate space for superblock"); 387 if ((lp = getdisklabel(NULL, fsreadfd))) 388 dev_bsize = secsize = lp->d_secsize; 389 else 390 dev_bsize = secsize = DEV_BSIZE; 391} 392 --- 4 unchanged lines hidden (view full) --- 397 * their needed information is available! 398 */ 399static int 400calcsb(char *dev, int devfd, struct fs *fs) 401{ 402 struct disklabel *lp; 403 struct partition *pp; 404 char *cp; | 414 if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL) 415 errx(EEXIT, "cannot allocate space for superblock"); 416 if ((lp = getdisklabel(NULL, fsreadfd))) 417 dev_bsize = secsize = lp->d_secsize; 418 else 419 dev_bsize = secsize = DEV_BSIZE; 420} 421 --- 4 unchanged lines hidden (view full) --- 426 * their needed information is available! 427 */ 428static int 429calcsb(char *dev, int devfd, struct fs *fs) 430{ 431 struct disklabel *lp; 432 struct partition *pp; 433 char *cp; |
405 int i; | 434 int i, nspf; |
406 407 cp = strchr(dev, '\0') - 1; 408 if (cp == (char *)-1 || ((*cp < 'a' || *cp > 'h') && !isdigit(*cp))) { 409 pfatal("%s: CANNOT FIGURE OUT FILE SYSTEM PARTITION\n", dev); 410 return (0); 411 } 412 lp = getdisklabel(dev, devfd); 413 if (isdigit(*cp)) --- 11 unchanged lines hidden (view full) --- 425 pfatal("%s: %s: type %s fsize %d, frag %d, cpg %d, size %d\n", 426 dev, "INCOMPLETE LABEL", fstypenames[pp->p_fstype], 427 pp->p_fsize, pp->p_frag, pp->p_cpg, pp->p_size); 428 return (0); 429 } 430 memset(fs, 0, sizeof(struct fs)); 431 fs->fs_fsize = pp->p_fsize; 432 fs->fs_frag = pp->p_frag; | 435 436 cp = strchr(dev, '\0') - 1; 437 if (cp == (char *)-1 || ((*cp < 'a' || *cp > 'h') && !isdigit(*cp))) { 438 pfatal("%s: CANNOT FIGURE OUT FILE SYSTEM PARTITION\n", dev); 439 return (0); 440 } 441 lp = getdisklabel(dev, devfd); 442 if (isdigit(*cp)) --- 11 unchanged lines hidden (view full) --- 454 pfatal("%s: %s: type %s fsize %d, frag %d, cpg %d, size %d\n", 455 dev, "INCOMPLETE LABEL", fstypenames[pp->p_fstype], 456 pp->p_fsize, pp->p_frag, pp->p_cpg, pp->p_size); 457 return (0); 458 } 459 memset(fs, 0, sizeof(struct fs)); 460 fs->fs_fsize = pp->p_fsize; 461 fs->fs_frag = pp->p_frag; |
433 fs->fs_cpg = pp->p_cpg; | |
434 fs->fs_size = pp->p_size; | 462 fs->fs_size = pp->p_size; |
435 fs->fs_ntrak = lp->d_ntracks; 436 fs->fs_nsect = lp->d_nsectors; 437 fs->fs_spc = lp->d_secpercyl; 438 fs->fs_nspf = fs->fs_fsize / lp->d_secsize; 439 fs->fs_cgmask = 0xffffffff; 440 for (i = fs->fs_ntrak; i > 1; i >>= 1) 441 fs->fs_cgmask <<= 1; 442 if (!POWEROF2(fs->fs_ntrak)) 443 fs->fs_cgmask <<= 1; 444 fs->fs_cgoffset = roundup( 445 howmany(fs->fs_nsect, NSPF(fs)), fs->fs_frag); 446 fs->fs_fpg = (fs->fs_cpg * fs->fs_spc) / NSPF(fs); 447 fs->fs_ncg = howmany(fs->fs_size / fs->fs_spc, fs->fs_cpg); 448 for (fs->fs_fsbtodb = 0, i = NSPF(fs); i > 1; i >>= 1) | 463 fs->fs_sblkno = roundup( 464 howmany(lp->d_bbsize + lp->d_sbsize, fs->fs_fsize), 465 fs->fs_frag); 466 nspf = fs->fs_fsize / lp->d_secsize; 467 for (fs->fs_fsbtodb = 0, i = nspf; i > 1; i >>= 1) |
449 fs->fs_fsbtodb++; 450 dev_bsize = lp->d_secsize; | 468 fs->fs_fsbtodb++; 469 dev_bsize = lp->d_secsize; |
470 if (fs->fs_magic == FS_UFS2_MAGIC) { 471 fs->fs_fpg = pp->p_cpg; 472 fs->fs_ncg = howmany(fs->fs_size, fs->fs_fpg); 473 } else /* if (fs->fs_magic == FS_UFS1_MAGIC) */ { 474 fs->fs_old_cpg = pp->p_cpg; 475 fs->fs_old_cgmask = 0xffffffff; 476 for (i = lp->d_ntracks; i > 1; i >>= 1) 477 fs->fs_old_cgmask <<= 1; 478 if (!POWEROF2(lp->d_ntracks)) 479 fs->fs_old_cgmask <<= 1; 480 fs->fs_old_cgoffset = roundup(howmany(lp->d_nsectors, nspf), 481 fs->fs_frag); 482 fs->fs_fpg = (fs->fs_old_cpg * lp->d_secpercyl) / nspf; 483 fs->fs_ncg = howmany(fs->fs_size / lp->d_secpercyl, 484 fs->fs_old_cpg); 485 } |
|
451 return (1); 452} 453 454static struct disklabel * 455getdisklabel(char *s, int fd) 456{ 457 static struct disklabel lab; 458 459 if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) { 460 if (s == NULL) 461 return ((struct disklabel *)NULL); 462 pwarn("ioctl (GCINFO): %s\n", strerror(errno)); 463 errx(EEXIT, "%s: can't read disk label", s); 464 } 465 return (&lab); 466} | 486 return (1); 487} 488 489static struct disklabel * 490getdisklabel(char *s, int fd) 491{ 492 static struct disklabel lab; 493 494 if (ioctl(fd, DIOCGDINFO, (char *)&lab) < 0) { 495 if (s == NULL) 496 return ((struct disklabel *)NULL); 497 pwarn("ioctl (GCINFO): %s\n", strerror(errno)); 498 errx(EEXIT, "%s: can't read disk label", s); 499 } 500 return (&lab); 501} |