version 1.5, 1997/09/16 08:37:04 |
version 1.6, 1997/10/09 13:19:40 |
Line 63 __RCSID("$NetBSD$"); |
|
Line 63 __RCSID("$NetBSD$"); |
|
#include "extern.h" |
#include "extern.h" |
#include "fsutil.h" |
#include "fsutil.h" |
|
|
struct bufarea asblk; |
|
#define altsblock (*asblk.b_un.b_fs) |
|
#define POWEROF2(num) (((num) & ((num) - 1)) == 0) |
#define POWEROF2(num) (((num) & ((num) - 1)) == 0) |
|
|
void badsb __P((int, char *)); |
void badsb __P((int, char *)); |
|
|
lfdir = 0; |
lfdir = 0; |
initbarea(&sblk); |
initbarea(&sblk); |
initbarea(&asblk); |
initbarea(&asblk); |
sblk.b_un.b_buf = malloc(sizeof(struct m_ext2fs)); |
sblk.b_un.b_buf = malloc(SBSIZE); |
asblk.b_un.b_buf = malloc(sizeof(struct m_ext2fs)); |
asblk.b_un.b_buf = malloc(SBSIZE); |
if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL) |
if (sblk.b_un.b_buf == NULL || asblk.b_un.b_buf == NULL) |
errexit("cannot allocate space for superblock\n"); |
errexit("cannot allocate space for superblock\n"); |
if ((lp = getdisklabel((char *)NULL, fsreadfd)) != NULL) |
if ((lp = getdisklabel((char *)NULL, fsreadfd)) != NULL) |
|
|
if (reply("SET TO DEFAULT") == 1) { |
if (reply("SET TO DEFAULT") == 1) { |
sblock.e2fs.e2fs_rbcount = sblock.e2fs.e2fs_bcount * 0.1; |
sblock.e2fs.e2fs_rbcount = sblock.e2fs.e2fs_bcount * 0.1; |
sbdirty(); |
sbdirty(); |
|
dirty(&asblk); |
} |
} |
} |
} |
if (sblock.e2fs.e2fs_bpg != sblock.e2fs.e2fs_fpg) { |
if (sblock.e2fs.e2fs_bpg != sblock.e2fs.e2fs_fpg) { |
|
|
return 0; |
return 0; |
} |
} |
if (asblk.b_dirty && !bflag) { |
if (asblk.b_dirty && !bflag) { |
memcpy(&altsblock, &sblock, (size_t)SBSIZE); |
copyback_sb(&asblk); |
flush(fswritefd, &asblk); |
flush(fswritefd, &asblk); |
} |
} |
/* |
/* |
|
|
goto badsblabel; |
goto badsblabel; |
} |
} |
for (numdirs = 0, cg = 0; cg < sblock.e2fs_ncg; cg++) { |
for (numdirs = 0, cg = 0; cg < sblock.e2fs_ncg; cg++) { |
numdirs += sblock.e2fs_gd[cg].ext2bgd_ndirs; |
numdirs += fs2h16(sblock.e2fs_gd[cg].ext2bgd_ndirs); |
} |
} |
inplast = 0; |
inplast = 0; |
listmax = numdirs + 10; |
listmax = numdirs + 10; |
|
|
} |
} |
|
|
/* |
/* |
* Read in the super block and its summary info. |
* Read in the super block and its summary info, convert to host byte order. |
*/ |
*/ |
static int |
static int |
readsb(listerr) |
readsb(listerr) |
|
|
{ |
{ |
daddr_t super = bflag ? bflag : SBOFF / dev_bsize; |
daddr_t super = bflag ? bflag : SBOFF / dev_bsize; |
|
|
if (bread(fsreadfd, (char *)&sblock.e2fs, super, (long)SBSIZE) != 0) |
if (bread(fsreadfd, (char *)sblk.b_un.b_fs, super, (long)SBSIZE) != 0) |
return (0); |
return (0); |
sblk.b_bno = super; |
sblk.b_bno = super; |
sblk.b_size = SBSIZE; |
sblk.b_size = SBSIZE; |
|
|
|
/* Copy the superblock in memory */ |
|
sblock.e2fs.e2fs_icount = fs2h32(sblk.b_un.b_fs->e2fs_icount); |
|
sblock.e2fs.e2fs_bcount = fs2h32(sblk.b_un.b_fs->e2fs_bcount); |
|
sblock.e2fs.e2fs_rbcount = fs2h32(sblk.b_un.b_fs->e2fs_rbcount); |
|
sblock.e2fs.e2fs_fbcount = fs2h32(sblk.b_un.b_fs->e2fs_fbcount); |
|
sblock.e2fs.e2fs_ficount = fs2h32(sblk.b_un.b_fs->e2fs_ficount); |
|
sblock.e2fs.e2fs_first_dblock = fs2h32(sblk.b_un.b_fs->e2fs_first_dblock); |
|
sblock.e2fs.e2fs_log_bsize = fs2h32(sblk.b_un.b_fs->e2fs_log_bsize); |
|
sblock.e2fs.e2fs_fsize = fs2h32(sblk.b_un.b_fs->e2fs_fsize); |
|
sblock.e2fs.e2fs_bpg = fs2h32(sblk.b_un.b_fs->e2fs_bpg); |
|
sblock.e2fs.e2fs_fpg = fs2h32(sblk.b_un.b_fs->e2fs_fpg); |
|
sblock.e2fs.e2fs_ipg = fs2h32(sblk.b_un.b_fs->e2fs_ipg); |
|
sblock.e2fs.e2fs_mtime = fs2h32(sblk.b_un.b_fs->e2fs_mtime); |
|
sblock.e2fs.e2fs_wtime = fs2h32(sblk.b_un.b_fs->e2fs_wtime); |
|
sblock.e2fs.e2fs_lastfsck = fs2h32(sblk.b_un.b_fs->e2fs_lastfsck); |
|
sblock.e2fs.e2fs_fsckintv = fs2h32(sblk.b_un.b_fs->e2fs_fsckintv); |
|
sblock.e2fs.e2fs_creator = fs2h32(sblk.b_un.b_fs->e2fs_creator); |
|
sblock.e2fs.e2fs_rev = fs2h32(sblk.b_un.b_fs->e2fs_rev); |
|
sblock.e2fs.e2fs_mnt_count = fs2h16(sblk.b_un.b_fs->e2fs_mnt_count); |
|
sblock.e2fs.e2fs_max_mnt_count = fs2h16(sblk.b_un.b_fs->e2fs_max_mnt_count); |
|
sblock.e2fs.e2fs_magic = fs2h16(sblk.b_un.b_fs->e2fs_magic); |
|
sblock.e2fs.e2fs_state = fs2h16(sblk.b_un.b_fs->e2fs_state); |
|
sblock.e2fs.e2fs_beh = fs2h16(sblk.b_un.b_fs->e2fs_beh); |
|
sblock.e2fs.e2fs_ruid = fs2h16(sblk.b_un.b_fs->e2fs_ruid); |
|
sblock.e2fs.e2fs_rgid = fs2h16(sblk.b_un.b_fs->e2fs_rgid); |
|
|
/* |
/* |
* run a few consistency checks of the super block |
* run a few consistency checks of the super block |
*/ |
*/ |
|
|
super *= dev_bsize; |
super *= dev_bsize; |
dev_bsize = sblock.e2fs_bsize / fsbtodb(&sblock, 1); |
dev_bsize = sblock.e2fs_bsize / fsbtodb(&sblock, 1); |
sblk.b_bno = super / dev_bsize; |
sblk.b_bno = super / dev_bsize; |
|
|
|
getblk(&asblk, 1 * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock, |
|
(long)SBSIZE); |
|
if (asblk.b_errs) |
|
return (0); |
if (bflag) { |
if (bflag) { |
havesb = 1; |
havesb = 1; |
return (1); |
return (1); |
|
|
* of whole super block against an alternate super block. |
* of whole super block against an alternate super block. |
* When an alternate super-block is specified this check is skipped. |
* When an alternate super-block is specified this check is skipped. |
*/ |
*/ |
getblk(&asblk, 1 * sblock.e2fs.e2fs_bpg + sblock.e2fs.e2fs_first_dblock, |
asblk.b_un.b_fs->e2fs_rbcount = sblk.b_un.b_fs->e2fs_rbcount; |
(long)SBSIZE); |
asblk.b_un.b_fs->e2fs_fbcount = sblk.b_un.b_fs->e2fs_fbcount; |
if (asblk.b_errs) |
asblk.b_un.b_fs->e2fs_ficount = sblk.b_un.b_fs->e2fs_ficount; |
return (0); |
asblk.b_un.b_fs->e2fs_mtime = sblk.b_un.b_fs->e2fs_mtime; |
altsblock.e2fs.e2fs_rbcount = sblock.e2fs.e2fs_rbcount; |
asblk.b_un.b_fs->e2fs_wtime = sblk.b_un.b_fs->e2fs_wtime; |
altsblock.e2fs.e2fs_fbcount = sblock.e2fs.e2fs_fbcount; |
asblk.b_un.b_fs->e2fs_mnt_count = sblk.b_un.b_fs->e2fs_mnt_count; |
altsblock.e2fs.e2fs_ficount = sblock.e2fs.e2fs_ficount; |
asblk.b_un.b_fs->e2fs_max_mnt_count = sblk.b_un.b_fs->e2fs_max_mnt_count; |
altsblock.e2fs.e2fs_mtime = sblock.e2fs.e2fs_mtime; |
asblk.b_un.b_fs->e2fs_state = sblk.b_un.b_fs->e2fs_state; |
altsblock.e2fs.e2fs_wtime = sblock.e2fs.e2fs_wtime; |
asblk.b_un.b_fs->e2fs_beh = sblk.b_un.b_fs->e2fs_beh; |
altsblock.e2fs.e2fs_mnt_count = sblock.e2fs.e2fs_mnt_count; |
asblk.b_un.b_fs->e2fs_lastfsck = sblk.b_un.b_fs->e2fs_lastfsck; |
altsblock.e2fs.e2fs_max_mnt_count = sblock.e2fs.e2fs_max_mnt_count; |
asblk.b_un.b_fs->e2fs_fsckintv = sblk.b_un.b_fs->e2fs_fsckintv; |
altsblock.e2fs.e2fs_state = sblock.e2fs.e2fs_state; |
asblk.b_un.b_fs->e2fs_ruid = sblk.b_un.b_fs->e2fs_ruid; |
altsblock.e2fs.e2fs_beh = sblock.e2fs.e2fs_beh; |
asblk.b_un.b_fs->e2fs_rgid = sblk.b_un.b_fs->e2fs_rgid; |
altsblock.e2fs.e2fs_lastfsck = sblock.e2fs.e2fs_lastfsck; |
if (memcmp(sblk.b_un.b_fs, asblk.b_un.b_fs, SBSIZE)) { |
altsblock.e2fs.e2fs_fsckintv = sblock.e2fs.e2fs_fsckintv; |
|
altsblock.e2fs.e2fs_ruid = sblock.e2fs.e2fs_ruid; |
|
altsblock.e2fs.e2fs_rgid = sblock.e2fs.e2fs_rgid; |
|
if (memcmp(&(sblock.e2fs), &(altsblock.e2fs), (int)SBSIZE)) { |
|
if (debug) { |
if (debug) { |
long *nlp, *olp, *endlp; |
u_int32_t *nlp, *olp, *endlp; |
|
|
printf("superblock mismatches\n"); |
printf("superblock mismatches\n"); |
nlp = (long *)&altsblock; |
nlp = (u_int32_t *)asblk.b_un.b_fs; |
olp = (long *)&sblock; |
olp = (u_int32_t *)sblk.b_un.b_fs; |
endlp = olp + (SBSIZE / sizeof *olp); |
endlp = olp + (SBSIZE / sizeof *olp); |
for ( ; olp < endlp; olp++, nlp++) { |
for ( ; olp < endlp; olp++, nlp++) { |
if (*olp == *nlp) |
if (*olp == *nlp) |
continue; |
continue; |
printf("offset %ld, original %ld, alternate %ld\n", |
printf("offset %ld, original %ld, alternate %ld\n", |
(long)(olp - (long *)&sblock), *olp, *nlp); |
(long)(olp - (u_int32_t *)sblk.b_un.b_fs), |
|
(long)fs2h32(*olp), |
|
(long)fs2h32(*nlp)); |
} |
} |
} |
} |
badsb(listerr, |
badsb(listerr, |
|
|
} |
} |
|
|
void |
void |
|
copyback_sb(bp) |
|
struct bufarea *bp; |
|
{ |
|
/* Copy the in-memory superblock back to buffer */ |
|
bp->b_un.b_fs->e2fs_icount = fs2h32(sblock.e2fs.e2fs_icount); |
|
bp->b_un.b_fs->e2fs_bcount = fs2h32(sblock.e2fs.e2fs_bcount); |
|
bp->b_un.b_fs->e2fs_rbcount = fs2h32(sblock.e2fs.e2fs_rbcount); |
|
bp->b_un.b_fs->e2fs_fbcount = fs2h32(sblock.e2fs.e2fs_fbcount); |
|
bp->b_un.b_fs->e2fs_ficount = fs2h32(sblock.e2fs.e2fs_ficount); |
|
bp->b_un.b_fs->e2fs_first_dblock = |
|
fs2h32(sblock.e2fs.e2fs_first_dblock); |
|
bp->b_un.b_fs->e2fs_log_bsize = fs2h32(sblock.e2fs.e2fs_log_bsize); |
|
bp->b_un.b_fs->e2fs_fsize = fs2h32(sblock.e2fs.e2fs_fsize); |
|
bp->b_un.b_fs->e2fs_bpg = fs2h32(sblock.e2fs.e2fs_bpg); |
|
bp->b_un.b_fs->e2fs_fpg = fs2h32(sblock.e2fs.e2fs_fpg); |
|
bp->b_un.b_fs->e2fs_ipg = fs2h32(sblock.e2fs.e2fs_ipg); |
|
bp->b_un.b_fs->e2fs_mtime = fs2h32(sblock.e2fs.e2fs_mtime); |
|
bp->b_un.b_fs->e2fs_wtime = fs2h32(sblock.e2fs.e2fs_wtime); |
|
bp->b_un.b_fs->e2fs_lastfsck = fs2h32(sblock.e2fs.e2fs_lastfsck); |
|
bp->b_un.b_fs->e2fs_fsckintv = fs2h32(sblock.e2fs.e2fs_fsckintv); |
|
bp->b_un.b_fs->e2fs_creator = fs2h32(sblock.e2fs.e2fs_creator); |
|
bp->b_un.b_fs->e2fs_rev = fs2h32(sblock.e2fs.e2fs_rev); |
|
bp->b_un.b_fs->e2fs_mnt_count = fs2h16(sblock.e2fs.e2fs_mnt_count); |
|
bp->b_un.b_fs->e2fs_max_mnt_count = |
|
fs2h16(sblock.e2fs.e2fs_max_mnt_count); |
|
bp->b_un.b_fs->e2fs_magic = fs2h16(sblock.e2fs.e2fs_magic); |
|
bp->b_un.b_fs->e2fs_state = fs2h16(sblock.e2fs.e2fs_state); |
|
bp->b_un.b_fs->e2fs_beh = fs2h16(sblock.e2fs.e2fs_beh); |
|
bp->b_un.b_fs->e2fs_ruid = fs2h16(sblock.e2fs.e2fs_ruid); |
|
bp->b_un.b_fs->e2fs_rgid = fs2h16(sblock.e2fs.e2fs_rgid); |
|
} |
|
|
|
void |
badsb(listerr, s) |
badsb(listerr, s) |
int listerr; |
int listerr; |
char *s; |
char *s; |
Line 396 calcsb(dev, devfd, fs) |
|
Line 458 calcsb(dev, devfd, fs) |
|
pp = &lp->d_partitions[0]; |
pp = &lp->d_partitions[0]; |
else |
else |
pp = &lp->d_partitions[*cp - 'a']; |
pp = &lp->d_partitions[*cp - 'a']; |
if (pp->p_fstype != FS_BSDFFS) { |
if (pp->p_fstype != FS_EX2FS) { |
pfatal("%s: NOT LABELED AS A BSD FILE SYSTEM (%s)\n", |
pfatal("%s: NOT LABELED AS A EXT2 FILE SYSTEM (%s)\n", |
dev, pp->p_fstype < FSMAXTYPES ? |
dev, pp->p_fstype < FSMAXTYPES ? |
fstypenames[pp->p_fstype] : "unknown"); |
fstypenames[pp->p_fstype] : "unknown"); |
return (0); |
return (0); |
} |
} |
memset(fs, 0, sizeof(struct m_ext2fs)); |
memset(fs, 0, sizeof(struct m_ext2fs)); |
fs->e2fs_bsize = 1024; /* XXX to look for altenate SP */ |
fs->e2fs_bsize = pp->p_fsize; |
fs->e2fs.e2fs_log_bsize = 0; |
fs->e2fs.e2fs_log_bsize = pp->p_fsize / 1024; |
fs->e2fs.e2fs_bcount = (pp->p_size * DEV_BSIZE) / fs->e2fs_bsize; |
fs->e2fs.e2fs_bcount = (pp->p_size * DEV_BSIZE) / fs->e2fs_bsize; |
fs->e2fs.e2fs_first_dblock = 1; |
fs->e2fs.e2fs_first_dblock = (fs->e2fs.e2fs_log_bsize == 0) ? 1 : 0; |
fs->e2fs.e2fs_bpg = fs->e2fs_bsize * NBBY; |
fs->e2fs.e2fs_bpg = fs->e2fs_bsize * NBBY; |
fs->e2fs_bshift = LOG_MINBSIZE + fs->e2fs.e2fs_log_bsize; |
fs->e2fs_bshift = LOG_MINBSIZE + fs->e2fs.e2fs_log_bsize; |
fs->e2fs_qbmask = fs->e2fs_bsize - 1; |
fs->e2fs_qbmask = fs->e2fs_bsize - 1; |
Line 418 calcsb(dev, devfd, fs) |
|
Line 480 calcsb(dev, devfd, fs) |
|
fs->e2fs_ngdb = howmany(fs->e2fs_ncg, |
fs->e2fs_ngdb = howmany(fs->e2fs_ncg, |
fs->e2fs_bsize / sizeof(struct ext2_gd)); |
fs->e2fs_bsize / sizeof(struct ext2_gd)); |
|
|
|
|
|
|
return (1); |
return (1); |
} |
} |
|
|