Add the trex ethermedium.
[akaros.git] / kern / src / ext2fs.c
index bac92c4..9a88b42 100644 (file)
@@ -462,7 +462,7 @@ void *ext2_get_ino_metablock(struct inode *inode, unsigned long ino_block)
  * the 2x and 3x walks are jacked up. */
 void ext2_print_ino_blocks(struct inode *inode)
 {
-       printk("Inode %08p, Size: %d, 512B 'blocks': %d\n-------------\n", inode,
+       printk("Inode %p, Size: %d, 512B 'blocks': %d\n-------------\n", inode,
               inode->i_size, inode->i_blocks);
        for (int i = 0; i < inode->i_blocks * (inode->i_sb->s_blocksize / 512); i++)
                printk("# %03d, Block %03d\n", i, ext2_find_inoblock(inode, i));
@@ -521,7 +521,7 @@ void ext2_check_sb(struct ext2_sb *e2sb, struct ext2_block_group *bg,
                sum_blks += le16_to_cpu(bg[i].bg_free_blocks_cnt);
                sum_inodes += le16_to_cpu(bg[i].bg_free_inodes_cnt);
                if (print) {
-                       printk("*** BG %d at %08p\n", i, &bg[i]);
+                       printk("*** BG %d at %p\n", i, &bg[i]);
                        printk("Block bitmap:%8d\n", le32_to_cpu(bg[i].bg_block_bitmap));
                        printk("Inode bitmap:%8d\n", le32_to_cpu(bg[i].bg_inode_bitmap));
                        printk("Inode table: %8d\n", le32_to_cpu(bg[i].bg_inode_table));
@@ -704,7 +704,7 @@ int ext2_readpage(struct page_map *pm, struct page *page)
        struct block_request *breq;
        void *eobh;
 
-       assert(page->pg_flags & PG_BUFFER);
+       atomic_or(&page->pg_flags, PG_BUFFER);
        retval = ext2_mappage(pm, page);
        if (retval)
                return retval;
@@ -715,7 +715,7 @@ int ext2_readpage(struct page_map *pm, struct page *page)
        breq->flags = BREQ_READ;
        breq->callback = generic_breq_done;
        breq->data = 0;
-       sem_init(&breq->sem, 0);
+       sem_init_irqsave(&breq->sem, 0);
        breq->bhs = breq->local_bhs;
        breq->nr_bhs = 0;
        /* Pack the BH pointers in the block request */
@@ -731,7 +731,7 @@ int ext2_readpage(struct page_map *pm, struct page *page)
                } else {
                        memset(bh->bh_buffer, 0, pm->pm_host->i_sb->s_blocksize);
                        bh->bh_flags |= BH_DIRTY;
-                       bh->bh_page->pg_flags |= PG_DIRTY;
+                       atomic_or(&bh->bh_page->pg_flags, PG_DIRTY);
                }
        }
        retval = bdev_submit_request(bdev, breq);
@@ -748,12 +748,17 @@ int ext2_readpage(struct page_map *pm, struct page *page)
        if (eof_off)
                memset(eof_off + page2kva(page), 0, PGSIZE - eof_off);
        /* Now the page is up to date */
-       page->pg_flags |= PG_UPTODATE;
+       atomic_or(&page->pg_flags, PG_UPTODATE);
        /* Useful debugging.  Put one higher up if the page is not getting mapped */
        //print_pageinfo(page);
        return 0;
 }
 
+int ext2_writepage(struct page_map *pm, struct page *page)
+{
+       return -1;
+}
+
 /* Super Operations */
 
 /* Creates and initializes a new inode.  FS specific, yet inode-generic fields
@@ -1083,19 +1088,11 @@ int ext2_create(struct inode *dir, struct dentry *dentry, int mode,
        struct ext2_i_info *e2ii;
        uint32_t dir_block;
        unsigned int our_rec_len;
-       /* TODO: figure out the real time!  (Nanwan's birthday, bitches!) */
-       time_t now = 1242129600;
        struct ext2_dirent *new_dirent;
        /* Set basic inode stuff for files, get a disk inode, etc */
        SET_FTYPE(inode->i_mode, __S_IFREG);
        inode->i_fop = &ext2_f_op_file;
        inode->i_ino = ext2_alloc_diskinode(inode, dir_bg);
-       inode->i_atime.tv_sec = now;
-       inode->i_atime.tv_nsec = 0;
-       inode->i_ctime.tv_sec = now;
-       inode->i_ctime.tv_nsec = 0;
-       inode->i_mtime.tv_sec = now;
-       inode->i_mtime.tv_nsec = 0;
        /* Initialize disk inode (this will be different for short symlinks) */
        disk_inode = ext2_get_diskinode(inode);
        ext2_init_diskinode(disk_inode, inode);
@@ -1308,9 +1305,9 @@ void ext2_d_iput(struct dentry *dentry, struct inode *inode)
 /* Updates the file pointer.  TODO: think about locking, and putting this in the
  * VFS. */
 #include <syscall.h>   /* just for set_errno, may go away later */
-off_t ext2_llseek(struct file *file, off_t offset, int whence)
+int ext2_llseek(struct file *file, off64_t offset, off64_t *ret, int whence)
 {
-       off_t temp_off = 0;
+       off64_t temp_off = 0;
        switch (whence) {
                case SEEK_SET:
                        temp_off = offset;
@@ -1327,7 +1324,8 @@ off_t ext2_llseek(struct file *file, off_t offset, int whence)
                        return -1;
        }
        file->f_pos = temp_off;
-       return temp_off;
+       *ret = temp_off;
+       return 0;
 }
 
 /* Fills in the next directory entry (dirent), starting with d_off.  Like with
@@ -1343,7 +1341,7 @@ int ext2_readdir(struct file *dir, struct dirent *dirent)
        int block = dirent->d_off / dir->f_dentry->d_sb->s_blocksize;
        blk_buf = ext2_get_ino_metablock(dir->f_dentry->d_inode, block);
        assert(blk_buf);
-       off_t f_off = dirent->d_off % dir->f_dentry->d_sb->s_blocksize;
+       off64_t f_off = dirent->d_off % dir->f_dentry->d_sb->s_blocksize;
        /* Copy out the dirent info */
        struct ext2_dirent *e2dir = (struct ext2_dirent*)(blk_buf + f_off);
        dirent->d_ino = le32_to_cpu(e2dir->dir_inode);
@@ -1418,7 +1416,7 @@ unsigned int ext2_poll(struct file *file, struct poll_table_struct *poll_table)
 /* Reads count bytes from a file, starting from (and modifiying) offset, and
  * putting the bytes into buffers described by vector */
 ssize_t ext2_readv(struct file *file, const struct iovec *vector,
-                  unsigned long count, off_t *offset)
+                  unsigned long count, off64_t *offset)
 {
        return -1;
 }
@@ -1426,14 +1424,14 @@ ssize_t ext2_readv(struct file *file, const struct iovec *vector,
 /* Writes count bytes to a file, starting from (and modifiying) offset, and
  * taking the bytes from buffers described by vector */
 ssize_t ext2_writev(struct file *file, const struct iovec *vector,
-                  unsigned long count, off_t *offset)
+                  unsigned long count, off64_t *offset)
 {
        return -1;
 }
 
 /* Write the contents of file to the page.  Will sort the params later */
 ssize_t ext2_sendpage(struct file *file, struct page *page, int offset,
-                     size_t size, off_t pos, int more)
+                     size_t size, off64_t pos, int more)
 {
        return -1;
 }
@@ -1447,6 +1445,7 @@ int ext2_check_flags(int flags)
 /* Redeclaration and initialization of the FS ops structures */
 struct page_map_operations ext2_pm_op = {
        ext2_readpage,
+       ext2_writepage,
 };
 
 struct super_operations ext2_s_op = {