pm: Track the fs_file instead of the inode/blockdev
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 20 Mar 2018 19:53:11 +0000 (15:53 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 30 Apr 2018 18:33:44 +0000 (14:33 -0400)
This is somewhat left over from the VFS removal.  The 9ns devices (ramfs)
were just zeroing memory, so they didn't care.  But we'll eventually need
the actual fs_file.

The PM code needs a much bigger overhaul, but this is the minimum to get
things working.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/pagemap.h
kern/src/pagemap.c

index 460ccbc..0707c56 100644 (file)
 
 /* Need to be careful, due to some ghetto circular references */
 struct page;
-struct inode;
-struct block_device;
 struct chan;
 struct page_map_operations;
 
-/* Every object that has pages, like an inode or the swap (or even direct block
- * devices) has a page_map, tracking which of its pages are currently in memory.
- * It is a map, per object, from index to physical page frame. */
+/* Every object that has pages has a page_map, tracking which of its pages are
+ * currently in memory.  It is a map, per object, from index to physical page
+ * frame. */
 struct page_map {
-       union {
-               struct inode                            *pm_host;       /* inode of the owner, if any */
-               struct block_device                     *pm_bdev;       /* bdev of the owner, if any */
-               struct chan                                     *pm_chan;
-       };
+       struct fs_file                          *pm_file;
        struct radix_tree                       pm_tree;                /* tracks present pages */
        unsigned long                           pm_num_pages;   /* how many pages are present */
        struct page_map_operations      *pm_op;
index 9305962..5662983 100644 (file)
@@ -99,11 +99,11 @@ static void *pm_slot_set_page(void *slot_val, struct page *pg)
                                       ~((1UL << PM_FLAGS_SHIFT) - 1)));
 }
 
-/* Initializes a PM.  Host should be an *inode or a *bdev (doesn't matter).  The
- * reference this stores is uncounted. */
+/* Initializes a PM.  Host should be an fs_file.  The reference this stores is
+ * uncounted. */
 void pm_init(struct page_map *pm, struct page_map_operations *op, void *host)
 {
-       pm->pm_bdev = host;                                             /* note the uncounted ref */
+       pm->pm_file = host;
        radix_tree_init(&pm->pm_tree);
        pm->pm_num_pages = 0;                                   /* no pages in a new pm */
        pm->pm_op = op;