BXE: min->MIN, plus an spatch
[akaros.git] / kern / include / vfs.h
index af1c1db..fcfbef6 100644 (file)
@@ -49,6 +49,7 @@ struct file;
 struct file_operations;
 struct fs_type;
 struct vfsmount;
+struct pipe_inode_info;
 
 /* List def's we need */
 TAILQ_HEAD(sb_tailq, super_block);
@@ -271,7 +272,7 @@ struct file {
        struct kref                                     f_kref;
        unsigned int                            f_flags;                /* O_APPEND, etc */
        int                                                     f_mode;                 /* O_RDONLY, etc */
-       off_t                                           f_pos;                  /* offset / file pointer */
+       off64_t                                         f_pos;                  /* offset / file pointer */
        unsigned int                            f_uid;
        unsigned int                            f_gid;
        int                                                     f_error;
@@ -287,9 +288,9 @@ struct file {
 };
 
 struct file_operations {
-       off_t (*llseek) (struct file *, off_t, int);
-       ssize_t (*read) (struct file *, char *, size_t, off_t *);
-       ssize_t (*write) (struct file *, const char *, size_t, off_t *);
+       int (*llseek) (struct file *, off64_t, off64_t *, int);
+       ssize_t (*read) (struct file *, char *, size_t, off64_t *);
+       ssize_t (*write) (struct file *, const char *, size_t, off64_t *);
        int (*readdir) (struct file *, struct dirent *);
        int (*mmap) (struct file *, struct vm_region *);
        int (*open) (struct inode *, struct file *);
@@ -298,10 +299,11 @@ struct file_operations {
        int (*fsync) (struct file *, struct dentry *, int);
        unsigned int (*poll) (struct file *, struct poll_table_struct *);
        ssize_t (*readv) (struct file *, const struct iovec *, unsigned long,
-                         off_t *);
+                         off64_t *);
        ssize_t (*writev) (struct file *, const struct iovec *, unsigned long,
-                         off_t *);
-       ssize_t (*sendpage) (struct file *, struct page *, int, size_t, off_t, int);
+                         off64_t *);
+       ssize_t (*sendpage) (struct file *, struct page *, int, size_t, off64_t,
+                            int);
        int (*check_flags) (int flags);                         /* most FS's ignore this */
 };
 
@@ -332,11 +334,21 @@ struct vfsmount {
        struct namespace                        *mnt_namespace;
 };
 
+struct pipe_inode_info
+{
+       char                                            *p_buf;
+       size_t                                          p_rd_off;
+       size_t                                          p_wr_off;
+       unsigned int                            p_nr_readers;
+       unsigned int                            p_nr_writers;
+       struct cond_var                         p_cv;
+};
+
 /* 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
+/* this is not in sync with glibc, sysdeps/ros/bits/typesizes.h */
+#define NR_FILE_DESC_MAX (512 * 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,
@@ -368,6 +380,7 @@ struct file_desc {
 /* All open files for a process */
 struct files_struct {
        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 */
@@ -419,6 +432,9 @@ void init_sb(struct super_block *sb, struct vfsmount *vmnt,
              void *d_fs_info);
 
 /* Dentry Functions */
+struct dentry *get_dentry_with_ops(struct super_block *sb,
+                                   struct dentry *parent, char *name,
+                                   struct dentry_operations *d_op);
 struct dentry *get_dentry(struct super_block *sb, struct dentry *parent,
                           char *name);
 void dentry_release(struct kref *kref);
@@ -428,6 +444,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);
@@ -445,33 +462,45 @@ struct inode *icache_remove(struct super_block *sb, unsigned long ino);
 
 /* File-ish functions */
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
-                          off_t *offset);
+                          off64_t *offset);
 ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
-                           off_t *offset);
+                           off64_t *offset);
 ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
-                         off_t *offset);
-struct file* alloc_file();
+                         off64_t *offset);
+struct file *alloc_file(void);
 struct file *do_file_open(char *path, int flags, int mode);
 int do_symlink(char *path, const char *symname, int mode);
 int do_link(char *old_path, char *new_path);
 int do_unlink(char *path);
 int do_access(char *path, int mode);
-int do_chmod(char *path, int mode);
+int do_file_chmod(struct file *file, int mode);
 int do_mkdir(char *path, int mode);
 int do_rmdir(char *path);
+int do_pipe(struct file **pipe_files, int flags);
+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);
 
 /* 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);
+int insert_file(struct files_struct *open_files, struct file *file, int low_fd,
+                bool must, bool cloexec);
 void close_all_files(struct files_struct *open_files, bool cloexec);
 void clone_files(struct files_struct *src, struct files_struct *dst);
 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);
 
 /* Debugging */
+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 cloexec);
+int claim_fd(struct files_struct *open_files, int file_desc);
 
 #endif /* ROS_KERN_VFS_H */