NFSv4: Fix up handling of open_to_lock sequence ids

Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
Trond Myklebust
2005-10-18 14:20:15 -07:00
parent faf5f49c2d
commit 06735b3454
3 changed files with 50 additions and 72 deletions

View File

@ -729,22 +729,18 @@ static int encode_lock(struct xdr_stream *xdr, const struct nfs_lockargs *arg)
WRITE64(arg->length);
WRITE32(opargs->new_lock_owner);
if (opargs->new_lock_owner){
struct nfs_open_to_lock *ol = opargs->u.open_lock;
RESERVE_SPACE(40);
WRITE32(ol->open_seqid->sequence->counter);
WRITEMEM(&ol->open_stateid, sizeof(ol->open_stateid));
WRITE32(ol->lock_seqid->sequence->counter);
WRITE64(ol->lock_owner.clientid);
WRITE32(opargs->open_seqid->sequence->counter);
WRITEMEM(opargs->open_stateid->data, sizeof(opargs->open_stateid->data));
WRITE32(opargs->lock_seqid->sequence->counter);
WRITE64(opargs->lock_owner.clientid);
WRITE32(4);
WRITE32(ol->lock_owner.id);
WRITE32(opargs->lock_owner.id);
}
else {
struct nfs_exist_lock *el = opargs->u.exist_lock;
RESERVE_SPACE(20);
WRITEMEM(&el->stateid, sizeof(el->stateid));
WRITE32(el->seqid->sequence->counter);
WRITEMEM(opargs->lock_stateid->data, sizeof(opargs->lock_stateid->data));
WRITE32(opargs->lock_seqid->sequence->counter);
}
return 0;
@ -1535,16 +1531,14 @@ static int nfs4_xdr_enc_lock(struct rpc_rqst *req, uint32_t *p, struct nfs_locka
.nops = 2,
};
struct nfs_lock_opargs *opargs = args->u.lock;
struct nfs_seqid *seqid;
int status;
if (opargs->new_lock_owner)
seqid = opargs->u.open_lock->lock_seqid;
else
seqid = opargs->u.exist_lock->seqid;
status = nfs_wait_on_sequence(seqid, req->rq_task);
status = nfs_wait_on_sequence(opargs->lock_seqid, req->rq_task);
if (status != 0)
goto out;
/* Do we need to do an open_to_lock_owner? */
if (opargs->lock_seqid->sequence->flags & NFS_SEQID_CONFIRMED)
opargs->new_lock_owner = 0;
xdr_init_encode(&xdr, &req->rq_snd_buf, p);
encode_compound_hdr(&xdr, &hdr);
status = encode_putfh(&xdr, args->fh);
@ -2908,8 +2902,8 @@ static int decode_lock(struct xdr_stream *xdr, struct nfs_lockres *res)
status = decode_op_hdr(xdr, OP_LOCK);
if (status == 0) {
READ_BUF(sizeof(nfs4_stateid));
COPYMEM(&res->u.stateid, sizeof(res->u.stateid));
READ_BUF(sizeof(res->u.stateid.data));
COPYMEM(res->u.stateid.data, sizeof(res->u.stateid.data));
} else if (status == -NFS4ERR_DENIED)
return decode_lock_denied(xdr, &res->u.denied);
return status;