Resolve error return issues in writepage
authorSimon Wilkinson <sxw@inf.ed.ac.uk>
Fri, 23 Oct 2009 11:42:19 +0000 (12:42 +0100)
committerDerrick Brashear <shadow|account-1000005@unknown>
Fri, 23 Oct 2009 18:50:35 +0000 (11:50 -0700)
The writepage_sync changes get error returns wrong in a couple of places. In
particular, they return a 0 code from dopartialwrite in preference to the
length return from page_writeback

Change-Id: I34a848fed5f799aa6844e9ef0339321f91c7e59b
Reviewed-on: http://gerrit.openafs.org/721
Reviewed-by: Marc Dionne <marc.c.dionne@gmail.com>
Tested-by: Simon Wilkinson <sxw@inf.ed.ac.uk>
Tested-by: Derrick Brashear <shadow@dementia.org>
Reviewed-by: Derrick Brashear <shadow@dementia.org>

src/afs/LINUX/osi_vnodeops.c

index 7067384..ae26fa2 100644 (file)
@@ -1997,7 +1997,7 @@ afs_linux_prepare_writeback(struct vcache *avc) {
 static inline int
 afs_linux_dopartialwrite(struct vcache *avc, cred_t *credp) {
     struct vrequest treq;
-    int code;
+    int code = 0;
 
     if (!afs_InitReq(&treq, credp))
        code = afs_DoPartialWrite(avc, &treq);
@@ -2058,6 +2058,7 @@ afs_linux_writepage_sync(struct inode *ip, struct page *pp,
                         unsigned long offset, unsigned int count)
 {
     int code;
+    int code1 = 0;
     struct vcache *vcp = VTOAFS(ip);
     cred_t *credp;
 
@@ -2081,14 +2082,17 @@ afs_linux_writepage_sync(struct inode *ip, struct page *pp,
     afs_maybe_lock_kernel();
     AFS_GLOCK();
     ObtainWriteLock(&vcp->lock, 533);
-    if (code == 0)
-       code = afs_linux_dopartialwrite(vcp, credp);
+    if (code > 0)
+       code1 = afs_linux_dopartialwrite(vcp, credp);
     afs_linux_complete_writeback(vcp);
     ReleaseWriteLock(&vcp->lock);
     AFS_GUNLOCK();
     afs_maybe_unlock_kernel();
     crfree(credp);
 
+    if (code1)
+       return code1;
+
     return code;
 }