From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeff Layton Subject: [PATCH 2/4] nfsd: break out setclientid port parsing into separate routine Date: Wed, 17 Jun 2009 14:15:39 -0400 Message-ID: <1245262541-9362-3-git-send-email-jlayton@redhat.com> References: <1245262541-9362-1-git-send-email-jlayton@redhat.com> Cc: chuck.lever@oracle.com, bfields@fieldses.org To: linux-nfs@vger.kernel.org Return-path: Received: from mx2.redhat.com ([66.187.237.31]:60754 "EHLO mx2.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757513AbZFQSPs (ORCPT ); Wed, 17 Jun 2009 14:15:48 -0400 In-Reply-To: <1245262541-9362-1-git-send-email-jlayton@redhat.com> Sender: linux-nfs-owner@vger.kernel.org List-ID: ...and change the parse_ipv4 routine to be a little more efficient with the stack. Signed-off-by: Jeff Layton --- fs/nfsd/nfs4state.c | 46 ++++++++++++++++++++++++++++++---------------- 1 files changed, 30 insertions(+), 16 deletions(-) diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index edb03d4..6a12219 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -930,15 +930,40 @@ parse_octet(unsigned int *lenp, char **addrp) return n; } +/* + * Parse port out of setclientid callback address + * + * @addrlen: remaining length of address string + * @addr: pointer to first port octet in address string + * @sa: pointer to port field in sockaddr + * + * Parse the port portion of a setclientid callback address. Returns true on + * success and false on failure. + */ +static bool +parse_port(unsigned int addrlen, char *addr, __be16 *port) +{ + int temp = 0, i, shift = 8; + u16 cbport = 0; + + for (i = 2; i > 0; i--) { + temp = parse_octet(&addrlen, &addr); + if (temp < 0) + return 0; + cbport |= (temp << shift); + if (shift > 0) + shift -= 8; + } + *port = htons(cbport); + return 1; +} + /* parse and set the setclientid ipv4 callback address */ static int -parse_ipv4(unsigned int addr_len, char *addr_val, struct sockaddr_in *s4) +parse_ipv4(unsigned int addrlen, char *addr, struct sockaddr_in *s4) { int temp = 0; u32 cbaddr = 0; - u16 cbport = 0; - u32 addrlen = addr_len; - char *addr = addr_val; int i, shift; s4->sin_family = AF_INET; @@ -955,18 +980,7 @@ parse_ipv4(unsigned int addr_len, char *addr_val, struct sockaddr_in *s4) } s4->sin_addr.s_addr = htonl(cbaddr); - /* port */ - shift = 8; - for(i = 2; i > 0 ; i--) { - if ((temp = parse_octet(&addrlen, &addr)) < 0) { - return 0; - } - cbport |= (temp << shift); - if (shift > 0) - shift -= 8; - } - s4->sin_port = htons(cbport); - return 1; + return parse_port(addrlen, addr, &s4->sin_port); } static void -- 1.6.0.6