* Copyright (c) 1980, 1988 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)dumptraverse.c 5.5 (Berkeley) 5/20/88";
maxino
= sblock
->fs_ipg
* sblock
->fs_ncg
- 1;
for (ino
= 0; ino
< maxino
; ) {
if ((ip
->di_mtime
>= spcl
.c_ddate
|| ip
->di_ctime
>= spcl
.c_ddate
) &&
if (f
!= IFREG
&& f
!= IFDIR
&& f
!= IFLNK
) {
register struct dinode
*ip
;
for (i
= 0; i
< NDADDR
; i
++) {
dsrch(ip
->di_db
[i
], dblksize(sblock
, ip
, i
), filesize
);
filesize
-= sblock
->fs_bsize
;
for (i
= 0; i
< NIADDR
; i
++) {
indir(ip
->di_ib
[i
], i
, &filesize
);
daddr_t idblk
[MAXNINDIR
];
bread(fsbtodb(sblock
, d
), (char *)idblk
, sblock
->fs_bsize
);
for(i
=0; i
< NINDIR(sblock
); i
++) {
dsrch(d
, sblock
->fs_bsize
, *filesize
);
*filesize
-= sblock
->fs_bsize
;
for(i
=0; i
< NINDIR(sblock
); i
++) {
/* watchout for dir inodes deleted and maybe reallocated */
if ((ip
->di_mode
& IFMT
) != IFDIR
)
if (i
== 0) /* free inode */
if ((i
!= IFDIR
&& i
!= IFREG
&& i
!= IFLNK
) || ip
->di_size
== 0) {
if (ip
->di_size
> NDADDR
* sblock
->fs_bsize
)
i
= NDADDR
* sblock
->fs_frag
;
i
= howmany(ip
->di_size
, sblock
->fs_fsize
);
blksout(&ip
->di_db
[0], i
);
size
= ip
->di_size
- NDADDR
* sblock
->fs_bsize
;
for (i
= 0; i
< NIADDR
; i
++) {
dmpindir(ip
->di_ib
[i
], i
, &size
);
daddr_t idblk
[MAXNINDIR
];
bread(fsbtodb(sblock
, blk
), (char *)idblk
, sblock
->fs_bsize
);
bzero(idblk
, sblock
->fs_bsize
);
if (*size
< NINDIR(sblock
) * sblock
->fs_bsize
)
cnt
= howmany(*size
, sblock
->fs_fsize
);
cnt
= NINDIR(sblock
) * sblock
->fs_frag
;
*size
-= NINDIR(sblock
) * sblock
->fs_bsize
;
for (i
= 0; i
< NINDIR(sblock
); i
++) {
dmpindir(idblk
[i
], lvl
, size
);
int i
, j
, count
, blks
, tbperdb
;
blks
= howmany(frags
* sblock
->fs_fsize
, TP_BSIZE
);
tbperdb
= sblock
->fs_bsize
/ TP_BSIZE
;
for (i
= 0; i
< blks
; i
+= TP_NINDIR
) {
if (i
+ TP_NINDIR
> blks
)
for (j
= i
; j
< count
; j
++)
if (blkp
[j
/ tbperdb
] != 0)
spcl
.c_count
= count
- i
;
for (j
= i
; j
< count
; j
+= tbperdb
)
if (blkp
[j
/ tbperdb
] != 0)
if (j
+ tbperdb
<= count
)
dmpblk(blkp
[j
/ tbperdb
],
dmpblk(blkp
[j
/ tbperdb
],
spcl
.c_count
= howmany(msiz
* sizeof(map
[0]), TP_BSIZE
);
for (i
= 0, cp
= map
; i
< spcl
.c_count
; i
++, cp
+= TP_BSIZE
)
spcl
.c_magic
= NFS_MAGIC
;
i
= sizeof(union u_spcl
) / (4*sizeof(int));
spcl
.c_checksum
= CHECKSUM
- s
;
register struct direct
*dp
;
bread(fsbtodb(sblock
, d
), dblk
, filesize
);
for (loc
= 0; loc
< filesize
; ) {
dp
= (struct direct
*)(dblk
+ loc
);
msg("corrupted directory, inumber %d\n", ino
);
if(dp
->d_name
[0] == '.') {
if(dp
->d_name
[1] == '\0')
if(dp
->d_name
[1] == '.' && dp
->d_name
[2] == '\0')
if(BIT(dp
->d_ino
, nodmap
)) {
if(BIT(dp
->d_ino
, dirmap
))
static daddr_t minino
, maxino
;
static struct dinode itab
[MAXINOPB
];
if (ino
>= minino
&& ino
< maxino
) {
return (&itab
[ino
- minino
]);
bread(fsbtodb(sblock
, itod(sblock
, ino
)), itab
, sblock
->fs_bsize
);
minino
= ino
- (ino
% INOPB(sblock
));
maxino
= minino
+ INOPB(sblock
);
return (&itab
[ino
- minino
]);
if (lseek(fi
, (long)(da
* dev_bsize
), 0) < 0){
msg("bread: lseek fails\n");
if (da
+ (cnt
/ dev_bsize
) > fsbtodb(sblock
, sblock
->fs_size
)) {
* Trying to read the final fragment.
* NB - dump only works in TP_BSIZE blocks, hence
* rounds `dev_bsize' fragments up to TP_BSIZE pieces.
* It should be smarter about not actually trying to
* read more than it can get, but for the time being
* we punt and scale back the read only when it gets
* us into trouble. (mkm 9/25/83)
msg("read error from %s [block %d]: count=%d, got=%d, errno=%d\n",
disk
, da
, cnt
, n
, errno
);
if (++breaderrors
> BREADEMAX
){
msg("More than %d block read errors from %d\n",
broadcast("DUMP IS AILING!\n");
msg("This is an unrecoverable error.\n");
if (!query("Do you want to attempt to continue?")){
* Zero buffer, then try to read each sector of buffer separately.
for (i
= 0; i
< cnt
; i
+= dev_bsize
, ba
+= dev_bsize
, da
++) {
if (lseek(fi
, (long)(da
* dev_bsize
), 0) < 0)
msg("bread: lseek2 fails!\n");
n
= read(fi
, ba
, dev_bsize
);
msg(" read error from %s [sector %d, errno %d]\n",