Xinu7/src/sys/sys/ibfree.c
/* ibfree.c - ibfree */
#include <conf.h>
#include <kernel.h>
#include <io.h>
#include <disk.h>
#include <lfile.h>
#include <dir.h>
/*------------------------------------------------------------------------
* ibfree.c -- deallocate an iblock and return to the free list
*------------------------------------------------------------------------
*/
ibfree(diskdev, inum)
int diskdev;
IBADDR inum;
{
struct dir *dirptr;
struct iblk *ibptr;
char *buff;
DBADDR dba;
int i, sem;
dirptr = dsdirec(diskdev);
buff = getbuf(dskdbp);
dba = ibtodb(inum);
read(diskdev, buff, dba);
ibptr = (struct iblk *)(buff + ibdisp(inum));
for (i=0 ; i<IBLEN ; i++)
if ( (dba=ibptr->ib_dba[i]) != DBNULL)
lfsdfree(diskdev, dba);
sem = ( (struct dsblk *)devtab[diskdev].dvioblk )->dflsem;
wait(sem);
ibptr->ib_next = dirptr->d_filst;
dirptr->d_filst = inum;
write(diskdev, buff, dba);
write(diskdev, dskbcpy(dirptr), DIRBLK);
signal(sem);
return(OK);
}