BarryServer : Git

All the code for all my projects
// BarryServer : Git / Nucleus / commit / 8250907d275ef0399499ed7c215bd1be16ca07b4 / vfs

// Related

Nucleus

Barry Simple tmpfs file system driver 8250907 (3 years, 3 months ago)
diff --git a/vfs/tmpfs/file.c b/vfs/tmpfs/file.c
new file mode 100644
index 0000000..9851ec3
--- /dev/null
+++ b/vfs/tmpfs/file.c
@@ -0,0 +1,75 @@
+#include <stdint.h>
+#include <stddef.h>
+#include <string.h>
+#include <nucleus/memory.h>
+#include <nucleus/vfs.h>
+
+size_t tmpfs_read(File *file, char *buf, size_t size, off_t offset);
+size_t tmpfs_write(File *file, char *buf, size_t size, off_t offset);
+int tmpfs_open(File *file);
+
+FileOps tmpfsFileOps = {
+	.read = tmpfs_read,
+	.write = tmpfs_write,
+	.open = tmpfs_open,
+};
+
+/* Read a file */
+size_t
+tmpfs_read(File *file, char *buf, size_t size, off_t offset)
+{
+	if (offset > file->inode->size)
+		return 0;
+	if (size + offset > file->inode->size)
+		size = file->inode->size - offset;
+
+	Page *page;
+	char *data;
+	size_t count = 0;
+	uint16_t min, indent = offset % PAGE_SIZE;
+	while (size) {
+		min = (size > PAGE_SIZE) ? PAGE_SIZE : size;
+		page = find_page(file->inode->pages, offset);
+		if (!page)
+			break;
+		data = map_page(page);
+		memcpy(buf + count, data + indent, min);
+		size -= min;
+		count += min;
+		indent = 0;
+	}
+	return count;
+}
+
+/* Write a file */
+size_t
+tmpfs_write(File *file, char *buf, size_t size, off_t offset)
+{
+	if (size + offset > file->inode->size)
+		file->inode->size = size + offset;
+
+	Page *page;
+	char *data;
+	size_t count = 0;
+	uint16_t min, indent = offset % PAGE_SIZE;
+	while (size) {
+		min = (size > PAGE_SIZE) ? PAGE_SIZE : size;
+		page = find_page(file->inode->pages, offset);
+		if (!page)
+			page = create_page(file->inode->pages, alloc_frame(),
+			                   offset);
+		data = map_page(page);
+		memcpy(data + indent, buf + count, min);
+		size -= min;
+		count += min;
+		indent = 0;
+	}
+	return count;
+}
+
+/* Open a file */
+int
+tmpfs_open(File *file)
+{
+	return 0;
+}
diff --git a/vfs/tmpfs/inode.c b/vfs/tmpfs/inode.c
new file mode 100644
index 0000000..f7519bd
--- /dev/null
+++ b/vfs/tmpfs/inode.c
@@ -0,0 +1,59 @@
+#include <nucleus/vfs.h>
+
+int tmpfs_create(Inode *inode, DirEntry *entry, mode_t mode);
+Inode *tmpfs_lookup(Inode *inode, const char *name);
+int tmpfs_mkdir(Inode *inode, DirEntry *entry, mode_t mode);
+int tmpfs_rmdir(Inode *inode, DirEntry *entry);
+int tmpfs_mknod(Inode *inode, DirEntry *entry, mode_t mode, dev_t dev);
+int tmpfs_rename(Inode *si, DirEntry *sde, Inode *di, DirEntry *dde);
+
+InodeOps tmpfsInodeOps = {
+	.create = tmpfs_create,
+	.lookup = tmpfs_lookup,
+	.mkdir = tmpfs_mkdir,
+	.rmdir = tmpfs_rmdir,
+	.mknod = tmpfs_mknod,
+	.rename = tmpfs_rename,
+};
+
+/* Create a file */
+int
+tmpfs_create(Inode *inode, DirEntry *entry, mode_t mode)
+{
+	return 0;
+}
+
+/* Look up a directory entry in a directory */
+Inode *
+tmpfs_lookup(Inode *inode, const char *name)
+{
+	return NULL;
+}
+
+/* Make a directory */
+int
+tmpfs_mkdir(Inode *inode, DirEntry *entry, mode_t mode)
+{
+	return 0;
+}
+
+/* Remove a directory */
+int
+tmpfs_rmdir(Inode *inode, DirEntry *entry)
+{
+	return 0;
+}
+
+/* Make a node */
+int
+tmpfs_mknod(Inode *inode, DirEntry *entry, mode_t mode, dev_t dev)
+{
+	return 0;
+}
+
+/* Rename/mode a directory entry */
+int
+tmpfs_rename(Inode *si, DirEntry *sde, Inode *di, DirEntry *dde)
+{
+	return 0;
+}
diff --git a/vfs/tmpfs/super.c b/vfs/tmpfs/super.c
index 989d2c0..4746588 100644
--- a/vfs/tmpfs/super.c
+++ b/vfs/tmpfs/super.c
@@ -1,11 +1,39 @@
+#include <sys/stat.h>
 #include <nucleus/vfs.h>
 
+extern InodeOps tmpfsInodeOps;
+extern FileOps tmpfsFileOps;
+
+Inode *tmpfs_alloc_inode(SuperBlock *sb);
+
+SuperOps tmpfsSuperOps = {
+	.alloc_inode = tmpfs_alloc_inode,
+};
+
 /* Mount a tmpfs instance */
 Inode *
 tmpfs_mount(FSType *type, int flags, const char *dev, void *data)
 {
-//	SuperBlock *super = new(&superBlockType);
+	SuperBlock *super = new(&superBlockType);
+
+	super->type = get(type);
+	super->ops = &tmpfsSuperOps;
+
+	Inode *inode = super_alloc_inode(super);
+	inode->mode = S_IFDIR | 0755;
+	super->root = inode;
 
-//	super->type = 
-	return NULL;
+	return inode;
+}
+
+/* Allocate an inode */
+Inode *
+tmpfs_alloc_inode(SuperBlock *sb)
+{
+	Inode *inode = new(&inodeType);
+	inode->ops = &tmpfsInodeOps;
+	inode->fileOps = &tmpfsFileOps;
+	inode->super = get(sb);
+	inode->nlink = 1;
+	return inode;
 }