From patchwork Wed Dec 15 05:09:01 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Takuma Umeya X-Patchwork-Id: 412451 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id oBF597Ps015789 for ; Wed, 15 Dec 2010 05:09:07 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750801Ab0LOFJF (ORCPT ); Wed, 15 Dec 2010 00:09:05 -0500 Received: from mx1.redhat.com ([209.132.183.28]:44757 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750800Ab0LOFJD (ORCPT ); Wed, 15 Dec 2010 00:09:03 -0500 Received: from int-mx12.intmail.prod.int.phx2.redhat.com (int-mx12.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by mx1.redhat.com (8.13.8/8.13.8) with ESMTP id oBF5936j020006 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Wed, 15 Dec 2010 00:09:03 -0500 Received: from localhost (tumeya.nrt.redhat.com [10.64.208.13]) by int-mx12.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id oBF5929b027893; Wed, 15 Dec 2010 00:09:02 -0500 Date: Wed, 15 Dec 2010 14:09:01 +0900 From: Takuma Umeya To: linux-nfs@vger.kernel.org Cc: linux-kernel@vger.kernel.org Subject: [PATCH] nfs4: set source address when callback is generated Message-ID: <20101215050901.GB13532@redhat.com> MIME-Version: 1.0 Content-Disposition: inline X-PGP-Key: http://pgpkeys.pca.dfn.de/pks/lookup?search=tumeya&op=get User-Agent: Mutt/1.5.21 (2010-09-15) X-Scanned-By: MIMEDefang 2.68 on 10.5.11.25 Sender: linux-nfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-nfs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter1.kernel.org [140.211.167.41]); Wed, 15 Dec 2010 05:09:07 +0000 (UTC) diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c index 143da2e..bb5de7f 100644 --- a/fs/nfsd/nfs4callback.c +++ b/fs/nfsd/nfs4callback.c @@ -483,6 +483,7 @@ int setup_callback_client(struct nfs4_client *clp, struct nfs4_cb_conn *conn) .net = &init_net, .address = (struct sockaddr *) &conn->cb_addr, .addrsize = conn->cb_addrlen, + .saddress = (struct sockaddr *) &conn->cb_saddr, .timeout = &timeparms, .program = &cb_program, .version = 0, diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 116cab9..c7d3171 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -1177,9 +1177,11 @@ find_unconfirmed_client_by_str(const char *dname, unsigned int hashval, } static void -gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, u32 scopeid) +gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, + u32 scopeid, struct svc_rqst *rqstp) { struct nfs4_cb_conn *conn = &clp->cl_cb_conn; + struct sockaddr s_sa; unsigned short expected_family; /* Currently, we only support tcp and tcp6 for the callback channel */ @@ -1205,6 +1207,19 @@ gen_callback(struct nfs4_client *clp, struct nfsd4_setclientid *se, u32 scopeid) conn->cb_prog = se->se_callback_prog; conn->cb_ident = se->se_callback_ident; + switch(expected_family){ + case AF_INET: + ((struct sockaddr_in *)&s_sa)->sin_family = AF_INET; + ((struct sockaddr_in *)&s_sa)->sin_addr = rqstp-> + rq_daddr.addr; + break; + case AF_INET6: + ((struct sockaddr_in6 *)&s_sa)->sin6_family = AF_INET6; + ((struct sockaddr_in6 *)&s_sa)->sin6_addr = rqstp-> + rq_daddr.addr6; + break; + } + rpc_copy_addr((struct sockaddr *)&conn->cb_saddr, &s_sa); return; out_err: conn->cb_addr.ss_family = AF_UNSPEC; @@ -1876,7 +1891,7 @@ nfsd4_setclientid(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate, * for consistent minorversion use throughout: */ new->cl_minorversion = 0; - gen_callback(new, setclid, rpc_get_scope_id(sa)); + gen_callback(new, setclid, rpc_get_scope_id(sa), rqstp); add_to_unconfirmed(new, strhashval); setclid->se_clientid.cl_boot = new->cl_clientid.cl_boot; setclid->se_clientid.cl_id = new->cl_clientid.cl_id; diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h index 39adc27..0cee03d 100644 --- a/fs/nfsd/state.h +++ b/fs/nfsd/state.h @@ -95,6 +95,7 @@ struct nfs4_delegation { struct nfs4_cb_conn { /* SETCLIENTID info */ struct sockaddr_storage cb_addr; + struct sockaddr_storage cb_saddr; size_t cb_addrlen; u32 cb_prog; /* used only in 4.0 case; per-session otherwise */