Xinu7/src/sys/sys/ibnew.c

/* ibnew.c - ibnew */

#include <conf.h>
#include <kernel.h>
#include <io.h>
#include <disk.h>
#include <lfile.h>
#include <dir.h>

/*------------------------------------------------------------------------
 *  ibnew  --  allocate a new iblock from free list on disk
 *------------------------------------------------------------------------
 */
ibnew(diskdev, writedir)
int	diskdev;
Bool	writedir;
{
	struct	dir	*dirptr;
	struct	iblk	iblock;
	IBADDR	inum;
	int	i;
	int	sem;

	sem =  ((struct dsblk *)devtab[diskdev].dvioblk)->dflsem;
	dirptr = dsdirec(diskdev);
	wait(sem);
	inum = dirptr->d_filst;
	ibget(diskdev, inum, &iblock);
	dirptr->d_filst = iblock.ib_next;
	if (writedir)
		write(diskdev, dskbcpy(dirptr), DIRBLK);
	signal(sem);
	ibclear(&iblock, 0L);
	ibput(diskdev, inum, &iblock);
	return(inum);
}