BarryServer : Git

All the code for all my projects
// BarryServer : Git / Orion / blob / 1628fcfdfdf2978ed9ccac96ee7d13bb3dc43a01 / vfs / ext2fs / super.c

// Related

Orion

Barry Importing existing Orion kernel d41a53c (2 years, 4 months ago)
/*
 * This file controls the superblock for Ext2FS.  It supports mounting new
 * Ext2FS filesystems.  The VFS will use the calls here when dealing directly
 * with the filesystem structure.
 */

#include <stdint.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/mount.h>
#include "fs.h"
#include "../vfs.h"
#include "../inode.h"
#include "../super.h"
#include "../../mem/heap.h"
#include "../../task/task.h"
#include "../../screen.h"

Inode *ext2fs_mount(FileSystemType *type, int flags,
                      const char *dev, void *data);
Inode *ext2fs_alloc_inode(SuperBlock *sb);

FileSystemType ext2fsType = {
	.name = "Ext2FS",
	.mount = ext2fs_mount,
};

SuperOps ext2fsSuperOps = {
	.alloc_inode = ext2fs_alloc_inode,
};

/* Mount a Ext2FS instance */
Inode *
ext2fs_mount(FileSystemType *type, int flags, const char *dev, void *data)
{
	if (type != &ext2fsType)
		return NULL;

	int fd = open(dev, O_RDONLY);
	if (fd < 0)
		return (void *) fd;
	File *back = file_get(current->files->fd[fd]);
	close(fd);
	if (!S_ISBLK(back->mode)) {
		file_put(back);
		return (void *) -ENOTBLK;
	}

	Ext2Super *rsuper = kmalloc(sizeof(Ext2Super));
	back->pos = 1024;
	file_read(back, (char *) rsuper, sizeof(Ext2Super));
	if (rsuper->signature != 0xEF53) {
		kprintf("Error while mounting %s: Not an Ext2FS drive", dev);
		file_put(back);
		kfree(rsuper);
		return (void *) -EINVAL;
	}
	if (rsuper->requiredFeatures & 0x01) {
		kprintf("Cannot mount %s: Compression required", dev);
		file_put(back);
		kfree(rsuper);
		return (void *) -EINVAL;
	}
	if ((rsuper->writableFeatures & 0x02) && !(flags & MS_RDONLY)) {
		kprintf("Cannot mount %s: 64-bit File System required", dev);
		file_put(back);
		kfree(rsuper);
		return (void *) -EINVAL;
	}

	SuperBlock *super = kmalloc(sizeof(SuperBlock));
	super->type = type;
	super->ops = &ext2fsSuperOps;
	init_lock(&super->lock);
	super->back = back;
	super->data = rsuper;
	super->root = kmalloc(sizeof(Inode));
	ext2_read_vnode(super, 2, super->root);

	return super->root;
}

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