57 lines
1.1 KiB
C++
57 lines
1.1 KiB
C++
// ext2.cpp
|
|
// ext2 filesystem driver for HOS
|
|
// Author: Josh Holtrop
|
|
// Date: 05/10/05
|
|
// Modified: 05/10/05
|
|
|
|
#define _HOS_CPP_ _HOS_CPP_
|
|
|
|
extern "C" {
|
|
#include "display/kout.h"
|
|
#include "mm/vmm.h"
|
|
#include "lang/lang.h"
|
|
}
|
|
|
|
#include "ext2.h"
|
|
|
|
int ext2_init()
|
|
{
|
|
vfs_register("ext2", ext2__mount_func);
|
|
return 0;
|
|
}
|
|
|
|
FileSystem *ext2__mount_func(device_t dev)
|
|
{
|
|
ext2_super_block_t *super =
|
|
(ext2_super_block_t *) New(ext2_super_block_t);
|
|
if ( (block_read(DEV_MAJOR(dev), DEV_MINOR(dev), 2, 2, super) < 1024)
|
|
|| (super->s_magic != EXT2_MAGIC) )
|
|
{
|
|
kfree(super);
|
|
return NULL;
|
|
}
|
|
Ext2fs *fs = new Ext2fs(super, dev);
|
|
kfree(super);
|
|
return fs;
|
|
}
|
|
|
|
Ext2fs::Ext2fs(ext2_super_block_t *super, device_t dev)
|
|
{
|
|
myDevice = dev;
|
|
memcpy(&mySuper, super, sizeof(ext2_super_block_t));
|
|
mySuperDirty = 0;
|
|
kprintf("Blocks: %d (%d free), Inodes: %d (%d free) Creator OS:\n",
|
|
mySuper.s_blocks_count,
|
|
mySuper.s_free_blocks_count,
|
|
mySuper.s_inodes_count,
|
|
mySuper.s_free_inodes_count,
|
|
mySuper.s_creator_os);
|
|
|
|
}
|
|
|
|
Ext2fs::~Ext2fs()
|
|
{
|
|
if (mySuperDirty)
|
|
block_write(DEV_MAJOR(myDevice), DEV_MINOR(myDevice), 2, 2, &mySuper);
|
|
}
|