this patch adds writepage() support to file aops().  mmap() uses this
and i only had it partly working before.  after this patch this i can
actually build emacs in afs space once again.

just comparing the afs code to the other filesystems code, it looks
like afs_linux_updatepage() should really be called
afs_linux_writepage_sync() [and have the the sync arg dropped since 
it isnt used]  this would make things a bit clearer for future developers.
kunmap() shoud be probably moved to there as well and placed inside
the lock/unlock kernel.

comments?

Index: src/afs/LINUX/osi_vnodeops.c
===================================================================
RCS file: /afs/cmf/users/chas/cvsroot/openafs/src/afs/LINUX/osi_vnodeops.c,v
retrieving revision 1.3
retrieving revision 1.5
diff -u -u -r1.3 -r1.5
--- osi_vnodeops.c      2000/11/03 04:31:53     1.3
+++ osi_vnodeops.c      2000/11/10 16:29:36     1.5
@@ -1155,10 +1155,35 @@
     return -code;
 }
 
-#ifdef NOTUSED
-/* afs_linux_writepage - is this used anywhere?  swap files via nfs? */
-int afs_linux_writepage(struct inode *ip, struct page *) { return -EINVAL };
+#if defined(AFS_LINUX24_ENV)
+int afs_linux_writepage(struct file *file, struct page *page)
+{
+
+       struct dentry *dentry = file->f_dentry;
+        struct inode *inode = dentry->d_inode;
+        unsigned long end_index = inode->i_size >> PAGE_CACHE_SHIFT;
+        unsigned offset = PAGE_CACHE_SIZE;
+       long status;
 
+        /* easy case */
+        if (page->index < end_index)
+                goto do_it;
+        /* things got complicated... */
+        offset = inode->i_size & (PAGE_CACHE_SIZE-1);
+        /* OK, are we completely out? */
+        if (page->index >= end_index+1 || !offset)
+                return -EIO;
+do_it:
+        status = afs_linux_updatepage(file, page, 0, offset, 1);
+       kunmap(page);
+       if (status == offset)
+               return 0;
+       else
+               return status;
+}
+#endif
+
+#ifdef NOTUSED
 /* afs_linux_bmap - supports generic_readpage, but we roll our own. */
 int afs_linux_bmap(struct inode *ip, int) { return -EINVAL; }
 
@@ -1286,6 +1311,7 @@
 
 struct address_space_operations afs_file_aops = {
         readpage: afs_linux_readpage,
+       writepage: afs_linux_writepage,
         commit_write: afs_linux_commit_write,
         prepare_write: afs_linux_prepare_write,
 };
_______________________________________________
OpenAFS-devel mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo.cgi/openafs-devel

Reply via email to