NLM failover - client notification setup
Subsystems (3)
PATCH 3/5 NLM failover - client notification setup
This kernel patch should be paired with nfs-utils user mode changes (in patch 5-4 based on nfs-utils-1.0.8-rc4) that is optional. If changes made in patch 5-4 is not presented in nfs-utils, the rpc.statd will ignore whatever this kernel patch does.
This patch records the ip interface that accepts the lock requests and passes the correct "my_name" (in standard IPV4 dot notation) to user mode statd (instead of system_utsname.nodename). This enables rpc.statd to add the correct taken-over IPv4 address into the 3rd parameter of ha_callout program. Current nfs-utils always resets "my_name" into loopback address (127.0.0.1), regardless the statement made in rpc.statd man page. Check out "man rpc.statd" for details.
fs/lockd/host.c | 4 ++-- fs/lockd/mon.c | 21 +++++++++++++++++---- fs/lockd/svc4proc.c | 8 ++++++-- fs/lockd/svcproc.c | 2 +- include/linux/lockd/lockd.h | 5 +++-- include/linux/lockd/sm_inter.h | 1 + include/linux/sunrpc/svc.h | 5 +++-- net/sunrpc/svcsock.c | 5 +++++ 8 files changed, 38 insertions(+), 13 deletions(-)
include/linux/sunrpc/svc.h +3 -2
@@ -102,6 +102,7 @@ static inline void svc_putu32(struct kve iov->iov_len +=sizeof (u32); } +typedef __u32 svc_addr_t ;/* * The context of a single thread, including the request currently being
@@ -138,8 +139,8 @@ struct svc_rqst {unsigned short rq_secure : 1; /* secure port */ - -__u32 rq_daddr;/* dest addr of request - reply from here */ +svc_addr_t rq_daddr;/* dest addr of request +- reply from here */ void * rq_argp;/* decoded arguments */ void * rq_resp;/* xdr'd results */
include/linux/lockd/lockd.h +3 -2
@@ -39,12 +39,13 @@struct nlm_host {struct nlm_host * h_next;/* linked list (hash table) */ struct sockaddr_in h_addr;/* peer address */ +svc_addr_t h_server;/* server ip for NLM failover */ struct rpc_clnt * h_rpcclnt;/* RPC client to talk to peer */ char h_name[20 ];/* remote hostname */ u32 h_version;/* interface version */ unsigned short h_proto;/* transport proto */ unsigned short h_reclaiming :1 , - h_server :1 ,/* server side, not client side */ + h_notused :1 , h_inuse :1 , h_killed :1 , h_monitored :1 ;
@@ -172,7 +173,7 @@ int nlmclnt_reclaim(struct nlm_host **/ struct nlm_host *nlmclnt_lookup_host (struct sockaddr_in *,int ,int );struct nlm_host *nlmsvc_lookup_host (struct svc_rqst *); -struct nlm_host *nlm_lookup_host (int server,struct sockaddr_in *,int ,int ); +struct nlm_host *nlm_lookup_host (svc_addr_t server,struct sockaddr_in *,int ,int );struct rpc_clnt *nlm_bind_host (struct nlm_host *);void nlm_rebind_host (struct nlm_host *);struct nlm_host *nlm_get_host (struct nlm_host *);
include/linux/lockd/sm_inter.h +1 -0
@@ -25,6 +25,7 @@*/ struct nsm_args {u32 addr;/* remote address */ +u32 serv;/* server ip address */ u32 prog;/* RPC callback info */ u32 vers;u32 proc;
net/sunrpc/svcsock.c +5 -0
@@ -454,6 +454,7 @@ svc_recvfrom(struct svc_rqst *rqstp, strstruct msghdr msg;struct socket *sock;int len, alen; +struct sockaddr_in daddr; rqstp->rq_addrlen =sizeof (rqstp->rq_addr); sock = rqstp->rq_sock->sk_sock;
@@ -474,6 +475,10 @@ svc_recvfrom(struct svc_rqst *rqstp, str alen =sizeof (rqstp->rq_addr); sock->ops->getname (sock, (struct sockaddr *)&rqstp->rq_addr, &alen,1 ); +/* add server ip for nlm lock failover */ + sock->ops->getname (sock, (struct sockaddr *)&daddr, &alen,0 ); + rqstp->rq_daddr = daddr.sin_addr.s_addr; +dprintk ("svc: socket %p recvfrom(%p, %Zu) = %d\n" , rqstp->rq_sock, iov[0 ].iov_base, iov[0 ].iov_len, len);
fs/lockd/svc4proc.c +6 -2
@@ -132,6 +132,10 @@ nlm4svc_proc_lock(struct svc_rqst *rqstp resp->cookie = argp->cookie; +if (argp->reclaim) { +printk ("reclaim arrives before retrieve_args\n" ); + } +/* Don't accept new lock requests during grace period */ if ((nlmsvc_grace_period || (nlm4svc_fo_grace_period (argp))) && !argp->reclaim) {
@@ -140,7 +144,7 @@ nlm4svc_proc_lock(struct svc_rqst *rqstp }/* Obtain client and file */ -if (resp->status =nlm4svc_retrieve_args (rqstp, argp, &host, &file)) +if ((resp->status =nlm4svc_retrieve_args (rqstp, argp, &host, &file)))return rpc_success;#if 0
@@ -463,7 +467,7 @@ nlm4svc_proc_sm_notify(struct svc_rqst * }else {/* If we run on an NFS server, delete all locks held by the client */ -if ((host =nlm_lookup_host (1 , &saddr, prot, vers)) !=NULL ) { +if ((host =nlm_lookup_host (rqstp->rq_daddr, &saddr, prot, vers)) !=NULL ) {nlmsvc_free_host_resources (host);nlm_release_host (host); }
fs/lockd/svcproc.c +1 -1
@@ -491,7 +491,7 @@ nlmsvc_proc_sm_notify(struct svc_rqst *r } }else {/* If we run on an NFS server, delete all locks held by the client */ -if ((host =nlm_lookup_host (1 , &saddr, prot, vers)) !=NULL ) { +if ((host =nlm_lookup_host (rqstp->rq_daddr, &saddr, prot, vers)) !=NULL ) {nlmsvc_free_host_resources (host);nlm_release_host (host); }
fs/lockd/mon.c +17 -4
@@ -47,7 +47,8 @@ nsm_mon_unmon(struct nlm_host *host, u32 } args.addr = host->h_addr.sin_addr.s_addr; - args.proto= (host->h_proto<<1 ) | host->h_server; + args.serv = host->h_server; + args.proto= (host->h_proto<<1 ) | (host->h_server ?1 :0 ); args.prog =NLM_PROGRAM ; args.vers = host->h_version; args.proc =NLMPROC_NSM_NOTIFY ;
@@ -135,6 +136,13 @@ out_err:return clnt; } +/* We want "buffer" in xdr_encode_common() to hold +* either the system_utsname.nodename string (__NEW_UTS_LEN+1) +* or IPv4 dot notation (16 bytes+1) for now. +*/ + +#define XDR_ENCODE_BUF_LEN __NEW_UTS_LEN+1 +/* * XDR functions for NSM. */
@@ -142,7 +150,7 @@ out_err:static u32 *xdr_encode_common (struct rpc_rqst *rqstp,u32 *p,struct nsm_args *argp) { -char buffer[20 ]; +char buffer[XDR_ENCODE_BUF_LEN ];/* * Use the dotted-quad IP address of the remote host as
@@ -151,8 +159,13 @@ xdr_encode_common(struct rpc_rqst *rqstp* so this works alright. */ sprintf (buffer,"%u.%u.%u.%u" ,NIPQUAD (argp->addr)); -if (!(p =xdr_encode_string (p, buffer)) - || !(p =xdr_encode_string (p, system_utsname.nodename))) +if (!(p =xdr_encode_string (p, buffer))) +return ERR_PTR (-EIO ); +if (argp->serv) +sprintf (buffer,"%u.%u.%u.%u" ,NIPQUAD (argp->serv)); +else +sprintf (buffer,"%s" , system_utsname.nodename); +if (!(p =xdr_encode_string (p, buffer)))return ERR_PTR (-EIO ); *p++ =htonl (argp->prog); *p++ =htonl (argp->vers);
fs/lockd/host.c +2 -2
@@ -51,7 +51,7 @@ nlmclnt_lookup_host(struct sockaddr_in *struct nlm_host *nlmsvc_lookup_host (struct svc_rqst *rqstp) { -return nlm_lookup_host (1 , &rqstp->rq_addr, +return nlm_lookup_host (rqstp->rq_daddr, &rqstp->rq_addr, rqstp->rq_prot, rqstp->rq_vers); }
@@ -59,7 +59,7 @@ nlmsvc_lookup_host(struct svc_rqst *rqst* Common host lookup routine for server & client */ struct nlm_host * -nlm_lookup_host (int server,struct sockaddr_in *sin, +nlm_lookup_host (svc_addr_t server,struct sockaddr_in *sin,int proto,int version) {struct nlm_host *host, **hp;
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs