diff options
Diffstat (limited to 'fs/nfs/nfs4proc.c')
| -rw-r--r-- | fs/nfs/nfs4proc.c | 22 | 
1 files changed, 14 insertions, 8 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 22a93ae46cd7..18f25ff4bff7 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1980,8 +1980,7 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)  	if (!data->rpc_done) {  		if (data->rpc_status)  			return ERR_PTR(data->rpc_status); -		/* cached opens have already been processed */ -		goto update; +		return nfs4_try_open_cached(data);  	}  	ret = nfs_refresh_inode(inode, &data->f_attr); @@ -1990,7 +1989,7 @@ _nfs4_opendata_reclaim_to_nfs4_state(struct nfs4_opendata *data)  	if (data->o_res.delegation_type != 0)  		nfs4_opendata_check_deleg(data, state); -update: +  	if (!update_open_stateid(state, &data->o_res.stateid,  				NULL, data->o_arg.fmode))  		return ERR_PTR(-EAGAIN); @@ -5440,6 +5439,8 @@ static bool nfs4_read_plus_not_supported(struct rpc_task *task,  static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)  { +	if (hdr->res.scratch) +		kfree(hdr->res.scratch);  	if (!nfs4_sequence_done(task, &hdr->res.seq_res))  		return -EAGAIN;  	if (nfs4_read_stateid_changed(task, &hdr->args)) @@ -5453,17 +5454,22 @@ static int nfs4_read_done(struct rpc_task *task, struct nfs_pgio_header *hdr)  }  #if defined CONFIG_NFS_V4_2 && defined CONFIG_NFS_V4_2_READ_PLUS -static void nfs42_read_plus_support(struct nfs_pgio_header *hdr, +static bool nfs42_read_plus_support(struct nfs_pgio_header *hdr,  				    struct rpc_message *msg)  {  	/* Note: We don't use READ_PLUS with pNFS yet */ -	if (nfs_server_capable(hdr->inode, NFS_CAP_READ_PLUS) && !hdr->ds_clp) +	if (nfs_server_capable(hdr->inode, NFS_CAP_READ_PLUS) && !hdr->ds_clp) {  		msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ_PLUS]; +		hdr->res.scratch = kmalloc(32, GFP_KERNEL); +		return hdr->res.scratch != NULL; +	} +	return false;  }  #else -static void nfs42_read_plus_support(struct nfs_pgio_header *hdr, +static bool nfs42_read_plus_support(struct nfs_pgio_header *hdr,  				    struct rpc_message *msg)  { +	return false;  }  #endif /* CONFIG_NFS_V4_2 */ @@ -5473,8 +5479,8 @@ static void nfs4_proc_read_setup(struct nfs_pgio_header *hdr,  	hdr->timestamp   = jiffies;  	if (!hdr->pgio_done_cb)  		hdr->pgio_done_cb = nfs4_read_done_cb; -	msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ]; -	nfs42_read_plus_support(hdr, msg); +	if (!nfs42_read_plus_support(hdr, msg)) +		msg->rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_READ];  	nfs4_init_sequence(&hdr->args.seq_args, &hdr->res.seq_res, 0, 0);  }  |