Xinu7/src/sys/sys/lfsetup.c

/* lfsetup.c - lfsetup */

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

/*------------------------------------------------------------------------
 *  lfsetup  --  set up appropriate iblock and data block in memory
 *------------------------------------------------------------------------
 */
lfsetup(diskdev, flptr)
int	diskdev;
struct	flblk	*flptr;
{
	struct	iblk	*ibptr;
	int	displ;
	long	ibrange;
	DBADDR	dba;

	ibrange = (long) (IBLEN * DBUFSIZ);
	ibptr = &flptr->fl_iblk;
	if (flptr->fl_pos < ibptr->ib_byte) {
		flptr->fl_iba = (flptr->fl_dent)->fdiba;
		ibget(diskdev, flptr->fl_iba, ibptr);
	}
	while (ibptr->ib_byte+ibrange <= flptr->fl_pos) {
		if (ibptr->ib_next == IBNULL) {
			ibptr->ib_next = ibnew(diskdev, IBWDIR);
			ibput(diskdev, flptr->fl_iba, ibptr);
			flptr->fl_iba = ibptr->ib_next;
			ibclear(ibptr, (long)ibptr->ib_byte+ibrange);
			ibput(diskdev, flptr->fl_iba, ibptr);
		} else {
			flptr->fl_iba = ibptr->ib_next;
			ibget(diskdev, flptr->fl_iba, ibptr);
		}
	}
	displ = (int) (flptr->fl_pos - ibptr->ib_byte);
	for (flptr->fl_ipnum=0 ; displ>=DBUFSIZ ; displ-=DBUFSIZ)
		flptr->fl_ipnum++;
	flptr->fl_bptr = flptr->fl_buff + displ;
	if ( (dba=ibptr->ib_dba[flptr->fl_ipnum]) == DBNULL) {
		ibptr->ib_dba[flptr->fl_ipnum] = lfsnewd(diskdev,flptr);
		ibput(diskdev, flptr->fl_iba, ibptr);
	} else
		read(diskdev, flptr->fl_buff, dba);
	flptr->fl_dch = FALSE;
}