DEVEL15-linux-new-aop-20081108
[openafs.git] / src / afs / LINUX / osi_vnodeops.c
index 7a5a26e..bb86670 100644 (file)
@@ -57,6 +57,7 @@ extern struct backing_dev_info afs_backing_dev_info;
 #endif
 
 extern struct vcache *afs_globalVp;
+extern int afs_notify_change(struct dentry *dp, struct iattr *iattrp);
 #if defined(AFS_LINUX26_ENV)
 /* Some uses of BKL are perhaps not needed for bypass or memcache--
  * why don't we try it out? */
@@ -2076,7 +2077,7 @@ afs_linux_permission(struct inode *ip, int mode)
     return -code;
 }
 
-#if defined(AFS_LINUX24_ENV)
+#if defined(AFS_LINUX24_ENV) && !defined(HAVE_WRITE_BEGIN)
 static int
 afs_linux_commit_write(struct file *file, struct page *page, unsigned offset,
                       unsigned to)
@@ -2103,10 +2104,40 @@ afs_linux_prepare_write(struct file *file, struct page *page, unsigned from,
 #endif
     return 0;
 }
+#endif
 
-extern int afs_notify_change(struct dentry *dp, struct iattr *iattrp);
+#if defined(HAVE_WRITE_BEGIN)
+static int
+afs_linux_write_end(struct file *file, struct address_space *mapping,
+                                loff_t pos, unsigned len, unsigned copied,
+                                struct page *page, void *fsdata)
+{
+    int code;
+    pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+    unsigned from = pos & (PAGE_CACHE_SIZE - 1);
+
+    code = afs_linux_writepage_sync(file->f_dentry->d_inode, page,
+                                    from, copied);
+    unlock_page(page);
+    page_cache_release(page);
+    return code;
+}
+
+static int
+afs_linux_write_begin(struct file *file, struct address_space *mapping,
+                                loff_t pos, unsigned len, unsigned flags,
+                                struct page **pagep, void **fsdata)
+{
+    struct page *page;
+    pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+    page = __grab_cache_page(mapping, index);
+    *pagep = page;
+
+    return 0;
+}
 #endif
 
+
 static struct inode_operations afs_file_iops = {
 #if defined(AFS_LINUX26_ENV)
   .permission =                afs_linux_permission,
@@ -2131,8 +2162,13 @@ static struct address_space_operations afs_file_aops = {
   .readpages =         afs_linux_readpages,
 #endif  
   .writepage =         afs_linux_writepage,
-  .commit_write =      afs_linux_commit_write,
-  .prepare_write =     afs_linux_prepare_write,
+#if defined (HAVE_WRITE_BEGIN)
+  .write_begin =        afs_linux_write_begin,
+  .write_end =          afs_linux_write_end,
+#else
+  .commit_write =       afs_linux_commit_write,
+  .prepare_write =      afs_linux_prepare_write,
+#endif
 };
 #endif