Whamcloud - gitweb
Now it really works again on 2.4.2! Yippeah. (No loop devices though.)
authorbraam <braam>
Fri, 16 Mar 2001 03:16:07 +0000 (03:16 +0000)
committerbraam <braam>
Fri, 16 Mar 2001 03:16:07 +0000 (03:16 +0000)
lustre/include/linux/obdfs.h
lustre/obdfs/rw.c
lustre/obdfs/super.c

index 441ba81..3871800 100644 (file)
@@ -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);
index 7b8a368..90894b3 100644 (file)
@@ -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
index 04853f9..d0d13f6 100644 (file)
@@ -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
 };