Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cf712c24 authored by Olaf Kirch's avatar Olaf Kirch Committed by Linus Torvalds
Browse files

[PATCH] knfsd: consolidate common code for statd->lockd notification



Common code from nlm4svc_proc_sm_notify and nlmsvc_proc_sm_notify is moved
into a new nlm_host_rebooted.

This is in preparation of a patch that will change the reboot notification
handling entirely.

Signed-off-by: default avatarOlaf Kirch <okir@suse.de>
Signed-off-by: default avatarNeil Brown <neilb@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 977faf39
Loading
Loading
Loading
Loading
+28 −2
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ static void nlm_gc_hosts(void);
 * Find an NLM server handle in the cache. If there is none, create it.
 */
struct nlm_host *
nlmclnt_lookup_host(struct sockaddr_in *sin, int proto, int version)
nlmclnt_lookup_host(const struct sockaddr_in *sin, int proto, int version)
{
	return nlm_lookup_host(0, sin, proto, version);
}
@@ -58,7 +58,7 @@ nlmsvc_lookup_host(struct svc_rqst *rqstp)
 * Common host lookup routine for server & client
 */
struct nlm_host *
nlm_lookup_host(int server, struct sockaddr_in *sin,
nlm_lookup_host(int server, const struct sockaddr_in *sin,
					int proto, int version)
{
	struct nlm_host	*host, **hp;
@@ -259,6 +259,32 @@ void nlm_release_host(struct nlm_host *host)
	}
}

/*
 * We were notified that the host indicated by address &sin
 * has rebooted.
 * Release all resources held by that peer.
 */
void nlm_host_rebooted(const struct sockaddr_in *sin, const struct nlm_reboot *argp)
{
	struct nlm_host *host;

	/* Obtain the host pointer for this NFS server and try to
	 * reclaim all locks we hold on this server.
	 */
	if ((argp->proto & 1)==0) {
		/* We are client, he's the server: try to reclaim all locks. */
		if ((host = nlmclnt_lookup_host(sin, argp->proto >> 1, argp->vers)) == NULL)
			return;
		nlmclnt_recovery(host, argp->state);
	} else {
		/* He's the client, we're the server: delete all locks held by the client */
		if ((host = nlm_lookup_host(1, sin, argp->proto >> 1, argp->vers)) == NULL)
			return;
		nlmsvc_free_host_resources(host);
	}
	nlm_release_host(host);
}

/*
 * Shut down the hosts module.
 * Note that this routine is called only at server shutdown time.
+2 −17
Original line number Diff line number Diff line
@@ -420,10 +420,6 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
					      void	        *resp)
{
	struct sockaddr_in	saddr = rqstp->rq_addr;
	int			vers = argp->vers;
	int			prot = argp->proto >> 1;

	struct nlm_host		*host;

	dprintk("lockd: SM_NOTIFY     called\n");
	if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
@@ -438,21 +434,10 @@ nlm4svc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
	/* Obtain the host pointer for this NFS server and try to
	 * reclaim all locks we hold on this server.
	 */
	memset(&saddr, 0, sizeof(saddr));
	saddr.sin_addr.s_addr = argp->addr;
	nlm_host_rebooted(&saddr, argp);

	if ((argp->proto & 1)==0) {
		if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
			nlmclnt_recovery(host, argp->state);
			nlm_release_host(host);
		}
	} 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) {
			nlmsvc_free_host_resources(host);
			nlm_release_host(host);
		}
	}
	return rpc_success;
}

+2 −15
Original line number Diff line number Diff line
@@ -449,9 +449,6 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
					      void	        *resp)
{
	struct sockaddr_in	saddr = rqstp->rq_addr;
	int			vers = argp->vers;
	int			prot = argp->proto >> 1;
	struct nlm_host		*host;

	dprintk("lockd: SM_NOTIFY     called\n");
	if (saddr.sin_addr.s_addr != htonl(INADDR_LOOPBACK)
@@ -466,19 +463,9 @@ nlmsvc_proc_sm_notify(struct svc_rqst *rqstp, struct nlm_reboot *argp,
	/* Obtain the host pointer for this NFS server and try to
	 * reclaim all locks we hold on this server.
	 */
	memset(&saddr, 0, sizeof(saddr));
	saddr.sin_addr.s_addr = argp->addr;
	if ((argp->proto & 1)==0) {
		if ((host = nlmclnt_lookup_host(&saddr, prot, vers)) != NULL) {
			nlmclnt_recovery(host, argp->state);
			nlm_release_host(host);
		}
	} 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) {
			nlmsvc_free_host_resources(host);
			nlm_release_host(host);
		}
	}
	nlm_host_rebooted(&saddr, argp);

	return rpc_success;
}
+3 −2
Original line number Diff line number Diff line
@@ -161,15 +161,16 @@ int nlmclnt_reclaim(struct nlm_host *, struct file_lock *);
/*
 * Host cache
 */
struct nlm_host * nlmclnt_lookup_host(struct sockaddr_in *, int, int);
struct nlm_host * nlmclnt_lookup_host(const 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(int server, const 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 *);
void		  nlm_release_host(struct nlm_host *);
void		  nlm_shutdown_hosts(void);
extern struct nlm_host *nlm_find_client(void);
extern void	  nlm_host_rebooted(const struct sockaddr_in *, const struct nlm_reboot *);


/*