Xinu7/src/sys/sys/dsksync.c

/* dsksync.c - dsksync */

#include <conf.h>
#include <kernel.h>
#include <proc.h>
#include <disk.h>

/*------------------------------------------------------------------------
 *  dsksync  --  wait for all outstanding disk requests before returning
 *------------------------------------------------------------------------
 */
dsksync(devptr)
struct	devsw	*devptr;
{
	struct	dreq	*drptr, *p, *q;
	int	stat;

	if ( (q=(devptr->dvioblk)->dreqlst) == DRNULL )
		return(OK);
	drptr = (struct dreq *) getbuf(dskrbp);
	drptr->drdba = 0;
	drptr->drpid = currpid;
	drptr->drbuff = NULL;
	drptr->drop = DSYNC;
	drptr->drnext = DRNULL;

	/* place at end of request list */

	for (p=q->drnext ; p!=DRNULL ; q=p,p=p->drnext)
		;
	q->drnext = drptr;
	drptr->drstat = SYSERR;
	suspend(currpid);
	stat = drptr->drstat;
	freebuf(drptr);
	return(stat);
}