/* 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, 0, 0);
}

/* Creates the SB (normally would read in from disc and create).  Passes it's
 * 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;
	/* 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;
	strncpy(string, symname, len);
	string[len] = '\0';		/* symname should be \0d anyway, but just in case */
	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 it's 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 */
			assert(subent->d_name.len <= MAX_FILENAME_SZ);
			strncpy(dirent->d_name, subent->d_name.name, subent->d_name.len +1);
			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;
		strncpy(dirent->d_name, ".", 2);	/* the extra is for the null term */
		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;
		strncpy(dirent->d_name, "..", 3);	/* the extra is for the null term */
		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);
		strncpy(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);
}
