void obdfs_cleanup_pgrqcache(void);
inline void obdfs_pgrq_del(struct obdfs_pgrq *pgrq);
int obdfs_readpage(struct file *file, struct page *page);
+int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to);
+int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to);
int obdfs_writepage(struct page *page);
struct page *obdfs_getpage(struct inode *inode, unsigned long offset,
int create, int locked);
return rc;
} /* obdfs_readpage */
+int obdfs_prepare_write(struct file *file, struct page *page, unsigned from, unsigned to)
+{
+ struct inode *inode = page->mapping->host;
+ obd_off offset = ((obd_off)page->index) << PAGE_SHIFT;
+ int rc;
+ ENTRY;
+
+ /* PDEBUG(page, "READ"); */
+ if (Page_Uptodate(page)) {
+ EXIT;
+ return 0;
+ }
+
+ if ( (from <= offset) && (to >= offset + PAGE_SIZE) ) {
+ EXIT;
+ return 0;
+ }
+
+ rc = obdfs_brw(READ, inode, page, 0);
+ if ( !rc ) {
+ SetPageUptodate(page);
+ /* obd_unlock_page(page); */
+ }
+ /* PDEBUG(page, "READ"); */
+ EXIT;
+ return rc;
+}
+
+
+
+
static kmem_cache_t *obdfs_pgrq_cachep = NULL;
int obdfs_init_pgrqcache(void)
return err;
} /* obdfs_do_writepage */
+
+
/* returns the page unlocked, but with a reference */
int obdfs_writepage(struct page *page)
{
return obdfs_do_writepage(page, 0);
}
+int obdfs_commit_write(struct file *file, struct page *page, unsigned from, unsigned to)
+{
+ int rc;
+ struct inode *inode = page->mapping->host;
+ loff_t pos = ((loff_t)page->index << PAGE_CACHE_SHIFT) + to;
+ rc = obdfs_writepage(page);
+ kunmap(page);
+ if (pos > inode->i_size) {
+ inode->i_size = pos;
+ mark_inode_dirty(inode);
+ }
+ return 0;
+}
+
/*
* This does the "real" work of the write. The generic routine has
ODEBUG(oa);
err = IOPS(inode, destroy)(IID(inode), oa);
obdo_free(oa);
-
+ clear_inode(inode);
if (err) {
printk(__FUNCTION__ ": obd_destroy fails (%d)\n", err);
EXIT;
readpage: obdfs_readpage,
writepage: obdfs_writepage,
sync_page: block_sync_page,
- prepare_write: NULL,
- commit_write: generic_commit_write,
+ prepare_write: obdfs_prepare_write,
+ commit_write: obdfs_commit_write,
bmap: NULL
};