BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / blob / master / vfs / ext2fs / super.c

// Related

Nucleus

Barry Object manager and heap in kernel library 08afe80 (3 years, 2 months ago)
#include <sys/errno.h>
#include <sys/file.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <nucleus/lib.h>
#include <nucleus/task.h>
#include <nucleus/vfs.h>
#include "ext2fs.h"

Inode *ext2fs_alloc_inode(SuperBlock *sb);

const uint16_t EXT2_SIGNATURE = 0xEF53;

SuperOps ext2fsSuperOps = {
	.alloc_inode = ext2fs_alloc_inode,
};

/* Mount an ext2fs instance */
Inode *
ext2fs_mount(FSType *type, int flags, const char *dev, void *data)
{
	/* Open backing file */
	int fd = open(dev, O_RDONLY);
	if (fd < 0)
		return (void *) fd;
	File *back = get(get_file_by_fd(fd));
	close(fd);
	if (!S_ISBLK(back->inode->mode)) {
		put(back);
		return (void *) -ENOTBLK;
	}

	/* Read super block */
	struct Ext2Super *rsuper = kmalloc(sizeof(struct Ext2Super));
	back->pos = 1024;
	file_read(back, (char *) rsuper, sizeof(struct Ext2Super));
	if (rsuper->signature != EXT2_SIGNATURE)
		goto error;
	if (rsuper->requiredFeatures & 0x01)
		/* Compression required */
		goto error;
	if ((rsuper->writableFeatures & 0x02) && !(flags & MS_RDONLY))
		/* 64-bit file system */
		goto error;

	SuperBlock *super = new(&superBlockType);
	super->type = get(type);
	super->ops = &ext2fsSuperOps;
	super->back = back;
	super->data = rsuper;
	super->root = new(&inodeType);
	ext2fs_read_vnode(super, 2, super->root);

	return super->root;

error:
	put(back);
	kfree(rsuper);
	return (void *) -EINVAL;
}

/* Allocate an inode */
Inode *
ext2fs_alloc_inode(SuperBlock *sb)
{
	return NULL;
}