* Copyright (c) 1980 Regents of the University of California.
* All rights reserved. The Berkeley software License Agreement
* specifies the terms and conditions for redistribution.
static char sccsid
[] = "@(#)inode.c 5.3 (Berkeley) %G%";
register struct inodesc
*idesc
;
idesc
->id_fix
= DONTKNOW
;
idesc
->id_filesize
= dp
->di_size
;
ndb
= howmany(dino
.di_size
, sblock
.fs_bsize
);
for (ap
= &dino
.di_db
[0]; ap
< &dino
.di_db
[NDADDR
]; ap
++) {
if (--ndb
== 0 && (offset
= blkoff(&sblock
, dino
.di_size
)) != 0)
numfrags(&sblock
, fragroundup(&sblock
, offset
));
idesc
->id_numfrags
= sblock
.fs_frag
;
if (idesc
->id_type
== ADDR
)
ret
= (*idesc
->id_func
)(idesc
);
idesc
->id_numfrags
= sblock
.fs_frag
;
for (ap
= &dino
.di_ib
[0], n
= 1; n
<= NIADDR
; ap
++, n
++) {
dino
.di_size
- sblock
.fs_bsize
* NDADDR
);
iblock(idesc
, ilevel
, isize
)
int i
, n
, (*func
)(), nif
, sizepb
;
if (idesc
->id_type
== ADDR
) {
if (((n
= (*func
)(idesc
)) & KEEPON
) == 0)
if (outrange(idesc
->id_blkno
, idesc
->id_numfrags
)) /* protect thyself */
getblk(&ib
, idesc
->id_blkno
, sblock
.fs_bsize
);
for (sizepb
= sblock
.fs_bsize
, i
= 0; i
< ilevel
; i
++)
sizepb
*= NINDIR(&sblock
);
nif
= isize
/ sizepb
+ 1;
if (nif
> NINDIR(&sblock
))
if (idesc
->id_func
== pass1check
&& nif
< NINDIR(&sblock
)) {
aplim
= &ib
.b_un
.b_indir
[NINDIR(&sblock
)];
for (ap
= &ib
.b_un
.b_indir
[nif
]; ap
< aplim
; ap
++) {
sprintf(buf
, "PARTIALLY TRUNCATED INODE I=%d",
aplim
= &ib
.b_un
.b_indir
[nif
];
for (ap
= ib
.b_un
.b_indir
, i
= 1; ap
< aplim
; ap
++, i
++)
n
= iblock(idesc
, ilevel
, isize
- i
* sizepb
);
if ((unsigned)(blk
+cnt
) > fmax
)
if (blk
< cgdmin(&sblock
, c
)) {
if ((blk
+cnt
) > cgsblock(&sblock
, c
)) {
printf("blk %d < cgdmin %d;",
blk
, cgdmin(&sblock
, c
));
printf(" blk+cnt %d > cgsbase %d\n",
blk
+cnt
, cgsblock(&sblock
, c
));
if ((blk
+cnt
) > cgbase(&sblock
, c
+1)) {
printf("blk %d >= cgdmin %d;",
blk
, cgdmin(&sblock
, c
));
printf(" blk+cnt %d > sblock.fs_fpg %d\n",
static ino_t startinum
= 0; /* blk num of first in raw area */
if (inumber
< ROOTINO
|| inumber
> imax
)
errexit("bad inode number %d to ginode\n", inumber
);
inumber
< startinum
|| inumber
>= startinum
+ INOPB(&sblock
)) {
iblk
= itod(&sblock
, inumber
);
getblk(&inoblk
, iblk
, sblock
.fs_bsize
);
startinum
= (inumber
/ INOPB(&sblock
)) * INOPB(&sblock
);
return (&inoblk
.b_un
.b_dinode
[inumber
% INOPB(&sblock
)]);
register struct inodesc
*idesc
;
dp
= ginode(idesc
->id_number
);
pwarn("%s %s", s
, DIRCT(dp
) ? "DIR" : "FILE");
pinode(idesc
->id_number
);
if (preen
|| reply("CLEAR") == 1) {
(void)ckinode(dp
, idesc
);
statemap
[idesc
->id_number
] = USTATE
;
register DIRECT
*dirp
= idesc
->id_dirp
;
if (dirp
->d_ino
!= idesc
->id_parent
)
bcopy(dirp
->d_name
, idesc
->id_name
, dirp
->d_namlen
+ 1);
register DIRECT
*dirp
= idesc
->id_dirp
;
if (strcmp(dirp
->d_name
, idesc
->id_name
) == 0 &&
dirp
->d_ino
>= ROOTINO
&& dirp
->d_ino
<= imax
) {
idesc
->id_parent
= dirp
->d_ino
;
if (ino
< ROOTINO
|| ino
> imax
)
if ((pw
= getpwuid((int)dp
->di_uid
)) != 0)
printf("%s ", pw
->pw_name
);
printf("%d ", dp
->di_uid
);
printf("MODE=%o\n", dp
->di_mode
);
printf("SIZE=%ld ", dp
->di_size
);
p
= ctime(&dp
->di_mtime
);
printf("MTIME=%12.12s %4.4s ", p
+4, p
+20);
pfatal("%ld %s I=%u", blk
, s
, ino
);
errexit("BAD STATE %d TO BLKERR", statemap
[ino
]);
* allocate an unused inode
else if (statemap
[request
] != USTATE
)
for (ino
= request
; ino
< imax
; ino
++)
if (statemap
[ino
] == USTATE
)
dp
->di_db
[0] = allocblk(1);
dp
->di_mtime
= dp
->di_ctime
= dp
->di_atime
;
dp
->di_size
= sblock
.fs_fsize
;
dp
->di_blocks
= btodb(sblock
.fs_fsize
);
bzero((char *)&idesc
, sizeof(struct inodesc
));
idesc
.id_func
= pass4check
;
(void)ckinode(dp
, &idesc
);