diff options
Diffstat (limited to 'fs/nfs/nfs3proc.c')
| -rw-r--r-- | fs/nfs/nfs3proc.c | 28 | 
1 files changed, 19 insertions, 9 deletions
diff --git a/fs/nfs/nfs3proc.c b/fs/nfs/nfs3proc.c index 9eb2f1a503ab..a46d1d5d16d8 100644 --- a/fs/nfs/nfs3proc.c +++ b/fs/nfs/nfs3proc.c @@ -110,10 +110,15 @@ nfs3_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,  		.rpc_resp	= fattr,  	};  	int	status; +	unsigned short task_flags = 0; + +	/* Is this is an attribute revalidation, subject to softreval? */ +	if (inode && (server->flags & NFS_MOUNT_SOFTREVAL)) +		task_flags |= RPC_TASK_TIMEOUT;  	dprintk("NFS call  getattr\n");  	nfs_fattr_init(fattr); -	status = rpc_call_sync(server->client, &msg, 0); +	status = rpc_call_sync(server->client, &msg, task_flags);  	dprintk("NFS reply getattr: %d\n", status);  	return status;  } @@ -140,23 +145,23 @@ nfs3_proc_setattr(struct dentry *dentry, struct nfs_fattr *fattr,  	nfs_fattr_init(fattr);  	status = rpc_call_sync(NFS_CLIENT(inode), &msg, 0);  	if (status == 0) { +		nfs_setattr_update_inode(inode, sattr, fattr);  		if (NFS_I(inode)->cache_validity & NFS_INO_INVALID_ACL)  			nfs_zap_acl_cache(inode); -		nfs_setattr_update_inode(inode, sattr, fattr);  	}  	dprintk("NFS reply setattr: %d\n", status);  	return status;  }  static int -nfs3_proc_lookup(struct inode *dir, const struct qstr *name, +nfs3_proc_lookup(struct inode *dir, struct dentry *dentry,  		 struct nfs_fh *fhandle, struct nfs_fattr *fattr,  		 struct nfs4_label *label)  {  	struct nfs3_diropargs	arg = {  		.fh		= NFS_FH(dir), -		.name		= name->name, -		.len		= name->len +		.name		= dentry->d_name.name, +		.len		= dentry->d_name.len  	};  	struct nfs3_diropres	res = {  		.fh		= fhandle, @@ -168,20 +173,25 @@ nfs3_proc_lookup(struct inode *dir, const struct qstr *name,  		.rpc_resp	= &res,  	};  	int			status; +	unsigned short task_flags = 0; -	dprintk("NFS call  lookup %s\n", name->name); +	/* Is this is an attribute revalidation, subject to softreval? */ +	if (nfs_lookup_is_soft_revalidate(dentry)) +		task_flags |= RPC_TASK_TIMEOUT; + +	dprintk("NFS call  lookup %pd2\n", dentry);  	res.dir_attr = nfs_alloc_fattr();  	if (res.dir_attr == NULL)  		return -ENOMEM;  	nfs_fattr_init(fattr); -	status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); +	status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);  	nfs_refresh_inode(dir, res.dir_attr);  	if (status >= 0 && !(fattr->valid & NFS_ATTR_FATTR)) {  		msg.rpc_proc = &nfs3_procedures[NFS3PROC_GETATTR];  		msg.rpc_argp = fhandle;  		msg.rpc_resp = fattr; -		status = rpc_call_sync(NFS_CLIENT(dir), &msg, 0); +		status = rpc_call_sync(NFS_CLIENT(dir), &msg, task_flags);  	}  	nfs_free_fattr(res.dir_attr);  	dprintk("NFS reply lookup: %d\n", status); @@ -990,7 +1000,7 @@ const struct nfs_rpc_ops nfs_v3_clientops = {  	.nlmclnt_ops	= &nlmclnt_fl_close_lock_ops,  	.getroot	= nfs3_proc_get_root,  	.submount	= nfs_submount, -	.try_mount	= nfs_try_mount, +	.try_get_tree	= nfs_try_get_tree,  	.getattr	= nfs3_proc_getattr,  	.setattr	= nfs3_proc_setattr,  	.lookup		= nfs3_proc_lookup,  |