Merge origin/netpush (networking code) (XCC)
[akaros.git] / kern / src / vfs.c
index 3745a0c..c3c3df6 100644 (file)
@@ -1111,16 +1111,16 @@ struct inode *icache_remove(struct super_block *sb, unsigned long ino)
 
 /* File functions */
 
 
 /* File functions */
 
-/* Read count bytes from the file into buf, starting at *offset, which is increased
- * accordingly, returning the number of bytes transfered.  Most filesystems will
- * use this function for their f_op->read.  Note, this uses the page cache.
- * Want to try out page remapping later on... */
+/* Read count bytes from the file into buf, starting at *offset, which is
+ * increased accordingly, returning the number of bytes transfered.  Most
+ * filesystems will use this function for their f_op->read.
+ * Note, this uses the page cache. */
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
 ssize_t generic_file_read(struct file *file, char *buf, size_t count,
-                          off_t *offset)
+                          off64_t *offset)
 {
        struct page *page;
        int error;
 {
        struct page *page;
        int error;
-       off_t page_off;
+       off64_t page_off;
        unsigned long first_idx, last_idx;
        size_t copy_amt;
        char *buf_end;
        unsigned long first_idx, last_idx;
        size_t copy_amt;
        char *buf_end;
@@ -1163,17 +1163,19 @@ ssize_t generic_file_read(struct file *file, char *buf, size_t count,
        return count;
 }
 
        return count;
 }
 
-/* Write count bytes from buf to the file, starting at *offset, which is increased
- * accordingly, returning the number of bytes transfered.  Most filesystems will
- * use this function for their f_op->write.  Note, this uses the page cache.
+/* Write count bytes from buf to the file, starting at *offset, which is
+ * increased accordingly, returning the number of bytes transfered.  Most
+ * filesystems will use this function for their f_op->write.  Note, this uses
+ * the page cache.
+ *
  * Changes don't get flushed to disc til there is an fsync, page cache eviction,
  * or other means of trying to writeback the pages. */
 ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
  * Changes don't get flushed to disc til there is an fsync, page cache eviction,
  * or other means of trying to writeback the pages. */
 ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
-                           off_t *offset)
+                           off64_t *offset)
 {
        struct page *page;
        int error;
 {
        struct page *page;
        int error;
-       off_t page_off;
+       off64_t page_off;
        unsigned long first_idx, last_idx;
        size_t copy_amt;
        const char *buf_end;
        unsigned long first_idx, last_idx;
        size_t copy_amt;
        const char *buf_end;
@@ -1215,7 +1217,7 @@ ssize_t generic_file_write(struct file *file, const char *buf, size_t count,
  * currently expects us to do a readdir (short of doing linux's getdents).  Will
  * probably need work, based on whatever real programs want. */
 ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
  * currently expects us to do a readdir (short of doing linux's getdents).  Will
  * probably need work, based on whatever real programs want. */
 ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
-                         off_t *offset)
+                         off64_t *offset)
 {
        struct kdirent dir_r = {0}, *dirent = &dir_r;
        int retval = 1;
 {
        struct kdirent dir_r = {0}, *dirent = &dir_r;
        int retval = 1;
@@ -1230,7 +1232,9 @@ ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
                return 0;
        /* start readdir from where it left off: */
        dirent->d_off = *offset;
                return 0;
        /* start readdir from where it left off: */
        dirent->d_off = *offset;
-       for (; (u_buf < buf_end) && (retval == 1); u_buf += sizeof(struct kdirent)){
+       for (   ;
+               u_buf + sizeof(struct kdirent) <= buf_end;
+               u_buf += sizeof(struct kdirent)) {
                /* TODO: UMEM/KFOP (pin the u_buf in the syscall, ditch the local copy,
                 * get rid of this memcpy and reliance on current, etc).  Might be
                 * tricky with the dirent->d_off and trust issues */
                /* TODO: UMEM/KFOP (pin the u_buf in the syscall, ditch the local copy,
                 * get rid of this memcpy and reliance on current, etc).  Might be
                 * tricky with the dirent->d_off and trust issues */
@@ -1247,6 +1251,9 @@ ssize_t generic_dir_read(struct file *file, char *u_buf, size_t count,
                        memcpy(u_buf, dirent, sizeof(struct dirent));
                }
                amt_copied += sizeof(struct dirent);
                        memcpy(u_buf, dirent, sizeof(struct dirent));
                }
                amt_copied += sizeof(struct dirent);
+               /* 0 signals end of directory */
+               if (retval == 0)
+                       break;
        }
        /* Next time read is called, we pick up where we left off */
        *offset = dirent->d_off;        /* UMEM */
        }
        /* Next time read is called, we pick up where we left off */
        *offset = dirent->d_off;        /* UMEM */
@@ -1631,7 +1638,7 @@ out_path_only:
        return retval;
 }
 
        return retval;
 }
 
-struct file *alloc_file()
+struct file *alloc_file(void)
 {
        struct file *file = kmem_cache_alloc(file_kcache, 0);
        if (!file) {
 {
        struct file *file = kmem_cache_alloc(file_kcache, 0);
        if (!file) {
@@ -1647,6 +1654,7 @@ struct file *alloc_file()
 struct file *dentry_open(struct dentry *dentry, int flags)
 {
        struct inode *inode;
 struct file *dentry_open(struct dentry *dentry, int flags)
 {
        struct inode *inode;
+       struct file *file;
        int desired_mode;
        inode = dentry->d_inode;
        /* Do the mode first, since we can still error out.  f_mode stores how the
        int desired_mode;
        inode = dentry->d_inode;
        /* Do the mode first, since we can still error out.  f_mode stores how the
@@ -1666,10 +1674,9 @@ struct file *dentry_open(struct dentry *dentry, int flags)
        }
        if (check_perms(inode, desired_mode))
                goto error_access;
        }
        if (check_perms(inode, desired_mode))
                goto error_access;
-       // Check permission before we allocate file struct      
-       struct file *file = alloc_file();
-       if (!file) return 0;
-
+       file = alloc_file();
+       if (!file)
+               return 0;
        file->f_mode = desired_mode;
        /* Add to the list of all files of this SB */
        TAILQ_INSERT_TAIL(&inode->i_sb->s_files, file, f_list);
        file->f_mode = desired_mode;
        /* Add to the list of all files of this SB */
        TAILQ_INSERT_TAIL(&inode->i_sb->s_files, file, f_list);