|
|
Xinu for VAX
/* iblfree.c - iblfree */
#include <conf.h>
#include <kernel.h>
#include <io.h>
#include <disk.h>
#include <lfile.h>
#include <dir.h>
/*------------------------------------------------------------------------
* iblfree -- free a list of iblocks given the number of the first
*------------------------------------------------------------------------
*/
iblfree(diskdev, iblist)
int diskdev;
IBADDR iblist;
{
IBADDR ilast;
struct iblk iblock;
struct dir *dirptr;
int sem;
DBADDR dba;
int j;
if (iblist == IBNULL)
return(OK);
dirptr = dsdirec(diskdev);
ibget(diskdev, iblist, &iblock);
for (ilast=iblist ; iblock.ib_next!=IBNULL ;) {
for (j=0 ; j<IBLEN ; j++)
if ( (dba=iblock.ib_dba[j]) != DBNULL)
lfsdfree(diskdev, dba);
ilast = iblock.ib_next;
ibget(diskdev, ilast, &iblock);
}
for (j=0 ; j<IBLEN ; j++)
if ( (dba=iblock.ib_dba[j]) != DBNULL)
lfsdfree(diskdev, dba);
sem = ( (struct dsblk *)devtab[diskdev].dvioblk)->dflsem;
wait(sem);
iblock.ib_next = dirptr->d_filst;
dirptr->d_filst = iblist;
ibput(diskdev, ilast, &iblock);
write(diskdev, dskbcpy(dirptr), DIRBLK);
signal(sem);
return(OK);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.