Add a synth_buf to chan
[akaros.git] / kern / include / vfs.h
index fc33dba..1f8e0ab 100644 (file)
  * Lawyers can sort out the copyrights and whatnot with these interfaces and
  * structures. */
 
-#ifndef ROS_KERN_VFS_H
-#define ROS_KERN_VFS_H
+#pragma once
 
 #include <ros/common.h>
+#include <ros/limits.h>
 #include <sys/queue.h>
 #include <sys/uio.h>
 #include <bitmask.h>
@@ -23,6 +23,7 @@
 #include <hashtable.h>
 #include <pagemap.h>
 #include <blockdev.h>
+#include <fdtap.h>
 
 /* ghetto preprocessor hacks (since proc includes vfs) */
 struct page;
@@ -39,6 +40,13 @@ struct poll_table_struct {int x;};
 
 #include <ros/fs.h>
 
+/* Create flags are those used only during creation, and not saved for later
+ * lookup or use.  Everything other than them is viewable via getfl */
+#define O_CREAT_FLAGS (O_CREAT | O_EXCL | O_NOCTTY | O_TRUNC)
+/* These flags are those you can attempt to set via setfl for the VFS. */
+#define O_FCNTL_SET_FLAGS (O_APPEND | O_ASYNC | O_DIRECT | O_NOATIME |         \
+                           O_NONBLOCK)
+
 struct super_block;
 struct super_operations;
 struct dentry;
@@ -61,7 +69,7 @@ TAILQ_HEAD(file_tailq, file);
 TAILQ_HEAD(io_wb_tailq, io_writeback);
 TAILQ_HEAD(event_poll_tailq, event_poll);
 TAILQ_HEAD(vfsmount_tailq, vfsmount);
-TAILQ_HEAD(fs_type_tailq, fs_type); 
+TAILQ_HEAD(fs_type_tailq, fs_type);
 
 /* Linux's quickstring - saves recomputing the hash and length.  Note the length
  * is the non-null-terminated length, as you'd get from strlen(). (for now) */
@@ -247,6 +255,10 @@ struct dentry {
        void                                            *d_fs_info;
 };
 
+/* Checks is a struct dentry pointer if the root.
+ */
+#define DENTRY_IS_ROOT(d) ((d) == (d)->d_parent)
+
 /* not sure yet if we want to call delete when refcnt == 0 (move it to LRU) or
  * when its time to remove it from the dcache. */
 struct dentry_operations {
@@ -347,8 +359,6 @@ struct pipe_inode_info
 /* Per-process structs */
 #define NR_OPEN_FILES_DEFAULT 32
 #define NR_FILE_DESC_DEFAULT 32
-/* keep this in sync with glibc's fd_setsize */
-#define NR_FILE_DESC_MAX 1024
 
 /* Bitmask for file descriptors, big for when we exceed the initial small.  We
  * could just use the fd_array to check for openness instead of the bitmask,
@@ -372,18 +382,21 @@ struct small_fd_set {
 
 /* Describes an open file.  We need this, since the FD flags are supposed to be
  * per file descriptor, not per file (like the file status flags). */
+struct chan;   /* from 9ns */
 struct file_desc {
        struct file                                     *fd_file;
+       struct chan                                     *fd_chan;
        unsigned int                            fd_flags;
+       struct fd_tap                           *fd_tap;
 };
 
 /* All open files for a process */
-struct files_struct {
+struct fd_table {
        spinlock_t                                      lock;
        bool                                            closed;
        int                                                     max_files;              /* max files ptd to by fd */
        int                                                     max_fdset;              /* max of the current fd_set */
-       int                                                     next_fd;                /* next number available */
+       int                                                     hint_min_fd;    /* <= min available fd */
        struct file_desc                        *fd;                    /* initially pts to fd_array */
        struct fd_set                           *open_fds;              /* init, pts to open_fds_init */
        struct small_fd_set                     open_fds_init;
@@ -421,10 +434,16 @@ extern struct kmem_cache *file_kcache;
 void vfs_init(void);
 void qstr_builder(struct dentry *dentry, char *l_name);
 char *file_name(struct file *file);
+char *dentry_path(struct dentry *dentry, char *path, size_t max_size);
 int path_lookup(char *path, int flags, struct nameidata *nd);
 void path_release(struct nameidata *nd);
 int mount_fs(struct fs_type *fs, char *dev_name, char *path, int flags);
 
+static inline char *file_abs_path(struct file *f, char *path, size_t max_size)
+{
+       return dentry_path(f->f_dentry, path, max_size);
+}
+
 /* Superblock functions */
 struct super_block *get_sb(void);
 void init_sb(struct super_block *sb, struct vfsmount *vmnt,
@@ -444,6 +463,7 @@ struct dentry *dcache_get(struct super_block *sb, struct dentry *what_i_want);
 void dcache_put(struct super_block *sb, struct dentry *key_val);
 struct dentry *dcache_remove(struct super_block *sb, struct dentry *key);
 void dcache_prune(struct super_block *sb, bool negative_only);
+int generic_dentry_hash(struct dentry *dentry, struct qstr *qstr);
 
 /* Inode Functions */
 struct inode *get_inode(struct dentry *dentry);
@@ -480,14 +500,21 @@ int do_rename(char *old_path, char *new_path);
 int do_truncate(struct inode *inode, off64_t len);
 struct file *dentry_open(struct dentry *dentry, int flags);
 void file_release(struct kref *kref);
+ssize_t kread_file(struct file *file, void *buf, size_t sz);
+void *kread_whole_file(struct file *file);
 
 /* Process-related File management functions */
-struct file *get_file_from_fd(struct files_struct *open_files, int fd);
-struct file *put_file_from_fd(struct files_struct *open_files, int file_desc);
-int insert_file(struct files_struct *open_files, struct file *file, int low_fd,
-                bool must);
-void close_all_files(struct files_struct *open_files, bool cloexec);
-void clone_files(struct files_struct *src, struct files_struct *dst);
+void *lookup_fd(struct fd_table *fdt, int fd, bool incref, bool vfs);
+int insert_obj_fdt(struct fd_table *fdt, void *obj, int low_fd, int fd_flags,
+                   bool must_use_low, bool vfs);
+bool close_fd(struct fd_table *fdt, int fd);
+void close_fdt(struct fd_table *open_files, bool cloexec);
+void clone_fdt(struct fd_table *src, struct fd_table *dst);
+
+struct file *get_file_from_fd(struct fd_table *open_files, int fd);
+void put_file_from_fd(struct fd_table *open_files, int file_desc);
+int insert_file(struct fd_table *open_files, struct file *file, int low_fd,
+                bool must, bool cloexec);
 int do_chdir(struct fs_struct *fs_env, char *path);
 int do_fchdir(struct fs_struct *fs_env, struct file *file);
 char *do_getcwd(struct fs_struct *fs_env, char **kfree_this, size_t cwd_l);
@@ -497,9 +524,3 @@ void print_kstat(struct kstat *kstat);
 int ls_dash_r(char *path);
 extern struct inode_operations dummy_i_op;
 extern struct dentry_operations dummy_d_op;
-
-int put_fd(struct files_struct *open_files, int file_desc);
-int get_fd(struct files_struct *open_files, int low_fd);
-int claim_fd(struct files_struct *open_files, int file_desc);
-
-#endif /* ROS_KERN_VFS_H */