Commit 9154e5fb authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] kNFSd: NFSdV4 fixes for replaying open requests.

From: NeilBrown <neilb@cse.unsw.edu.au>

Since the open op changes the current filehandle, we can't correctly replay
compounds containing opens unless we save the filehandle resulting from the
open as well as the encoded reply.
parent e997763a
...@@ -89,6 +89,12 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o ...@@ -89,6 +89,12 @@ do_open_lookup(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_o
if (!status) { if (!status) {
set_change_info(&open->op_cinfo, current_fh); set_change_info(&open->op_cinfo, current_fh);
fh_dup2(current_fh, &resfh); fh_dup2(current_fh, &resfh);
/* XXXJBF: keep a saved svc_fh struct instead?? */
open->op_stateowner->so_replay.rp_openfh_len =
resfh.fh_handle.fh_size;
memcpy(open->op_stateowner->so_replay.rp_openfh,
&resfh.fh_handle.fh_base,
resfh.fh_handle.fh_size);
accmode = MAY_NOP; accmode = MAY_NOP;
if (open->op_share_access & NFS4_SHARE_ACCESS_READ) if (open->op_share_access & NFS4_SHARE_ACCESS_READ)
...@@ -116,6 +122,19 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open ...@@ -116,6 +122,19 @@ nfsd4_open(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfsd4_open
/* check seqid for replay. set nfs4_owner */ /* check seqid for replay. set nfs4_owner */
status = nfsd4_process_open1(open); status = nfsd4_process_open1(open);
if (status == NFSERR_REPLAY_ME) {
struct nfs4_replay *rp = &open->op_stateowner->so_replay;
fh_put(current_fh);
current_fh->fh_handle.fh_size = rp->rp_openfh_len;
memcpy(&current_fh->fh_handle.fh_base, rp->rp_openfh,
rp->rp_openfh_len);
status = fh_verify(rqstp, current_fh, 0, MAY_NOP);
if (status)
dprintk("nfsd4_open: replay failed"
" restoring previous filehandle\n");
else
status = NFSERR_REPLAY_ME;
}
if (status) if (status)
return status; return status;
/* /*
......
...@@ -1913,6 +1913,7 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open ...@@ -1913,6 +1913,7 @@ nfsd4_encode_open(struct nfsd4_compoundres *resp, int nfserr, struct nfsd4_open
default: default:
BUG(); BUG();
} }
/* XXX save filehandle here */
ENCODE_SEQID_OP_TAIL(open->op_stateowner); ENCODE_SEQID_OP_TAIL(open->op_stateowner);
} }
......
...@@ -113,6 +113,8 @@ struct nfs4_replay { ...@@ -113,6 +113,8 @@ struct nfs4_replay {
unsigned int rp_buflen; unsigned int rp_buflen;
char *rp_buf; char *rp_buf;
unsigned intrp_allocated; unsigned intrp_allocated;
int rp_openfh_len;
char rp_openfh[NFS4_FHSIZE];
char rp_ibuf[NFSD4_REPLAY_ISIZE]; char rp_ibuf[NFSD4_REPLAY_ISIZE];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment