]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
linux mmap anti-deadlock should issue error rather than write returns
authorDerrick Brashear <shadow@dementia.org>
Thu, 21 Jan 2010 21:28:33 +0000 (16:28 -0500)
committerDerrick Brashear <shadow|account-1000005@unknown>
Fri, 22 Jan 2010 22:49:23 +0000 (14:49 -0800)
we are careful to issue errors negative everywhere but here. do so
here also

Change-Id: I2322ffbaf16c91161d0d7aa980d50f56b83ac0a2
Reviewed-on: http://gerrit.openafs.org/1137
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>
src/afs/LINUX/osi_vnodeops.c

index 5edea69b9bb5d23cb3c4c8cb422a028d949167f0..0819dd856616379ca6f96e640c9b9e921890022e 100644 (file)
@@ -50,6 +50,9 @@
 #if defined(AFS_LINUX26_ENV)
 #define UnlockPage(pp) unlock_page(pp)
 extern struct backing_dev_info afs_backing_dev_info;
+#if !defined(WRITEPAGE_ACTIVATE)
+#define WRITEPAGE_ACTIVATE AOP_WRITEPAGE_ACTIVATE
+#endif
 #endif
 
 extern struct vcache *afs_globalVp;
@@ -1628,11 +1631,7 @@ afs_linux_writepage_sync(struct inode *ip, struct page *pp,
        crfree(credp);
        kunmap(pp);
 #ifdef AFS_LINUX26_ENV
-#if defined(WRITEPAGE_ACTIVATE)
        return WRITEPAGE_ACTIVATE;
-#else
-       return AOP_WRITEPAGE_ACTIVATE;
-#endif
 #else
        /* should mark it dirty? */
        return(0); 
@@ -1672,7 +1671,6 @@ afs_linux_writepage_sync(struct inode *ip, struct page *pp,
     return code;
 }
 
-
 static int
 #ifdef AOP_WRITEPAGE_TAKES_WRITEBACK_CONTROL
 afs_linux_writepage(struct page *pp, struct writeback_control *wbc)
@@ -1687,13 +1685,8 @@ afs_linux_writepage(struct page *pp)
     long status;
 
 #if defined(AFS_LINUX26_ENV)
-    if (PageReclaim(pp)) {
-# if defined(WRITEPAGE_ACTIVATE)
+    if (PageReclaim(pp))
        return WRITEPAGE_ACTIVATE;
-# else 
-       return AOP_WRITEPAGE_ACTIVATE;
-# endif
-    }
 #else
     if (PageLaunder(pp)) {
        return(fail_writepage(pp));
@@ -1715,11 +1708,7 @@ afs_linux_writepage(struct page *pp)
     status = afs_linux_writepage_sync(inode, pp, 0, offset);
     SetPageUptodate(pp);
 #if defined(AFS_LINUX26_ENV)
-#if defined(WRITEPAGE_ACTIVATE)
     if ( status != WRITEPAGE_ACTIVATE )
-#else
-    if ( status != AOP_WRITEPAGE_ACTIVATE )
-#endif
 #endif
        UnlockPage(pp);
     if (status == offset)
@@ -1823,6 +1812,8 @@ afs_linux_commit_write(struct file *file, struct page *page, unsigned offset,
 #if !defined(AFS_LINUX26_ENV)
     kunmap(page);
 #endif
+    if (code == WRITEPAGE_ACTIVATE)
+       code = -EIO;
 
     return code;
 }
@@ -1851,9 +1842,11 @@ afs_linux_write_end(struct file *file, struct address_space *mapping,
     unsigned from = pos & (PAGE_CACHE_SIZE - 1);
 
     code = afs_linux_writepage_sync(file->f_dentry->d_inode, page,
-                                    from, copied);
+                                   from, copied);
     unlock_page(page);
     page_cache_release(page);
+    if (code == WRITEPAGE_ACTIVATE)
+       code = -EIO;
     return code;
 }