/* Copyright (c) 2009, 2010 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Implementation of the KFS file system.  It is a RAM based, read-only FS
 * consisting of files that are added to the kernel binary image.  Might turn
 * this into a read/write FS with directories someday. */
#include <vfs.h>
#include <kfs.h>
#include <slab.h>
#include <kmalloc.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <error.h>
#include <cpio.h>
#include <pmap.h>
#include <smp.h>

#define KFS_MAX_FILE_SIZE 1024*1024*128
#define KFS_MAGIC 0xdead0001

/* VFS required Functions */
/* These structs are declared again and initialized farther down */
struct page_map_operations kfs_pm_op;
struct super_operations kfs_s_op;
struct inode_operations kfs_i_op;
struct dentry_operations kfs_d_op;
struct file_operations kfs_f_op_file;
struct file_operations kfs_f_op_dir;
struct file_operations kfs_f_op_sym;

/* TODO: something more better.  Prob something like the vmem cache, for this,
 * pids, etc.  Good enough for now.  This also means we can only have one
 * KFS instance, and we also aren't synchronizing access. */
static unsigned long kfs_get_free_ino(void)
{
	static unsigned long last_ino = 1;	 /* 1 is reserved for the root */
	last_ino++;
	if (!last_ino)
		panic("Out of inos in KFS!");
	return last_ino;
}

/* Slabs for KFS specific info chunks */
struct kmem_cache *kfs_i_kcache;

static void kfs_init(void)
{
	kfs_i_kcache = kmem_cache_create("kfs_ino_info",
					 sizeof(struct kfs_i_info),
					 __alignof__(struct kfs_i_info), 0,
					 NULL, 0, 0, NULL);
}

/* Creates the SB (normally would read in from disc and create).  Passes its
 * ref out to whoever consumes this.  Returns 0 on failure.
 * TODO: consider pulling out more of the FS-independent stuff, if possible.
 * There are only two things, but the pain in the ass is that you'd need to read
 * the disc to get that first inode, and it's a FS-specific thing. */
struct super_block *kfs_get_sb(struct fs_type *fs, int flags,
                               char *dev_name, struct vfsmount *vmnt)
{
	/* Ought to check that dev_name has our FS on it.  in this case, it's
	 * irrelevant. */
	//if (something_bad)
	//	return 0;
	static bool ran_once = FALSE;
	if (!ran_once) {
		ran_once = TRUE;
		kfs_init();
	}

	/* Build and init the SB.  No need to read off disc. */
	struct super_block *sb = get_sb();
	sb->s_dev = 0;
	sb->s_blocksize = 1;
	sb->s_maxbytes = KFS_MAX_FILE_SIZE;
	sb->s_type = &kfs_fs_type;
	sb->s_op = &kfs_s_op;
	sb->s_flags = flags;
	sb->s_magic = KFS_MAGIC;
	sb->s_mount = vmnt;
	sb->s_syncing = FALSE;
	sb->s_bdev = 0;
	strlcpy(sb->s_name, "KFS", 32);
	/* store the location of the CPIO archive.  make this more generic later. */
	extern uint8_t _binary_obj_kern_initramfs_cpio_size[];
	extern uint8_t _binary_obj_kern_initramfs_cpio_start[];
	sb->s_fs_info = (void*)_binary_obj_kern_initramfs_cpio_start;

	/* Final stages of initializing the sb, mostly FS-independent */
	/* 1 is the KFS root ino (inode number) */
	init_sb(sb, vmnt, &kfs_d_op, 1, 0);
	/* Parses the CPIO entries and builds the in-memory KFS tree. */
	parse_cpio_entries(sb, sb->s_fs_info);
	printk("KFS superblock loaded\n");
	return sb;
}

void kfs_kill_sb(struct super_block *sb)
{
	panic("Killing KFS is not supported!");
}

/* Every FS must have a static FS Type, with which the VFS code can bootstrap */
struct fs_type kfs_fs_type = {"KFS", 0, kfs_get_sb, kfs_kill_sb, {0, 0},
               TAILQ_HEAD_INITIALIZER(kfs_fs_type.fs_supers)};

/* Page Map Operations */

/* Fills page with its contents from its backing store file.  Note that we do
 * the zero padding here, instead of higher in the VFS.  Might change in the
 * future. */
int kfs_readpage(struct page_map *pm, struct page *page)
{
	size_t pg_idx_byte = page->pg_index * PGSIZE;
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)
	                              pm->pm_host->i_fs_info;
	uintptr_t begin = (size_t)k_i_info->filestart + pg_idx_byte;

	/* Pretend that we blocked while filing this page.  This catches a lot of
	 * bugs.  It does slightly slow down the kernel, but it's only when filling
	 * the page cache, and considering we are using a RAMFS, you shouldn't
	 * measure things that actually rely on KFS's performance. */
	kthread_usleep(1);
	/* If we're beyond the initial start point, we just need a zero page.  This
	 * is for a hole or for extending a file (even though it won't be saved).
	 * Otherwise, we want the data from KFS, being careful to not copy from
	 * beyond the original EOF (and zero padding anything extra). */
	if (pg_idx_byte >= k_i_info->init_size) {
		memset(page2kva(page), 0, PGSIZE);
	} else {
		size_t copy_amt = MIN(PGSIZE, k_i_info->init_size - pg_idx_byte);
		memcpy(page2kva(page), (void*)begin, copy_amt);
		memset(page2kva(page) + copy_amt, 0, PGSIZE - copy_amt);
	}
	struct buffer_head *bh = kmem_cache_alloc(bh_kcache, 0);
	if (!bh)
		return -1;			/* untested, un-thought-through */
	atomic_or(&page->pg_flags, PG_BUFFER);
	/* KFS does a 1:1 BH to page mapping */
	bh->bh_page = page;								/* weak ref */
	bh->bh_buffer = page2kva(page);
	bh->bh_flags = 0;								/* whatever... */
	bh->bh_next = 0;								/* only one BH needed */
	bh->bh_bdev = pm->pm_host->i_sb->s_bdev;		/* uncounted */
	bh->bh_sector = page->pg_index;
	bh->bh_nr_sector = 1;							/* sector size = PGSIZE */
	page->pg_private = bh;
	/* This is supposed to be done in the IO system when the operation is
	 * complete.  Since we aren't doing a real IO request, and it is already
	 * done, we can do it here. */
	atomic_or(&page->pg_flags, PG_UPTODATE);
	return 0;
}

int kfs_writepage(struct page_map *pm, struct page *page)
{
	warn_once("KFS writepage does not save file contents!\n");
	return -1;
}

/* Super Operations */

/* Creates and initializes a new inode.  FS specific, yet inode-generic fields
 * are filled in.  inode-specific fields are filled in in read_inode() based on
 * what's on the disk for a given i_no.  i_no and i_fop are set by the caller.
 *
 * Note that this means this inode can be for an inode that is already on disk,
 * or it can be used when creating.  The i_fop depends on the type of file
 * (file, directory, symlink, etc). */
struct inode *kfs_alloc_inode(struct super_block *sb)
{
	struct inode *inode = kmem_cache_alloc(inode_kcache, 0);
	memset(inode, 0, sizeof(struct inode));
	inode->i_op = &kfs_i_op;
	inode->i_pm.pm_op = &kfs_pm_op;
	inode->i_fs_info = kmem_cache_alloc(kfs_i_kcache, 0);
	TAILQ_INIT(&((struct kfs_i_info*)inode->i_fs_info)->children);
	((struct kfs_i_info*)inode->i_fs_info)->filestart = 0;
	((struct kfs_i_info*)inode->i_fs_info)->init_size = 0;
	return inode;
}

/* FS-specific clean up when an inode is dealloced.  this is just cleaning up
 * the in-memory version, and only the FS-specific parts.  whether or not the
 * inode is still on disc is irrelevant. */
void kfs_dealloc_inode(struct inode *inode)
{
	/* If we're a symlink, give up our storage for the symname */
	if (S_ISLNK(inode->i_mode))
		kfree(((struct kfs_i_info*)inode->i_fs_info)->filestart);
	kmem_cache_free(kfs_i_kcache, inode->i_fs_info);
}

/* reads the inode data on disk specified by inode->i_ino into the inode.
 * basically, it's a "make this inode the one for i_ino (i number)" */
void kfs_read_inode(struct inode *inode)
{
	/* need to do something to link this inode/file to the actual "blocks" on
	 * "disk". */

	/* TODO: what does it mean to ask for an inode->i_ino that doesn't exist?
	 * 	possibly a bug, since these inos come from directories */
	if (inode->i_ino == 1) {
		inode->i_mode = S_IRWXU | S_IRWXG | S_IRWXO;
		SET_FTYPE(inode->i_mode, __S_IFDIR);
		inode->i_fop = &kfs_f_op_dir;
		inode->i_nlink = 1;				/* assuming only one hardlink */
		inode->i_uid = 0;
		inode->i_gid = 0;
		inode->i_size = 0;				/* make sense for KFS? */
		inode->i_atime.tv_sec = 0;
		inode->i_atime.tv_nsec = 0;
		inode->i_mtime.tv_sec = 0;
		inode->i_mtime.tv_nsec = 0;
		inode->i_ctime.tv_sec = 0;
		inode->i_ctime.tv_nsec = 0;
		inode->i_blocks = 0;
		inode->i_flags = 0;
		inode->i_socket = FALSE;
	} else {
		panic("Not implemented");
	}
	/* TODO: unused: inode->i_hash add to hash (saves on disc reading) */
}

/* called when an inode in memory is modified (journalling FS's care) */
void kfs_dirty_inode(struct inode *inode)
{	// KFS doesn't care
}

/* write the inode to disk (specifically, to inode inode->i_ino), synchronously
 * if we're asked to wait */
void kfs_write_inode(struct inode *inode, bool wait)
{	// KFS doesn't care
}

/* called when an inode is decref'd, to do any FS specific work */
void kfs_put_inode(struct inode *inode)
{	// KFS doesn't care
}

/* called when an inode is about to be destroyed.  the generic version ought to
 * remove every reference to the inode from the VFS, and if the inode isn't in
 * any directory, calls delete_inode */
void kfs_drop_inode(struct inode *inode)
{ // TODO: should call a generic one instead.  or at least do something...
	// remove from lists
}

/* delete the inode from disk (all data) */
void kfs_delete_inode(struct inode *inode)
{
	// would remove from "disk" here
	/* TODO: give up our i_ino */
}

/* unmount and release the super block */
void kfs_put_super(struct super_block *sb)
{
	panic("Shazbot! KFS can't be unmounted yet!");
}

/* updates the on-disk SB with the in-memory SB */
void kfs_write_super(struct super_block *sb)
{	// KFS doesn't care
}

/* syncs FS metadata with the disc, synchronously if we're waiting.  this info
 * also includes anything pointed to by s_fs_info. */
int kfs_sync_fs(struct super_block *sb, bool wait)
{
	return 0;
}

/* remount the FS with the new flags */
int kfs_remount_fs(struct super_block *sb, int flags, char *data)
{
	warn("KFS will not remount.");
	return -1; // can't remount
}

/* interrupts a mount operation - used by NFS and friends */
void kfs_umount_begin(struct super_block *sb)
{
	panic("Cannot abort a KFS mount, and why would you?");
}

/* inode_operations */

/* Little helper, used for initializing new inodes for file-like objects (files,
 * symlinks, etc).  We pass the dentry, since we need to up it. */
static void kfs_init_inode(struct inode *dir, struct dentry *dentry)
{
	struct inode *inode = dentry->d_inode;
	kref_get(&dentry->d_kref, 1);	/* to pin the dentry in RAM, KFS-style... */
	inode->i_ino = kfs_get_free_ino();
	/* our parent dentry's inode tracks our dentry info.  We do this
	 * since it's all in memory and we aren't using the dcache yet.
	 * We're reusing the subdirs link, which is used by the VFS when
	 * we're a directory.  But since we're a file, it's okay to reuse
	 * it. */
	TAILQ_INSERT_TAIL(&((struct kfs_i_info*)dir->i_fs_info)->children,
	                  dentry, d_subdirs_link);
}

/* Called when creating a new disk inode in dir associated with dentry.  We need
 * to fill out the i_ino, set the type, and do whatever else we need */
int kfs_create(struct inode *dir, struct dentry *dentry, int mode,
               struct nameidata *nd)
{
	struct inode *inode = dentry->d_inode;
	kfs_init_inode(dir, dentry);
	SET_FTYPE(inode->i_mode, __S_IFREG);
	inode->i_fop = &kfs_f_op_file;
	/* fs_info->filestart is set by the caller, or else when first written (for
	 * new files.  it was set to 0 in alloc_inode(). */
	return 0;
}

/* Searches the directory for the filename in the dentry, filling in the dentry
 * with the FS specific info of this file.  If it succeeds, it will pass back
 * the *dentry you should use.  If this fails, it will return 0.  It will NOT
 * take your dentry ref (it used to).  It probably will not be the same dentry
 * you passed in.  This is ugly.
 *
 * Callers, make sure you alloc and fill out the name parts of the dentry, and
 * an initialized nameidata. TODO: not sure why we need an ND.  Don't use it in
 * a fs_lookup for now!
 *
 * Because of the way KFS currently works, if there is ever a dentry, it's
 * already in memory, along with its inode (all path's pinned).  So we just find
 * it and return it, freeing the one that came in. */
struct dentry *kfs_lookup(struct inode *dir, struct dentry *dentry,
                          struct nameidata *nd)
{
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)dir->i_fs_info;
	struct dentry *dir_dent = TAILQ_FIRST(&dir->i_dentry);
	struct dentry *d_i;

	assert(dir_dent && dir_dent == TAILQ_LAST(&dir->i_dentry, dentry_tailq));
	/* had this fail when kern/kfs has a symlink go -> ../../../go, though
	 * a symlink like lib2 -> lib work okay. */
	assert(S_ISDIR(dir->i_mode));
	assert(kref_refcnt(&dentry->d_kref) == 1);
	TAILQ_FOREACH(d_i, &dir_dent->d_subdirs, d_subdirs_link) {
		if (!strcmp(d_i->d_name.name, dentry->d_name.name)) {
			/* since this dentry is already in memory (that's how KFS works), we
			 * just return the real one (with another refcnt) */
			kref_get(&d_i->d_kref, 1);
			return d_i;
		}
	}
	TAILQ_FOREACH(d_i, &k_i_info->children, d_subdirs_link) {
		if (!strcmp(d_i->d_name.name, dentry->d_name.name)) {
			/* since this dentry is already in memory (that's how KFS works), we
			 * just return the real one (with another refcnt) */
			kref_get(&d_i->d_kref, 1);
			return d_i;
		}
	}
	printd("Not Found %s!!\n", dentry->d_name.name);
	return 0;
}

/* Hard link to old_dentry in directory dir with a name specified by new_dentry.
 * At the very least, set the new_dentry's FS-specific fields. */
int kfs_link(struct dentry *old_dentry, struct inode *dir,
             struct dentry *new_dentry)
{
	assert(new_dentry->d_op = &kfs_d_op);
	kref_get(&new_dentry->d_kref, 1);		/* pin the dentry, KFS-style */
	/* KFS-style directory-tracking-of-kids */
	TAILQ_INSERT_TAIL(&((struct kfs_i_info*)dir->i_fs_info)->children,
	                  new_dentry, d_subdirs_link);
	return 0;
}

/* Removes the link from the dentry in the directory */
int kfs_unlink(struct inode *dir, struct dentry *dentry)
{
	/* Stop tracking our child */
	TAILQ_REMOVE(&((struct kfs_i_info*)dir->i_fs_info)->children, dentry,
	             d_subdirs_link);
	kref_put(&dentry->d_kref);				/* unpin the dentry, KFS-style */
	return 0;
}

/* Creates a new inode for a symlink dir, linking to / containing the name
 * symname.  dentry is the controlling dentry of the inode. */
int kfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname)
{
	struct inode *inode = dentry->d_inode;
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)inode->i_fs_info;
	size_t len = strlen(symname);
	char *string = kmalloc(len + 1, 0);

	kfs_init_inode(dir, dentry);
	SET_FTYPE(inode->i_mode, __S_IFLNK);
	inode->i_fop = &kfs_f_op_sym;
	strlcpy(string, symname, len + 1);
	k_i_info->filestart = string;	/* reusing this void* to hold the char* */
	return 0;
}

/* Called when creating a new inode for a directory associated with dentry in
 * dir with the given mode.  Note, we might (later) need to track subdirs within
 * the parent inode, like we do with regular files.  I'd rather not, so we'll
 * see if we need it. */
int kfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
{
	struct inode *inode = dentry->d_inode;
	kref_get(&dentry->d_kref, 1);	/* to pin the dentry in RAM, KFS-style... */
	inode->i_ino = kfs_get_free_ino();
	SET_FTYPE(inode->i_mode, __S_IFDIR);
	inode->i_fop = &kfs_f_op_dir;
	/* get ready to have our own kids */
	TAILQ_INIT(&((struct kfs_i_info*)inode->i_fs_info)->children);
	((struct kfs_i_info*)inode->i_fs_info)->filestart = 0;
	return 0;
}

/* Removes from dir the directory 'dentry.'  KFS doesn't store anything in the
 * inode for which children it has.  It probably should, but since everything is
 * pinned, it just relies on the dentry connections. */
int kfs_rmdir(struct inode *dir, struct dentry *dentry)
{
	struct kfs_i_info *d_info = (struct kfs_i_info*)dentry->d_inode->i_fs_info;
	struct dentry *d_i;
	bool empty = TRUE;
	/* Check if we are empty.  If not, error out, need to check the sub-dirs as
	 * well as the sub-"files" */
	TAILQ_FOREACH(d_i, &dentry->d_subdirs, d_subdirs_link) {
		empty = FALSE;
		break;
	}
	TAILQ_FOREACH(d_i, &d_info->children, d_subdirs_link) {
		empty = FALSE;
		break;
	}
	if (!empty)
		return -ENOTEMPTY;
	kref_put(&dentry->d_kref);				/* unpin the dentry, KFS-style */
	printd("DENTRY %s REFCNT %d\n", dentry->d_name.name, kref_refcnt(&dentry->d_kref));
	return 0;
}

/* Used to make a generic file, based on the type and the major/minor numbers
 * (in rdev), with the given mode.  As with others, this creates a new disk
 * inode for the file */
int kfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
{
	return -1;
}

/* Moves old_d from old_dir to new_d in new_dir.  TODO: super racy */
int kfs_rename(struct inode *old_dir, struct dentry *old_d,
               struct inode *new_dir, struct dentry *new_d)
{
	/* new_d is already gone, we just use it for its name.  kfs might not care
	 * about the name.  it might just use whatever the dentry says. */
	struct kfs_i_info *old_info = (struct kfs_i_info*)old_dir->i_fs_info;
	struct kfs_i_info *new_info = (struct kfs_i_info*)new_dir->i_fs_info;
	printd("KFS rename: %s/%s -> %s/%s\n",
	       TAILQ_FIRST(&old_dir->i_dentry)->d_name.name, old_d->d_name.name,
	       TAILQ_FIRST(&new_dir->i_dentry)->d_name.name, new_d->d_name.name);
	/* we want to remove from the old and add to the new.  for non-directories,
	 * we need to adjust parent's children lists (which reuses subdirs_link,
	 * yikes!).  directories aren't actually tracked by KFS; it just hopes the
	 * VFS's pinned dentry tree is enough (aka, "all paths pinned"). */
	if (!S_ISDIR(old_d->d_inode->i_mode)) {
		TAILQ_REMOVE(&old_info->children, old_d, d_subdirs_link);
		TAILQ_INSERT_TAIL(&new_info->children, old_d, d_subdirs_link);
	}
	return 0;
}

/* Returns the char* for the symname for the given dentry.  The VFS code that
 * calls this for real FS's might assume it's already read in, so if the char *
 * isn't already in memory, we'd need to read it in here.  Regarding the char*
 * storage, the char* only will last as long as the dentry and inode are in
 * memory. */
char *kfs_readlink(struct dentry *dentry)
{
	struct inode *inode = dentry->d_inode;
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)inode->i_fs_info;
	if (!S_ISLNK(inode->i_mode))
		return 0;
	return k_i_info->filestart;
}

/* Modifies the size of the file of inode to whatever its i_size is set to */
void kfs_truncate(struct inode *inode)
{
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)inode->i_fs_info;
	/* init_size tracks how much of the file KFS has.  everything else is 0s.
	 * we only need to update it if we are dropping data.  as with other data
	 * beyond init_size, KFS will not save it during a write page! */
	k_i_info->init_size = MIN(k_i_info->init_size, inode->i_size);
}

/* Checks whether the the access mode is allowed for the file belonging to the
 * inode.  Implies that the permissions are on the file, and not the hardlink */
int kfs_permission(struct inode *inode, int mode, struct nameidata *nd)
{
	return -1;
}


/* dentry_operations */
/* Determines if the dentry is still valid before using it to translate a path.
 * Network FS's need to deal with this. */
int kfs_d_revalidate(struct dentry *dir, struct nameidata *nd)
{ // default, nothing
	return -1;
}

/* Compares name1 and name2.  name1 should be a member of dir. */
int kfs_d_compare(struct dentry *dir, struct qstr *name1, struct qstr *name2)
{ // default, string comp (case sensitive)
	return -1;
}

/* Called when the last ref is deleted (refcnt == 0) */
int kfs_d_delete(struct dentry *dentry)
{ // default, nothin
	return -1;
}

/* Called when it's about to be slab-freed */
int kfs_d_release(struct dentry *dentry)
{
	return -1;
}

/* Called when the dentry loses its inode (becomes "negative") */
void kfs_d_iput(struct dentry *dentry, struct inode *inode)
{ // default, call i_put to release the inode object
}


/* file_operations */

/* Updates the file pointer.  TODO: think about locking. */
int kfs_llseek(struct file *file, off64_t offset, off64_t *ret, int whence)
{
	off64_t temp_off = 0;
	switch (whence) {
		case SEEK_SET:
			temp_off = offset;
			break;
		case SEEK_CUR:
			temp_off = file->f_pos + offset;
			break;
		case SEEK_END:
			temp_off = file->f_dentry->d_inode->i_size + offset;
			break;
		default:
			set_errno(EINVAL);
			warn("Unknown 'whence' in llseek()!\n");
			return -1;
	}
	file->f_pos = temp_off;
	*ret = temp_off;
	return 0;
}

/* Fills in the next directory entry (dirent), starting with d_off.  KFS treats
 * the size of each dirent as 1 byte, which we can get away with since the d_off
 * is a way of communicating with future calls to readdir (FS-specific).
 *
 * Like with read and write, there will be issues with userspace and the *dirent
 * buf.  TODO: we don't really do anything with userspace concerns here, in part
 * because memcpy_to doesn't work well.  When we fix how we want to handle the
 * userbuffers, we can write this accordingly. (UMEM)  */
int kfs_readdir(struct file *dir, struct dirent *dirent)
{
	int count = 2;	/* total num dirents, gets incremented in check_entry() */
	int desired_file = dirent->d_off;
	bool found = FALSE;
	struct dentry *subent;
	struct dentry *dir_d = dir->f_dentry;
	struct kfs_i_info *k_i_info = (struct kfs_i_info*)dir_d->d_inode->i_fs_info;

	/* how we check inside the for loops below.  moderately ghetto. */
	void check_entry(void)
	{
		if (count++ == desired_file) {
			dirent->d_ino = subent->d_inode->i_ino;
			dirent->d_off = count;
			dirent->d_reclen = subent->d_name.len;
			/* d_name.name is null terminated, the byte after d_name.len.
			 * Regardless, exercise caution as we copy into d_name, should
			 * the size of the quickstring buffer and the size of d_name
			 * fall out of sync with one another. */
			assert(subent->d_name.len < sizeof(dirent->d_name));
			strncpy(dirent->d_name, subent->d_name.name,
			        sizeof(dirent->d_name) - 1);
			dirent->d_name[sizeof(dirent->d_name) - 1] = '\0';
			found = TRUE;
		}
	}

	/* Handle . and .. (first two dirents) */
	if (desired_file == 0) {
		dirent->d_ino = dir_d->d_inode->i_ino;
		dirent->d_off = 1;
		dirent->d_reclen = 1;
		strlcpy(dirent->d_name, ".", sizeof(dirent->d_name));
		found = TRUE;
	} else if (desired_file == 1) {
		dirent->d_ino = dir_d->d_parent->d_inode->i_ino;
		dirent->d_off = 2;
		dirent->d_reclen = 2;
		strlcpy(dirent->d_name, "..", sizeof(dirent->d_name));
		found = TRUE;
	}
	/* need to check the sub-dirs as well as the sub-"files".  The main
	 * ghetto-ness with this is that we check even though we have our result,
	 * simply to figure out how big our directory is.  It's just not worth
	 * changing at this point. */
	TAILQ_FOREACH(subent, &dir_d->d_subdirs, d_subdirs_link)
		check_entry();
	TAILQ_FOREACH(subent, &k_i_info->children, d_subdirs_link)
		check_entry();
	if (!found)
		return -ENOENT;
	if (count - 1 == desired_file)		/* found the last dir in the list */
		return 0;
	return 1;							/* normal success for readdir */
}

/* This is called when a VMR is mapping a particular file.  The FS needs to do
 * whatever it needs so that faults can be handled by read_page(), and handle all
 * of the cases of MAP_SHARED, MAP_PRIVATE, whatever.  It also needs to ensure
 * the file is not being mmaped in a way that conflicts with the manner in which
 * the file was opened or the file type. */
int kfs_mmap(struct file *file, struct vm_region *vmr)
{
	if (S_ISREG(file->f_dentry->d_inode->i_mode))
		return 0;
	return -1;
}

/* Called by the VFS while opening the file, which corresponds to inode,  for
 * the FS to do whatever it needs. */
int kfs_open(struct inode *inode, struct file *file)
{
	return 0;
}

/* Called when a file descriptor is closed. */
int kfs_flush(struct file *file)
{
	return -1;
}

/* Called when the file is about to be closed (file obj freed) */
int kfs_release(struct inode *inode, struct file *file)
{
	return 0;
}

/* Flushes the file's dirty contents to disc */
int kfs_fsync(struct file *file, struct dentry *dentry, int datasync)
{
	return -1;
}

/* Traditionally, sleeps until there is file activity.  We probably won't
 * support this, or we'll handle it differently. */
unsigned int kfs_poll(struct file *file, struct poll_table_struct *poll_table)
{
	return -1;
}

/* Reads count bytes from a file, starting from (and modifiying) offset, and
 * putting the bytes into buffers described by vector */
ssize_t kfs_readv(struct file *file, const struct iovec *vector,
                  unsigned long count, off64_t *offset)
{
	return -1;
}

/* Writes count bytes to a file, starting from (and modifiying) offset, and
 * taking the bytes from buffers described by vector */
ssize_t kfs_writev(struct file *file, const struct iovec *vector,
                  unsigned long count, off64_t *offset)
{
	return -1;
}

/* Write the contents of file to the page.  Will sort the params later */
ssize_t kfs_sendpage(struct file *file, struct page *page, int offset,
                     size_t size, off64_t pos, int more)
{
	return -1;
}

/* Checks random FS flags.  Used by NFS. */
int kfs_check_flags(int flags)
{ // default, nothing
	return -1;
}

/* Redeclaration and initialization of the FS ops structures */
struct page_map_operations kfs_pm_op = {
	kfs_readpage,
	kfs_writepage,
};

struct super_operations kfs_s_op = {
	kfs_alloc_inode,
	kfs_dealloc_inode,
	kfs_read_inode,
	kfs_dirty_inode,
	kfs_write_inode,
	kfs_put_inode,
	kfs_drop_inode,
	kfs_delete_inode,
	kfs_put_super,
	kfs_write_super,
	kfs_sync_fs,
	kfs_remount_fs,
	kfs_umount_begin,
};

struct inode_operations kfs_i_op = {
	kfs_create,
	kfs_lookup,
	kfs_link,
	kfs_unlink,
	kfs_symlink,
	kfs_mkdir,
	kfs_rmdir,
	kfs_mknod,
	kfs_rename,
	kfs_readlink,
	kfs_truncate,
	kfs_permission,
};

struct dentry_operations kfs_d_op = {
	kfs_d_revalidate,
	generic_dentry_hash,
	kfs_d_compare,
	kfs_d_delete,
	kfs_d_release,
	kfs_d_iput,
};

struct file_operations kfs_f_op_file = {
	kfs_llseek,
	generic_file_read,
	generic_file_write,
	kfs_readdir,
	kfs_mmap,
	kfs_open,
	kfs_flush,
	kfs_release,
	kfs_fsync,
	kfs_poll,
	kfs_readv,
	kfs_writev,
	kfs_sendpage,
	kfs_check_flags,
};

struct file_operations kfs_f_op_dir = {
	kfs_llseek,
	generic_dir_read,
	0,
	kfs_readdir,
	kfs_mmap,
	kfs_open,
	kfs_flush,
	kfs_release,
	kfs_fsync,
	kfs_poll,
	kfs_readv,
	kfs_writev,
	kfs_sendpage,
	kfs_check_flags,
};

struct file_operations kfs_f_op_sym = {
	kfs_llseek,
	generic_file_read,
	generic_file_write,
	kfs_readdir,
	kfs_mmap,
	kfs_open,
	kfs_flush,
	kfs_release,
	kfs_fsync,
	kfs_poll,
	kfs_readv,
	kfs_writev,
	kfs_sendpage,
	kfs_check_flags,
};

/* KFS Specific Internal Functions */

/* Need to pass path separately, since we'll recurse on it.  TODO: this recurses,
 * and takes up a lot of stack space (~270 bytes).  Core 0's KSTACK is 8 pages,
 * which can handle about 120 levels deep...  Other cores are not so fortunate.
 * Can rework this if it becomes an issue. */
static int __add_kfs_entry(struct dentry *parent, char *path,
                           struct cpio_bin_hdr *c_bhdr)
{
	char *first_slash = strchr(path, '/');
	char dir[MAX_FILENAME_SZ + 1];	/* room for the \0 */
	size_t dirname_sz;				/* not counting the \0 */
	struct dentry *dentry = 0;
	struct inode *inode;
	int err, retval;
	char *symname, old_end;			/* for symlink manipulation */

	if (first_slash) {
		/* get the first part, find that dentry, pass in the second part,
		 * recurse.  this isn't being smart about extra slashes, dots, or
		 * anything like that. */
		dirname_sz = first_slash - path;
		assert(dirname_sz <= MAX_FILENAME_SZ);
		memmove(dir, path, dirname_sz);
		dir[dirname_sz] = '\0';
		printd("Finding DIR %s in dentry %s (start: %p, size %d)\n", dir,
		       parent->d_name.name, c_bhdr->c_filestart, c_bhdr->c_filesize);
		/* Need to create a dentry for the lookup, and fill in the basic nd */
		dentry = get_dentry(parent->d_sb, parent, dir);
		/* TODO: use a VFS lookup instead, to use the dcache, thought its not a
		 * big deal since KFS currently pins all metadata. */
		dentry = kfs_lookup(parent->d_inode, dentry, 0);
		if (!dentry) {
			printk("Missing dir in CPIO archive or something, aborting.\n");
			return -1;
		}
		retval = __add_kfs_entry(dentry, first_slash + 1, c_bhdr);
		kref_put(&dentry->d_kref);
		return retval;
	} else {
		/* no directories left in the path.  add the 'file' to the dentry */
		printd("Adding file/dir %s to dentry %s (start: %p, size %d)\n", path,
		       parent->d_name.name, c_bhdr->c_filestart, c_bhdr->c_filesize);
		/* Init the dentry for this path */
		dentry = get_dentry(parent->d_sb, parent, path);
		// want to test the regular/natural dentry caching paths
		//dcache_put(dentry->d_sb, dentry);
		/* build the inode */
		switch (c_bhdr->c_mode & CPIO_FILE_MASK) {
			case (CPIO_DIRECTORY):
				err = create_dir(parent->d_inode, dentry, c_bhdr->c_mode);
				assert(!err);
				break;
			case (CPIO_SYMLINK):
				/* writing the '\0' is safe since the next entry is always still
				 * in the CPIO (and we are processing sequentially). */
				symname = c_bhdr->c_filestart;
				old_end = symname[c_bhdr->c_filesize];
				symname[c_bhdr->c_filesize] = '\0';
				err = create_symlink(parent->d_inode, dentry, symname,
				                     c_bhdr->c_mode & CPIO_PERM_MASK);
				assert(!err);
				symname[c_bhdr->c_filesize] = old_end;
				break;
			case (CPIO_REG_FILE):
				err = create_file(parent->d_inode, dentry,
				                  c_bhdr->c_mode & CPIO_PERM_MASK);
				assert(!err);
				((struct kfs_i_info*)dentry->d_inode->i_fs_info)->filestart =
														c_bhdr->c_filestart;
				((struct kfs_i_info*)dentry->d_inode->i_fs_info)->init_size =
														c_bhdr->c_filesize;
				break;
			default:
				printk("Unknown file type %d in the CPIO!",
				       c_bhdr->c_mode & CPIO_FILE_MASK);
				kref_put(&dentry->d_kref);
				return -1;
		}
		inode = dentry->d_inode;
		/* Set other info from the CPIO entry */
		inode->i_uid = c_bhdr->c_uid;
		inode->i_gid = c_bhdr->c_gid;
		inode->i_atime.tv_sec = c_bhdr->c_mtime;
		inode->i_ctime.tv_sec = c_bhdr->c_mtime;
		inode->i_mtime.tv_sec = c_bhdr->c_mtime;
		inode->i_size = c_bhdr->c_filesize;
		//inode->i_XXX = c_bhdr->c_dev;			/* and friends */
		inode->i_bdev = 0;						/* assuming blockdev? */
		inode->i_socket = FALSE;
		inode->i_blocks = c_bhdr->c_filesize;	/* blocksize == 1 */
		kref_put(&dentry->d_kref);
	}
	return 0;
}

/* Adds an entry (from a CPIO archive) to KFS.  This will put all the FS
 * metadata in memory, instead of having to reparse the entire archive each time
 * we need to traverse.
 *
 * The other option is to just maintain a LL of {FN, FS}, and O(n) scan it.
 *
 * The path is a complete path, interpreted from the root of the mount point.
 * Directories have a size of 0.  so do symlinks, but we don't handle those yet.
 *
 * If a directory does not exist for a file, this will return an error.  Don't
 * use the -depth flag to find when building the CPIO archive, and this won't be
 * a problem.  (Maybe) */
static int add_kfs_entry(struct super_block *sb, struct cpio_bin_hdr *c_bhdr)
{
	char *path = c_bhdr->c_filename;
	/* Root of the FS, already part of KFS */
	if (!strcmp(path, "."))
		return 0;
	return __add_kfs_entry(sb->s_mount->mnt_root, path, c_bhdr);
}

void parse_cpio_entries(struct super_block *sb, void *cpio_b)
{
	struct cpio_newc_header *c_hdr = (struct cpio_newc_header*)cpio_b;

	char buf[9] = {0};	/* temp space for strol conversions */
	size_t namesize = 0;
	int offset = 0;		/* offset in the cpio archive */
	struct cpio_bin_hdr *c_bhdr = kmalloc(sizeof(*c_bhdr), 0);
	memset(c_bhdr, 0, sizeof(*c_bhdr));

	/* read all files and paths */
	for (; ; c_hdr = (struct cpio_newc_header*)(cpio_b + offset)) {
		offset += sizeof(*c_hdr);
		if (strncmp(c_hdr->c_magic, "070701", 6)) {
			printk("Invalid magic number in CPIO header, aborting.\n");
			return;
		}
		c_bhdr->c_filename = (char*)c_hdr + sizeof(*c_hdr);
		namesize = cpio_strntol(buf, c_hdr->c_namesize, 8);
		printd("Namesize: %d\n", namesize);
		if (!strcmp(c_bhdr->c_filename, "TRAILER!!!"))
			break;
		c_bhdr->c_ino = cpio_strntol(buf, c_hdr->c_ino, 8);
		c_bhdr->c_mode = (int)cpio_strntol(buf, c_hdr->c_mode, 8);
		c_bhdr->c_uid = cpio_strntol(buf, c_hdr->c_uid, 8);
		c_bhdr->c_gid = cpio_strntol(buf, c_hdr->c_gid, 8);
		c_bhdr->c_nlink = (unsigned int)cpio_strntol(buf, c_hdr->c_nlink, 8);
		c_bhdr->c_mtime = cpio_strntol(buf, c_hdr->c_mtime, 8);
		c_bhdr->c_filesize = cpio_strntol(buf, c_hdr->c_filesize, 8);
		c_bhdr->c_dev_maj = cpio_strntol(buf, c_hdr->c_dev_maj, 8);
		c_bhdr->c_dev_min = cpio_strntol(buf, c_hdr->c_dev_min, 8);
		c_bhdr->c_rdev_maj = cpio_strntol(buf, c_hdr->c_rdev_maj, 8);
		c_bhdr->c_rdev_min = cpio_strntol(buf, c_hdr->c_rdev_min, 8);
		printd("File: %s: %d Bytes\n", c_bhdr->c_filename, c_bhdr->c_filesize);
		offset += namesize;
		/* header + name will be padded out to 4-byte alignment */
		offset = ROUNDUP(offset, 4);
		c_bhdr->c_filestart = cpio_b + offset;
		/* make this a function pointer or something */
		if (add_kfs_entry(sb, c_bhdr)) {
			printk("Failed to add an entry to KFS!\n");
			break;
		}
		offset += c_bhdr->c_filesize;
		offset = ROUNDUP(offset, 4);
		//printk("offset is %d bytes\n", offset);
		c_hdr = (struct cpio_newc_header*)(cpio_b + offset);
	}
	kfree(c_bhdr);
}
