/* Copyright (c) 2010 The Regents of the University of California
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details.
 *
 * Page mapping: maps an object (inode or block dev) in page size chunks.
 * Analagous to Linux's "struct address space".  While this is closely coupled
 * with the VFS, block devices also use it (hence the separate header and c
 * file). */

#ifndef ROS_KERN_PAGEMAP_H
#define ROS_KERN_PAGEMAP_H

#include <radix.h>
#include <atomic.h>
#include <mm.h>

/* 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. */
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 radix_tree			pm_tree;		/* tracks present pages */
	unsigned long				pm_num_pages;	/* how many pages are present */
	struct page_map_operations	*pm_op;
	spinlock_t					pm_lock;
	struct vmr_tailq			pm_vmrs;
	atomic_t					pm_removal;
};

/* Operations performed on a page_map.  These are usually FS specific, which
 * get assigned when the inode is created.
 * Will fill these in as they are created/needed/used. */
struct page_map_operations {
	int (*readpage) (struct page_map *, struct page *);
	int (*writepage) (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
	sync_page: start the IO of already scheduled ops
	set_page_dirty: mark the given page dirty
	prepare_write: prepare to write (disk backed pages)
	commit_write: complete a write (disk backed pages)
	bmap: get a logical block number from a file block index
	invalidate page: invalidate, part of truncating
	release page: prepare to release 
	direct_io: bypass the page cache */
};

/* Page cache functions */
void pm_init(struct page_map *pm, struct page_map_operations *op, void *host);
int pm_load_page(struct page_map *pm, unsigned long index, struct page **pp);
int pm_load_page_nowait(struct page_map *pm, unsigned long index,
                        struct page **pp);
void pm_put_page(struct page *page);
void pm_add_vmr(struct page_map *pm, struct vm_region *vmr);
void pm_remove_vmr(struct page_map *pm, struct vm_region *vmr);
int pm_remove_contig(struct page_map *pm, unsigned long index,
                     unsigned long nr_pgs);
void print_page_map_info(struct page_map *pm);

#endif /* ROS_KERN_PAGEMAP_H */
