Changed readpage() to not require a file
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 28 Sep 2010 20:41:31 +0000 (13:41 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:54 +0000 (17:35 -0700)
It's just about the page mapping, not about a file.

kern/include/kfs.h
kern/include/vfs.h
kern/src/ext2fs.c
kern/src/kfs.c
kern/src/vfs.c

index 7921437..75bf3a0 100644 (file)
@@ -29,7 +29,7 @@ struct super_block *kfs_get_sb(struct fs_type *fs, int flags,
                                char *dev_name, struct vfsmount *vmnt);
 void kfs_kill_sb(struct super_block *sb);
 /* Page Map Operations */
-int kfs_readpage(struct file *file, struct page *page);
+int kfs_readpage(struct page_map *pm, struct page *page);
 /* Super Operations */
 struct inode *kfs_alloc_inode(struct super_block *sb);
 void kfs_dealloc_inode(struct inode *inode);
index 16699cf..fd138fe 100644 (file)
@@ -125,7 +125,7 @@ struct page_map {
  * get assigned when the inode is created.
  * Will fill these in as they are created/needed/used. */
 struct page_map_operations {
-       int (*readpage) (struct file *, struct page *); /* read from backing store*/
+       int (*readpage) (struct page_map *, struct page *);
 /*     readpages: read a list of pages
        writepage: write from a page to its backing store
        writepages: write a list of pages
index ba092b1..83c402a 100644 (file)
@@ -321,7 +321,7 @@ struct fs_type ext2_fs_type = {"EXT2", 0, ext2_get_sb, ext2_kill_sb, {0, 0},
 /* Fills page with its contents from its backing store file.  Note that we do
  * the zero padding here, instead of higher in the VFS.  Might change in the
  * future. */
-int ext2_readpage(struct file *file, struct page *page)
+int ext2_readpage(struct page_map *pm, struct page *page)
 {
        I_AM_HERE;
        #if 0
index 9c7e3e1..3709246 100644 (file)
@@ -119,11 +119,11 @@ struct fs_type kfs_fs_type = {"KFS", 0, kfs_get_sb, kfs_kill_sb, {0, 0},
 /* Fills page with its contents from its backing store file.  Note that we do
  * the zero padding here, instead of higher in the VFS.  Might change in the
  * future. */
-int kfs_readpage(struct file *file, struct page *page)
+int kfs_readpage(struct page_map *pm, struct page *page)
 {
        size_t pg_idx_byte = page->pg_index * PGSIZE;
        struct kfs_i_info *k_i_info = (struct kfs_i_info*)
-                                     file->f_dentry->d_inode->i_fs_info;
+                                     pm->pm_host->i_fs_info;
        uintptr_t begin = (size_t)k_i_info->filestart + pg_idx_byte;
        /* If we're beyond the initial start point, we just need a zero page.  This
         * is for a hole or for extending a file (even though it won't be saved).
@@ -146,7 +146,7 @@ int kfs_readpage(struct file *file, struct page *page)
        bh->bh_buffer = page2kva(page);
        bh->bh_flags = 0;                                                               /* whatever... */
        bh->bh_next = 0;                                                                /* only one BH needed */
-       bh->bh_bdev = file->f_dentry->d_sb->s_bdev;             /* uncounted */
+       bh->bh_bdev = pm->pm_host->i_sb->s_bdev;                /* uncounted */
        bh->bh_blocknum = page->pg_index;
        bh->bh_numblock = 1;
        page->pg_private = bh;
index a040caa..7fc7493 100644 (file)
@@ -1818,7 +1818,7 @@ int file_load_page(struct file *file, unsigned long index, struct page **pp)
        }
        /* if we're here, the page is locked by us, and it needs to be read in */
        assert(page->pg_mapping == pm);
-       error = pm->pm_op->readpage(file, page);
+       error = pm->pm_op->readpage(pm, page);
        assert(!error);
        /* Try to sleep on the IO.  The page will be unlocked when the IO is done */
        lock_page(page);