NFSv4: Use the nfs4_state being recovered in _nfs4_opendata_to_nfs4_state()
If we're recovering a nfs4_state, then we should try to use that instead of looking up a new stateid. Only do that if the inodes match, though. Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
This commit is contained in:
		
							parent
							
								
									4e2fcac773
								
							
						
					
					
						commit
						75e8c48b9e
					
				| @ -1681,12 +1681,30 @@ nfs4_opendata_get_inode(struct nfs4_opendata *data) | ||||
| 	return inode; | ||||
| } | ||||
| 
 | ||||
| static struct nfs4_state * | ||||
| nfs4_opendata_find_nfs4_state(struct nfs4_opendata *data) | ||||
| { | ||||
| 	struct nfs4_state *state; | ||||
| 	struct inode *inode; | ||||
| 
 | ||||
| 	inode = nfs4_opendata_get_inode(data); | ||||
| 	if (IS_ERR(inode)) | ||||
| 		return ERR_CAST(inode); | ||||
| 	if (data->state != NULL && data->state->inode == inode) { | ||||
| 		state = data->state; | ||||
| 		atomic_inc(&state->count); | ||||
| 	} else | ||||
| 		state = nfs4_get_open_state(inode, data->owner); | ||||
| 	iput(inode); | ||||
| 	if (state == NULL) | ||||
| 		state = ERR_PTR(-ENOMEM); | ||||
| 	return state; | ||||
| } | ||||
| 
 | ||||
| static struct nfs4_state * | ||||
| _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) | ||||
| { | ||||
| 	struct inode *inode; | ||||
| 	struct nfs4_state *state = NULL; | ||||
| 	int ret; | ||||
| 	struct nfs4_state *state; | ||||
| 
 | ||||
| 	if (!data->rpc_done) { | ||||
| 		state = nfs4_try_open_cached(data); | ||||
| @ -1694,26 +1712,17 @@ _nfs4_opendata_to_nfs4_state(struct nfs4_opendata *data) | ||||
| 		goto out; | ||||
| 	} | ||||
| 
 | ||||
| 	inode = nfs4_opendata_get_inode(data); | ||||
| 	ret = PTR_ERR(inode); | ||||
| 	if (IS_ERR(inode)) | ||||
| 		goto err; | ||||
| 	ret = -ENOMEM; | ||||
| 	state = nfs4_get_open_state(inode, data->owner); | ||||
| 	if (state == NULL) | ||||
| 		goto err_put_inode; | ||||
| 	state = nfs4_opendata_find_nfs4_state(data); | ||||
| 	if (IS_ERR(state)) | ||||
| 		goto out; | ||||
| 
 | ||||
| 	if (data->o_res.delegation_type != 0) | ||||
| 		nfs4_opendata_check_deleg(data, state); | ||||
| 	update_open_stateid(state, &data->o_res.stateid, NULL, | ||||
| 			data->o_arg.fmode); | ||||
| 	iput(inode); | ||||
| out: | ||||
| 	nfs_release_seqid(data->o_arg.seqid); | ||||
| 	return state; | ||||
| err_put_inode: | ||||
| 	iput(inode); | ||||
| err: | ||||
| 	return ERR_PTR(ret); | ||||
| } | ||||
| 
 | ||||
| static struct nfs4_state * | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user