Move the seqno information into the request structure. Seems to make more sense there. In particular, if we start using a more complicated data structure for the sequence number then this should make it easier to initialize this structure in the right place (in xprt_request_init). diff -puN include/linux/sunrpc/sched.h~clnt-seqno-to-req include/linux/sunrpc/sched.h --- linux-2.5.72/include/linux/sunrpc/sched.h~clnt-seqno-to-req 2003-06-19 18:38:53.000000000 -0400 +++ linux-2.5.72-bfields/include/linux/sunrpc/sched.h 2003-06-19 18:38:53.000000000 -0400 @@ -48,8 +48,6 @@ struct rpc_task { __u8 tk_garb_retry, tk_cred_retry, tk_suid_retry; - u32 tk_gss_seqno; /* rpcsec_gss sequence number - used on this request */ /* * timeout_fn to be executed by timer bottom half diff -puN include/linux/sunrpc/xprt.h~clnt-seqno-to-req include/linux/sunrpc/xprt.h --- linux-2.5.72/include/linux/sunrpc/xprt.h~clnt-seqno-to-req 2003-06-19 18:38:53.000000000 -0400 +++ linux-2.5.72-bfields/include/linux/sunrpc/xprt.h 2003-06-19 18:38:53.000000000 -0400 @@ -95,6 +95,7 @@ struct rpc_rqst { struct rpc_rqst * rq_next; /* free list */ int rq_cong; /* has incremented xprt->cong */ int rq_received; /* receive completed */ + u32 rq_seqno; /* gss seq no. used on req. */ struct list_head rq_list; diff -puN net/sunrpc/xprt.c~clnt-seqno-to-req net/sunrpc/xprt.c diff -puN net/sunrpc/auth_gss/auth_gss.c~clnt-seqno-to-req net/sunrpc/auth_gss/auth_gss.c --- linux-2.5.72/net/sunrpc/auth_gss/auth_gss.c~clnt-seqno-to-req 2003-06-19 18:38:53.000000000 -0400 +++ linux-2.5.72-bfields/net/sunrpc/auth_gss/auth_gss.c 2003-06-19 18:38:53.000000000 -0400 @@ -623,12 +623,12 @@ gss_marshal(struct rpc_task *task, u32 * goto out_put_ctx; } spin_lock(&ctx->gc_seq_lock); - task->tk_gss_seqno = ctx->gc_seq++; + req->rq_seqno = ctx->gc_seq++; spin_unlock(&ctx->gc_seq_lock); *p++ = htonl((u32) RPC_GSS_VERSION); *p++ = htonl((u32) ctx->gc_proc); - *p++ = htonl((u32) task->tk_gss_seqno); + *p++ = htonl((u32) req->rq_seqno); *p++ = htonl((u32) service); p = xdr_encode_netobj(p, &ctx->gc_wire_ctx); *cred_len = htonl((p - (cred_len + 1)) << 2); @@ -705,7 +705,7 @@ gss_validate(struct rpc_task *task, u32 if (flav != RPC_AUTH_GSS) goto out; - seq = htonl(task->tk_gss_seqno); + seq = htonl(task->tk_rqstp->rq_seqno); iov.iov_base = &seq; iov.iov_len = sizeof(seq); xdr_buf_from_iov(&iov, &verf_buf); @@ -771,7 +771,7 @@ gss_wrap_req(struct rpc_task *task, integ_len = p++; offset = (u8 *)p - (u8 *)snd_buf->head[0].iov_base; - *p++ = htonl(task->tk_gss_seqno); + *p++ = htonl(req->rq_seqno); status = encode(rqstp, p, obj); if (status) @@ -847,7 +847,7 @@ gss_unwrap_resp(struct rpc_task *task, mic_offset = integ_len + data_offset; if (mic_offset > rcv_buf->len) goto out; - if (ntohl(*p++) != task->tk_gss_seqno) + if (ntohl(*p++) != req->rq_seqno) goto out; if (xdr_buf_subsegment(rcv_buf, &integ_buf, data_offset, _