/* Copyright (c) 2009, 2010 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * KFS (Kernel File System)
 *
 * This is a cheap FS that is based off of a CPIO archive appended to the end of
 * the kernel binary image. */

#pragma once

#include <ros/common.h>
#include <vfs.h>

/* Every FS must extern it's type, and be included in vfs_init() */
extern struct fs_type kfs_fs_type;

/* KFS-specific inode info.  Could use a union, but I want to init filestart to
 * 0 to catch bugs. */
struct kfs_i_info {
	struct dentry_tailq		children;		/* our childrens */
	void					*filestart;		/* or our file location */
	size_t					init_size;		/* file size on the backing store */
};

/* KFS VFS functions.  Exported for use by similar FSs (devices, for now) */
struct super_block *kfs_get_sb(struct fs_type *fs, int flags,
                               char *dev_name, struct vfsmount *vmnt);
void kfs_kill_sb(struct super_block *sb);
/* Page Map Operations */
int kfs_readpage(struct page_map *pm, struct page *page);
/* Super Operations */
struct inode *kfs_alloc_inode(struct super_block *sb);
void kfs_dealloc_inode(struct inode *inode);
void kfs_read_inode(struct inode *inode);
void kfs_dirty_inode(struct inode *inode);
void kfs_write_inode(struct inode *inode, bool wait);
void kfs_put_inode(struct inode *inode);
void kfs_drop_inode(struct inode *inode);
void kfs_delete_inode(struct inode *inode);
void kfs_put_super(struct super_block *sb);
void kfs_write_super(struct super_block *sb);
int kfs_sync_fs(struct super_block *sb, bool wait);
int kfs_remount_fs(struct super_block *sb, int flags, char *data);
void kfs_umount_begin(struct super_block *sb);
/* inode_operations */
int kfs_create(struct inode *dir, struct dentry *dentry, int mode,
               struct nameidata *nd);
struct dentry *kfs_lookup(struct inode *dir, struct dentry *dentry,
                          struct nameidata *nd);
int kfs_link(struct dentry *old_dentry, struct inode *dir,
             struct dentry *new_dentry);
int kfs_unlink(struct inode *dir, struct dentry *dentry);
int kfs_symlink(struct inode *dir, struct dentry *dentry, const char *symname);
int kfs_mkdir(struct inode *dir, struct dentry *dentry, int mode);
int kfs_rmdir(struct inode *dir, struct dentry *dentry);
int kfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev);
int kfs_rename(struct inode *old_dir, struct dentry *old_dentry,
               struct inode *new_dir, struct dentry *new_dentry);
char *kfs_readlink(struct dentry *dentry);
void kfs_truncate(struct inode *inode);
int kfs_permission(struct inode *inode, int mode, struct nameidata *nd);
/* dentry_operations */
int kfs_d_revalidate(struct dentry *dir, struct nameidata *nd);
int kfs_d_compare(struct dentry *dir, struct qstr *name1, struct qstr *name2);
int kfs_d_delete(struct dentry *dentry);
int kfs_d_release(struct dentry *dentry);
void kfs_d_iput(struct dentry *dentry, struct inode *inode);
/* file_operations */
int kfs_llseek(struct file *file, off64_t offset, off64_t *ret, int whence);
int kfs_readdir(struct file *dir, struct dirent *dirent);
int kfs_mmap(struct file *file, struct vm_region *vmr);
int kfs_open(struct inode *inode, struct file *file);
int kfs_flush(struct file *file);
int kfs_release(struct inode *inode, struct file *file);
int kfs_fsync(struct file *file, struct dentry *dentry, int datasync);
unsigned int kfs_poll(struct file *file, struct poll_table_struct *poll_table);
ssize_t kfs_readv(struct file *file, const struct iovec *vector,
                  unsigned long count, off64_t *offset);
ssize_t kfs_writev(struct file *file, const struct iovec *vector,
                  unsigned long count, off64_t *offset);
ssize_t kfs_sendpage(struct file *file, struct page *page, int offset,
                     size_t size, off64_t pos, int more);
int kfs_check_flags(int flags);
