From: Chuck Lever Date: Tue, 5 Dec 2006 21:35:11 +0000 (-0500) Subject: SUNRPC: Allocate a private data area for socket-specific rpc_xprt fields X-Git-Tag: v2.6.20-rc1~34^2~412^2~19 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ffc2e518c91942b7ed45fb0ab7deba1ba0c8594a;p=linux-2.6 SUNRPC: Allocate a private data area for socket-specific rpc_xprt fields When setting up a new transport instance, allocate enough memory for an rpc_xprt and a private area. As part of the same memory allocation, it will be easy to find one, given a pointer to the other. Signed-off-by: Chuck Lever Signed-off-by: Trond Myklebust --- diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index ec3462f141..dc4a21f1a1 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c @@ -125,6 +125,10 @@ static inline void xs_pktdump(char *msg, u32 *packet, unsigned int count) } #endif +struct sock_xprt { + struct rpc_xprt xprt; +}; + static void xs_format_peer_addresses(struct rpc_xprt *xprt) { struct sockaddr_in *addr = (struct sockaddr_in *) &xprt->addr; @@ -1343,17 +1347,19 @@ static struct rpc_xprt_ops xs_tcp_ops = { static struct rpc_xprt *xs_setup_xprt(struct sockaddr *addr, size_t addrlen, unsigned int slot_table_size) { struct rpc_xprt *xprt; + struct sock_xprt *new; if (addrlen > sizeof(xprt->addr)) { dprintk("RPC: xs_setup_xprt: address too large\n"); return ERR_PTR(-EBADF); } - xprt = kzalloc(sizeof(struct rpc_xprt), GFP_KERNEL); - if (xprt == NULL) { + new = kzalloc(sizeof(*new), GFP_KERNEL); + if (new == NULL) { dprintk("RPC: xs_setup_xprt: couldn't allocate rpc_xprt\n"); return ERR_PTR(-ENOMEM); } + xprt = &new->xprt; xprt->max_reqs = slot_table_size; xprt->slot = kcalloc(xprt->max_reqs, sizeof(struct rpc_rqst), GFP_KERNEL);