diff options
Diffstat (limited to 'fs/nfs')
| -rw-r--r-- | fs/nfs/dir.c | 7 | ||||
| -rw-r--r-- | fs/nfs/filelayout/filelayout.c | 8 | 
2 files changed, 14 insertions, 1 deletions
| diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c index ea1ceffa1d3a..f7e4a88d5d92 100644 --- a/fs/nfs/dir.c +++ b/fs/nfs/dir.c @@ -2957,12 +2957,14 @@ static u64 nfs_access_login_time(const struct task_struct *task,  				 const struct cred *cred)  {  	const struct task_struct *parent; +	const struct cred *pcred;  	u64 ret;  	rcu_read_lock();  	for (;;) {  		parent = rcu_dereference(task->real_parent); -		if (parent == task || cred_fscmp(parent->cred, cred) != 0) +		pcred = rcu_dereference(parent->cred); +		if (parent == task || cred_fscmp(pcred, cred) != 0)  			break;  		task = parent;  	} @@ -3023,6 +3025,7 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre  	 * but do it without locking.  	 */  	struct nfs_inode *nfsi = NFS_I(inode); +	u64 login_time = nfs_access_login_time(current, cred);  	struct nfs_access_entry *cache;  	int err = -ECHILD;  	struct list_head *lh; @@ -3037,6 +3040,8 @@ static int nfs_access_get_cached_rcu(struct inode *inode, const struct cred *cre  		cache = NULL;  	if (cache == NULL)  		goto out; +	if ((s64)(login_time - cache->timestamp) > 0) +		goto out;  	if (nfs_check_cache_invalid(inode, NFS_INO_INVALID_ACCESS))  		goto out;  	*mask = cache->mask; diff --git a/fs/nfs/filelayout/filelayout.c b/fs/nfs/filelayout/filelayout.c index ad34a33b0737..4974cd18ca46 100644 --- a/fs/nfs/filelayout/filelayout.c +++ b/fs/nfs/filelayout/filelayout.c @@ -783,6 +783,12 @@ filelayout_alloc_lseg(struct pnfs_layout_hdr *layoutid,  	return &fl->generic_hdr;  } +static bool +filelayout_lseg_is_striped(const struct nfs4_filelayout_segment *flseg) +{ +	return flseg->num_fh > 1; +} +  /*   * filelayout_pg_test(). Called by nfs_can_coalesce_requests()   * @@ -803,6 +809,8 @@ filelayout_pg_test(struct nfs_pageio_descriptor *pgio, struct nfs_page *prev,  	size = pnfs_generic_pg_test(pgio, prev, req);  	if (!size)  		return 0; +	else if (!filelayout_lseg_is_striped(FILELAYOUT_LSEG(pgio->pg_lseg))) +		return size;  	/* see if req and prev are in the same stripe */  	if (prev) { |