From: Hugh Dickins 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); _