www.pudn.com > COS0.0.1.rar > blockio.c


/*
 blockio.c - generic block device i/o
  
 Author:        Paul Barker
 Part of:       COS
 Created:       29/10/04
 Last Modified: 29/10/04

 Copyright (C) 2004 Paul Barker
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

                     (See file "Copying")
*/

#include 

#include 
#include 

block_device_t* block_getdev(block_request_t* rq)
{
	// for now, only support selection by pointer
	assert(rq->selector_type == BSELECT_BY_PTR);
	
	return rq->selector.ptr;
}

void block_dump_rq(block_request_t* rq)
{
	TRACE(("Dumping block request at 0x%x\n", rq));
	
	TRACE(("selector: type=0x%x, value=0x%x\n", rq->selector_type,
		rq->selector.value));
	
	TRACE(("mode=0x%x\n", rq->mode));
	
	TRACE(("Finished\n"));
}

void block_dump_dev(block_device_t* d)
{
	TRACE(("Dumping block device at 0x%x\n", d));
	
	TRACE(("default_mode=0x%x, fn at 0x%x\n", d->default_mode, d->fn));
	
	TRACE(("Finished\n"));
}

fresult_t block_dispatch(block_request_t* rq, block_device_t* d)
{
	// just dispatch, assume everything is fine
	
	return (*(d->fn))(rq, d);	// TODO: re-do this with more thought
}

fresult_t block_addrq(block_request_t* rq)
{
	assert_ptr(rq);
	
	block_device_t* dev = block_getdev(rq);
	
	assert_ptr(dev);
	
	// dont support overrides yet
	assert(rq->mode == BMODE_DEFAULT);
	
	// only support immediate mode
	assert(dev->default_mode == BMODE_IMMEDIATE);
	
	TRACE(("Adding block request:\n"));
	block_dump_rq(rq);
	block_dump_dev(dev);
	
	return block_dispatch(rq, dev);
}

/*
 TODO:	Write TODO list!
*/