
From: Hugh Dickins <hugh@veritas.com>

generic_file_aio_write_nolock has recently been corrected for when partial
writes hit -EFAULT: now bring shmem_file_write into line.



 25-akpm/mm/shmem.c |   28 +++++++++++++++-------------
 1 files changed, 15 insertions(+), 13 deletions(-)

diff -puN mm/shmem.c~tmpfs-01-shmem_file_write-EFAULT mm/shmem.c
--- 25/mm/shmem.c~tmpfs-01-shmem_file_write-EFAULT	Tue Jun 10 13:00:07 2003
+++ 25-akpm/mm/shmem.c	Tue Jun 10 13:00:08 2003
@@ -1186,30 +1186,32 @@ shmem_file_write(struct file *file, cons
 			left = __copy_from_user(kaddr + offset, buf, bytes);
 			kunmap(page);
 		}
+
+		written += bytes;
+		count -= bytes;
+		pos += bytes;
+		buf += bytes;
+		if (pos > inode->i_size)
+			inode->i_size = pos;
+
 		flush_dcache_page(page);
+		set_page_dirty(page);
+		if (!PageReferenced(page))
+			SetPageReferenced(page);
+		page_cache_release(page);
+
 		if (left) {
-			page_cache_release(page);
+			pos -= left;
+			written -= left;
 			err = -EFAULT;
 			break;
 		}
 
-		if (!PageReferenced(page))
-			SetPageReferenced(page);
-		set_page_dirty(page);
-		page_cache_release(page);
-
 		/*
 		 * Our dirty pages are not counted in nr_dirty,
 		 * and we do not attempt to balance dirty pages.
 		 */
 
-		written += bytes;
-		count -= bytes;
-		pos += bytes;
-		buf += bytes;
-		if (pos > inode->i_size)
-			inode->i_size = pos;
-
 		cond_resched();
 	} while (count);
 

_
