From 96740b8bbea943b6a401546196570b3a63af3bda Mon Sep 17 00:00:00 2001 From: braam Date: Fri, 16 Mar 2001 03:16:07 +0000 Subject: [PATCH] Now it really works again on 2.4.2! Yippeah. (No loop devices though.) --- lustre/include/linux/obdfs.h | 2 ++ lustre/obdfs/rw.c | 47 ++++++++++++++++++++++++++++++++++++++++++++ lustre/obdfs/super.c | 6 +++--- 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/lustre/include/linux/obdfs.h b/lustre/include/linux/obdfs.h index 441ba81..3871800 100644 --- a/lustre/include/linux/obdfs.h +++ b/lustre/include/linux/obdfs.h @@ -185,6 +185,8 @@ int obdfs_init_pgrqcache(void); 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); diff --git a/lustre/obdfs/rw.c b/lustre/obdfs/rw.c index 7b8a368..90894b3 100644 --- a/lustre/obdfs/rw.c +++ b/lustre/obdfs/rw.c @@ -91,6 +91,37 @@ int obdfs_readpage(struct file *file, struct page *page) 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) @@ -329,12 +360,28 @@ int obdfs_do_writepage(struct page *page, int sync) 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 diff --git a/lustre/obdfs/super.c b/lustre/obdfs/super.c index 04853f9..d0d13f6 100644 --- a/lustre/obdfs/super.c +++ b/lustre/obdfs/super.c @@ -411,7 +411,7 @@ static void obdfs_delete_inode(struct inode *inode) 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; @@ -509,8 +509,8 @@ struct address_space_operations obdfs_aops = { 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 }; -- 1.8.3.1