Fixes elf panic
[akaros.git] / kern / src / kfs.c
index 2373d0a..4584312 100644 (file)
@@ -139,6 +139,7 @@ int kfs_readpage(struct page_map *pm, struct page *page)
        struct buffer_head *bh = kmem_cache_alloc(bh_kcache, 0);
        if (!bh)
                return -1;                      /* untested, un-thought-through */
+       atomic_or(&page->pg_flags, PG_BUFFER);
        /* KFS does a 1:1 BH to page mapping */
        bh->bh_page = page;                                                             /* weak ref */
        bh->bh_buffer = page2kva(page);
@@ -151,10 +152,15 @@ int kfs_readpage(struct page_map *pm, struct page *page)
        /* This is supposed to be done in the IO system when the operation is
         * complete.  Since we aren't doing a real IO request, and it is already
         * done, we can do it here. */
-       page->pg_flags |= PG_UPTODATE;
+       atomic_or(&page->pg_flags, PG_UPTODATE);
        return 0;
 }
 
+int kfs_writepage(struct page_map *pm, struct page *page)
+{
+       return -1;
+}
+
 /* Super Operations */
 
 /* Creates and initializes a new inode.  FS specific, yet inode-generic fields
@@ -173,6 +179,7 @@ struct inode *kfs_alloc_inode(struct super_block *sb)
        inode->i_fs_info = kmem_cache_alloc(kfs_i_kcache, 0);
        TAILQ_INIT(&((struct kfs_i_info*)inode->i_fs_info)->children);
        ((struct kfs_i_info*)inode->i_fs_info)->filestart = 0;
+       ((struct kfs_i_info*)inode->i_fs_info)->init_size = 0;
        return inode;
 }
 
@@ -334,6 +341,8 @@ struct dentry *kfs_lookup(struct inode *dir, struct dentry *dentry,
        struct dentry *d_i;
 
        assert(dir_dent && dir_dent == TAILQ_LAST(&dir->i_dentry, dentry_tailq));
+       /* had this fail when kern/kfs has a symlink go -> ../../../go, though
+        * a symlink like lib2 -> lib work okay. */
        assert(S_ISDIR(dir->i_mode));
        assert(kref_refcnt(&dentry->d_kref) == 1);
        TAILQ_FOREACH(d_i, &dir_dent->d_subdirs, d_subdirs_link) {
@@ -435,7 +444,7 @@ int kfs_rmdir(struct inode *dir, struct dentry *dentry)
        if (!empty)
                return -ENOTEMPTY;
        kref_put(&dentry->d_kref);                              /* unpin the dentry, KFS-style */
-       printk("DENTRY %s REFCNT %d\n", dentry->d_name.name, kref_refcnt(&dentry->d_kref));
+       printd("DENTRY %s REFCNT %d\n", dentry->d_name.name, kref_refcnt(&dentry->d_kref));
        return 0;
 }
 
@@ -685,6 +694,7 @@ int kfs_check_flags(int flags)
 /* Redeclaration and initialization of the FS ops structures */
 struct page_map_operations kfs_pm_op = {
        kfs_readpage,
+       kfs_writepage,
 };
 
 struct super_operations kfs_s_op = {