Merge git://git.linux-nfs.org/pub/linux/nfs-2.6
* git://git.linux-nfs.org/pub/linux/nfs-2.6: SUNRPC xptrdma: simplify build configuration NFS: Fix a potential file corruption issue when writing
This commit is contained in:
@@ -1778,12 +1778,9 @@ config SUNRPC_GSS
|
||||
tristate
|
||||
|
||||
config SUNRPC_XPRT_RDMA
|
||||
tristate "RDMA transport for sunrpc (EXPERIMENTAL)"
|
||||
tristate
|
||||
depends on SUNRPC && INFINIBAND && EXPERIMENTAL
|
||||
default m
|
||||
help
|
||||
Adds a client RPC transport for supporting kernel NFS over RDMA
|
||||
mounts, including Infiniband and iWARP. Experimental.
|
||||
default SUNRPC && INFINIBAND
|
||||
|
||||
config SUNRPC_BIND34
|
||||
bool "Support for rpcbind versions 3 & 4 (EXPERIMENTAL)"
|
||||
|
@@ -696,6 +696,17 @@ int nfs_flush_incompatible(struct file *file, struct page *page)
|
||||
return status;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the page cache is marked as unsafe or invalid, then we can't rely on
|
||||
* the PageUptodate() flag. In this case, we will need to turn off
|
||||
* write optimisations that depend on the page contents being correct.
|
||||
*/
|
||||
static int nfs_write_pageuptodate(struct page *page, struct inode *inode)
|
||||
{
|
||||
return PageUptodate(page) &&
|
||||
!(NFS_I(inode)->cache_validity & (NFS_INO_REVAL_PAGECACHE|NFS_INO_INVALID_DATA));
|
||||
}
|
||||
|
||||
/*
|
||||
* Update and possibly write a cached page of an NFS file.
|
||||
*
|
||||
@@ -717,10 +728,13 @@ int nfs_updatepage(struct file *file, struct page *page,
|
||||
(long long)(page_offset(page) +offset));
|
||||
|
||||
/* If we're not using byte range locks, and we know the page
|
||||
* is entirely in cache, it may be more efficient to avoid
|
||||
* fragmenting write requests.
|
||||
* is up to date, it may be more efficient to extend the write
|
||||
* to cover the entire page in order to avoid fragmentation
|
||||
* inefficiencies.
|
||||
*/
|
||||
if (PageUptodate(page) && inode->i_flock == NULL && !(file->f_mode & O_SYNC)) {
|
||||
if (nfs_write_pageuptodate(page, inode) &&
|
||||
inode->i_flock == NULL &&
|
||||
!(file->f_mode & O_SYNC)) {
|
||||
count = max(count + offset, nfs_page_length(page));
|
||||
offset = 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user