Primitive path_lookup()
[akaros.git] / kern / include / vfs.h
index 7d8348f..5abbe97 100644 (file)
 #include <arch/bitmask.h>
 #include <atomic.h>
 #include <timing.h>
 #include <arch/bitmask.h>
 #include <atomic.h>
 #include <timing.h>
-#include <page_alloc.h>
-#include <mm.h>
 #include <radix.h>
 
 #include <radix.h>
 
+/* ghetto preprocessor hacks (since proc includes vfs) */
+struct page;
+struct vm_region;
+
 // TODO: temp typedefs, etc.  remove when we support this stuff.
 typedef int dev_t;
 typedef int kdev_t;
 // TODO: temp typedefs, etc.  remove when we support this stuff.
 typedef int dev_t;
 typedef int kdev_t;
@@ -83,8 +85,11 @@ struct qstr {
 /* Helpful structure to pass around during lookup operations.  At each point,
  * it tracks the the answer, the name of the previous, how deep the symlink
  * following has gone, and the symlink pathnames.  *dentry and *mnt up the
 /* Helpful structure to pass around during lookup operations.  At each point,
  * it tracks the the answer, the name of the previous, how deep the symlink
  * following has gone, and the symlink pathnames.  *dentry and *mnt up the
- * refcnt of those objects too, so whoever receives this will need to decref.
- * We'll see how this works out... */
+ * refcnt of those objects too, so whoever 'receives; this will need to decref.
+ * This is meant to be pinning only the 'answer' to a path_lookup, and not the
+ * intermediate steps.  The intermediates get pinned due to the existence of
+ * their children in memory.  Internally, the VFS will refcnt any item whenever
+ * it is in this struct. */
 #define MAX_SYMLINK_DEPTH 6 // arbitrary.
 struct nameidata {
        struct dentry                           *dentry;                /* dentry of the obj */
 #define MAX_SYMLINK_DEPTH 6 // arbitrary.
 struct nameidata {
        struct dentry                           *dentry;                /* dentry of the obj */
@@ -97,6 +102,15 @@ struct nameidata {
        int                                                     intent;                 /* access type for the file */
 };
 
        int                                                     intent;                 /* access type for the file */
 };
 
+/* nameidata lookup flags and access type fields */
+#define LOOKUP_FOLLOW          0x01    /* if the last is a symlink, follow */
+#define LOOKUP_DIRECTORY       0x02    /* last component must be a directory */
+#define LOOKUP_CONTINUE        0x04    /* still filenames to go */
+#define LOOKUP_PARENT          0x08    /* lookup the dir that includes the item */
+#define LOOKUP_OPEN            0x10    /* intent is to open a file */
+#define LOOKUP_CREATE          0x11    /* create a file if it doesn't exist */
+#define LOOKUP_ACCESS          0x12    /* access / check user permissions */
+
 /* Every object that has pages, like an inode or the swap (or even direct block
  * devices) has a page_map, tracking which of its pages are currently in memory.
  * It is a map, per object, from index to physical page frame. */
 /* Every object that has pages, like an inode or the swap (or even direct block
  * devices) has a page_map, tracking which of its pages are currently in memory.
  * It is a map, per object, from index to physical page frame. */
@@ -183,7 +197,8 @@ struct inode {
        struct dentry_tailq                     i_dentry;               /* all dentries pointing here*/
        unsigned long                           i_ino;
        atomic_t                                        i_refcnt;
        struct dentry_tailq                     i_dentry;               /* all dentries pointing here*/
        unsigned long                           i_ino;
        atomic_t                                        i_refcnt;
-       int                                                     i_mode;
+       int                                                     i_mode;                 /* access mode */
+       unsigned short                          i_type;                 /* file type */
        unsigned int                            i_nlink;                /* hard links */
        uid_t                                           i_uid;
        gid_t                                           i_gid;
        unsigned int                            i_nlink;                /* hard links */
        uid_t                                           i_uid;
        gid_t                                           i_gid;
@@ -207,7 +222,7 @@ struct inode {
        };
        unsigned long                           i_state;
        unsigned long                           dirtied_when;   /* in jiffies */
        };
        unsigned long                           i_state;
        unsigned long                           dirtied_when;   /* in jiffies */
-       unsigned int                            i_flags;                /* filesystem flags */
+       unsigned int                            i_flags;                /* filesystem mount flags */
        bool                                            i_socket;
        atomic_t                                        i_writecount;   /* number of writers */
        void                                            *i_fs_info;
        bool                                            i_socket;
        atomic_t                                        i_writecount;   /* number of writers */
        void                                            *i_fs_info;
@@ -366,7 +381,6 @@ struct small_fd_set {
 
 /* All open files for a process */
 struct files_struct {
 
 /* All open files for a process */
 struct files_struct {
-       atomic_t                                        refcnt;
        spinlock_t                                      lock;
        int                                                     max_files;              /* max files ptd to by fd */
        int                                                     max_fdset;              /* max of the current fd_set */
        spinlock_t                                      lock;
        int                                                     max_files;              /* max files ptd to by fd */
        int                                                     max_fdset;              /* max of the current fd_set */
@@ -379,7 +393,6 @@ struct files_struct {
 
 /* Process specific filesysten info */
 struct fs_struct {
 
 /* Process specific filesysten info */
 struct fs_struct {
-       atomic_t                                        refcnt;
        spinlock_t                                      lock;
        int                                                     umask;
        struct dentry                           *root;
        spinlock_t                                      lock;
        int                                                     umask;
        struct dentry                           *root;
@@ -412,6 +425,8 @@ extern struct kmem_cache *file_kcache;
 /* Misc VFS functions */
 void vfs_init(void);
 void qstr_builder(struct dentry *dentry, char *l_name);
 /* Misc VFS functions */
 void vfs_init(void);
 void qstr_builder(struct dentry *dentry, char *l_name);
+int path_lookup(char *path, int flags, struct nameidata *nd);
+void path_release(struct nameidata *nd);
 
 /* Superblock functions */
 struct super_block *get_sb(void);
 
 /* Superblock functions */
 struct super_block *get_sb(void);
@@ -424,9 +439,14 @@ struct dentry *get_dentry(struct super_block *sb, struct dentry *parent,
                           char *name);
 void dcache_put(struct dentry *dentry);
 
                           char *name);
 void dcache_put(struct dentry *dentry);
 
+/* Inode Functions */
+int check_perms(struct inode *inode, int access_mode);
+
 /* File functions */
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
                           off_t *offset);
 /* File functions */
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
                           off_t *offset);
+ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
+                           off_t *offset);
 
 /* Page cache functions */
 struct page *pm_find_page(struct page_map *pm, unsigned long index);
 
 /* Page cache functions */
 struct page *pm_find_page(struct page_map *pm, unsigned long index);
@@ -434,4 +454,9 @@ int pm_insert_page(struct page_map *pm, unsigned long index, struct page *page);
 int pm_remove_page(struct page_map *pm, struct page *page);
 int file_load_page(struct file *file, unsigned long index, struct page **pp);
 
 int pm_remove_page(struct page_map *pm, struct page *page);
 int file_load_page(struct file *file, unsigned long index, struct page **pp);
 
+/* 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);
+
 #endif /* ROS_KERN_VFS_H */
 #endif /* ROS_KERN_VFS_H */