* 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.10 (Berkeley) %G%";
register struct inodesc
*idesc
;
long ret
, n
, ndb
, offset
;
idesc
->id_fix
= DONTKNOW
;
idesc
->id_filesize
= dp
->di_size
;
if ((dp
->di_mode
& IFMT
) == IFBLK
|| (dp
->di_mode
& IFMT
) == IFCHR
)
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
;
register struct bufarea
*bp
;
extern int dirscan(), pass1check();
if (idesc
->id_type
== ADDR
) {
if (((n
= (*func
)(idesc
)) & KEEPON
) == 0)
if (chkrange(idesc
->id_blkno
, idesc
->id_numfrags
))
bp
= getdatablk(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
= &bp
->b_un
.b_indir
[NINDIR(&sblock
)];
for (ap
= &bp
->b_un
.b_indir
[nif
]; ap
< aplim
; ap
++) {
(void)sprintf(buf
, "PARTIALLY TRUNCATED INODE I=%d",
aplim
= &bp
->b_un
.b_indir
[nif
];
for (ap
= bp
->b_un
.b_indir
, i
= 1; ap
< aplim
; ap
++, i
++) {
n
= iblock(idesc
, ilevel
, isize
- i
* sizepb
);
* Check that a block in a legal block number.
* Return 0 if in range, 1 if out of range.
if ((unsigned)(blk
+ cnt
) > maxfsblock
)
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;
if (inumber
< ROOTINO
|| inumber
> maxino
)
errexit("bad inode number %d to ginode\n", inumber
);
inumber
< startinum
|| inumber
>= startinum
+ INOPB(&sblock
)) {
iblk
= itod(&sblock
, inumber
);
pbp
->b_flags
&= ~B_INUSE
;
pbp
= getdatablk(iblk
, sblock
.fs_bsize
);
startinum
= (inumber
/ INOPB(&sblock
)) * INOPB(&sblock
);
return (&pbp
->b_un
.b_dinode
[inumber
% INOPB(&sblock
)]);
register struct inodesc
*idesc
;
register struct dinode
*dp
;
dp
= ginode(idesc
->id_number
);
(dp
->di_mode
& IFMT
) == IFDIR
? "DIR" : "FILE");
pinode(idesc
->id_number
);
if (preen
|| reply("CLEAR") == 1) {
(void)ckinode(dp
, idesc
);
statemap
[idesc
->id_number
] = USTATE
;
register struct direct
*dirp
= idesc
->id_dirp
;
if (dirp
->d_ino
!= idesc
->id_parent
)
bcopy(dirp
->d_name
, idesc
->id_name
, (int)dirp
->d_namlen
+ 1);
register struct direct
*dirp
= idesc
->id_dirp
;
if (strcmp(dirp
->d_name
, idesc
->id_name
) == 0 &&
dirp
->d_ino
>= ROOTINO
&& dirp
->d_ino
<= maxino
) {
idesc
->id_parent
= dirp
->d_ino
;
register struct dinode
*dp
;
if (ino
< ROOTINO
|| ino
> maxino
)
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
, type
, ino
);
errexit("BAD STATE %d TO BLKERR", statemap
[ino
]);
* allocate an unused inode
register struct dinode
*dp
;
else if (statemap
[request
] != USTATE
)
for (ino
= request
; ino
< maxino
; ino
++)
if (statemap
[ino
] == USTATE
)
dp
->di_db
[0] = allocblk((long)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
);