af01bda509
The "bdev" library provides basic primitives for file systems to talk to block device drivers, hiding the details of the underlying protocol and interaction model. This version of libbdev is rather basic. It is planned to support the following features in the long run: - asynchronous requests and replies; - recovery support for underlying block drivers; - retrying of failed I/O requests. The commit also changes our block-based file systems (mfs, ext2, isofs) to make use of libbdev.
70 lines
1.8 KiB
C
70 lines
1.8 KiB
C
#include "fs.h"
|
|
#include <assert.h>
|
|
#include <minix/vfsif.h>
|
|
#include <minix/bdev.h>
|
|
#include "inode.h"
|
|
|
|
|
|
/*===========================================================================*
|
|
* fs_sync *
|
|
*===========================================================================*/
|
|
PUBLIC int fs_sync()
|
|
{
|
|
/* Perform the sync() system call. Flush all the tables.
|
|
* The order in which the various tables are flushed is critical. The
|
|
* blocks must be flushed last, since rw_inode() leaves its results in
|
|
* the block cache.
|
|
*/
|
|
struct inode *rip;
|
|
struct buf *bp;
|
|
|
|
assert(nr_bufs > 0);
|
|
assert(buf);
|
|
|
|
/* Write all the dirty inodes to the disk. */
|
|
for(rip = &inode[0]; rip < &inode[NR_INODES]; rip++)
|
|
if(rip->i_count > 0 && rip->i_dirt == DIRTY) rw_inode(rip, WRITING);
|
|
|
|
/* Write all the dirty blocks to the disk, one drive at a time. */
|
|
for(bp = &buf[0]; bp < &buf[nr_bufs]; bp++)
|
|
if(bp->b_dev != NO_DEV && bp->b_dirt == DIRTY)
|
|
flushall(bp->b_dev);
|
|
|
|
return(OK); /* sync() can't fail */
|
|
}
|
|
|
|
|
|
/*===========================================================================*
|
|
* fs_flush *
|
|
*===========================================================================*/
|
|
PUBLIC int fs_flush()
|
|
{
|
|
/* Flush the blocks of a device from the cache after writing any dirty blocks
|
|
* to disk.
|
|
*/
|
|
dev_t dev = (dev_t) fs_m_in.REQ_DEV;
|
|
if(dev == fs_dev) return(EBUSY);
|
|
|
|
flushall(dev);
|
|
invalidate(dev);
|
|
|
|
return(OK);
|
|
}
|
|
|
|
|
|
/*===========================================================================*
|
|
* fs_new_driver *
|
|
*===========================================================================*/
|
|
PUBLIC int fs_new_driver(void)
|
|
{
|
|
/* Set a new driver endpoint for this device. */
|
|
dev_t dev;
|
|
endpoint_t endpt;
|
|
|
|
dev = (dev_t) fs_m_in.REQ_DEV;
|
|
endpt = (endpoint_t) fs_m_in.REQ_DRIVER_E;
|
|
|
|
bdev_driver(dev, endpt);
|
|
|
|
return(OK);
|
|
}
|