|
@@ -174,8 +174,6 @@ static void nfs_mark_uptodate(struct page *page, unsigned int base, unsigned int
|
|
|
return;
|
|
|
if (count != nfs_page_length(page))
|
|
|
return;
|
|
|
- if (count != PAGE_CACHE_SIZE)
|
|
|
- zero_user_page(page, count, PAGE_CACHE_SIZE - count, KM_USER0);
|
|
|
SetPageUptodate(page);
|
|
|
}
|
|
|
|
|
@@ -627,7 +625,8 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
|
|
|
return ERR_PTR(error);
|
|
|
}
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
- return new;
|
|
|
+ req = new;
|
|
|
+ goto zero_page;
|
|
|
}
|
|
|
spin_unlock(&inode->i_lock);
|
|
|
|
|
@@ -655,13 +654,23 @@ static struct nfs_page * nfs_update_request(struct nfs_open_context* ctx,
|
|
|
if (offset < req->wb_offset) {
|
|
|
req->wb_offset = offset;
|
|
|
req->wb_pgbase = offset;
|
|
|
- req->wb_bytes = rqend - req->wb_offset;
|
|
|
+ req->wb_bytes = max(end, rqend) - req->wb_offset;
|
|
|
+ goto zero_page;
|
|
|
}
|
|
|
|
|
|
if (end > rqend)
|
|
|
req->wb_bytes = end - req->wb_offset;
|
|
|
|
|
|
return req;
|
|
|
+zero_page:
|
|
|
+ /* If this page might potentially be marked as up to date,
|
|
|
+ * then we need to zero any uninitalised data. */
|
|
|
+ if (req->wb_pgbase == 0 && req->wb_bytes != PAGE_CACHE_SIZE
|
|
|
+ && !PageUptodate(req->wb_page))
|
|
|
+ zero_user_page(req->wb_page, req->wb_bytes,
|
|
|
+ PAGE_CACHE_SIZE - req->wb_bytes,
|
|
|
+ KM_USER0);
|
|
|
+ return req;
|
|
|
}
|
|
|
|
|
|
int nfs_flush_incompatible(struct file *file, struct page *page)
|