|
@@ -1095,9 +1095,14 @@ repeat:
|
|
|
shmem_recalc_inode(inode);
|
|
|
spin_unlock(&info->lock);
|
|
|
|
|
|
- clear_highpage(page);
|
|
|
- flush_dcache_page(page);
|
|
|
- SetPageUptodate(page);
|
|
|
+ /*
|
|
|
+ * Let SGP_WRITE caller clear ends if write does not fill page
|
|
|
+ */
|
|
|
+ if (sgp != SGP_WRITE) {
|
|
|
+ clear_highpage(page);
|
|
|
+ flush_dcache_page(page);
|
|
|
+ SetPageUptodate(page);
|
|
|
+ }
|
|
|
if (sgp == SGP_DIRTY)
|
|
|
set_page_dirty(page);
|
|
|
}
|
|
@@ -1307,6 +1312,14 @@ shmem_write_end(struct file *file, struct address_space *mapping,
|
|
|
if (pos + copied > inode->i_size)
|
|
|
i_size_write(inode, pos + copied);
|
|
|
|
|
|
+ if (!PageUptodate(page)) {
|
|
|
+ if (copied < PAGE_CACHE_SIZE) {
|
|
|
+ unsigned from = pos & (PAGE_CACHE_SIZE - 1);
|
|
|
+ zero_user_segments(page, 0, from,
|
|
|
+ from + copied, PAGE_CACHE_SIZE);
|
|
|
+ }
|
|
|
+ SetPageUptodate(page);
|
|
|
+ }
|
|
|
set_page_dirty(page);
|
|
|
unlock_page(page);
|
|
|
page_cache_release(page);
|
|
@@ -1768,6 +1781,7 @@ static int shmem_symlink(struct inode *dir, struct dentry *dentry, const char *s
|
|
|
kaddr = kmap_atomic(page);
|
|
|
memcpy(kaddr, symname, len);
|
|
|
kunmap_atomic(kaddr);
|
|
|
+ SetPageUptodate(page);
|
|
|
set_page_dirty(page);
|
|
|
unlock_page(page);
|
|
|
page_cache_release(page);
|