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

Commit b10e30f6 authored by J. Bruce Fields's avatar J. Bruce Fields Committed by Trond Myklebust
Browse files

lockd: reorganize nlm_host_rebooted



Minor reorganization; no change in behavior.  This will save some
duplicated code after we split the client and server host caches.

Signed-off-by: default avatarJ. Bruce Fields <bfields@citi.umich.edu>
[ cel: Forward-ported to 2.6.37 ]
Signed-off-by: default avatarChuck Lever <chuck.lever@oracle.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent b1137468
Loading
Loading
Loading
Loading
+34 −24
Original line number Diff line number Diff line
@@ -441,6 +441,31 @@ void nlm_release_host(struct nlm_host *host)
	}
}

static struct nlm_host *next_host_state(struct hlist_head *cache,
					struct nsm_handle *nsm,
					const struct nlm_reboot *info)
{
	struct nlm_host *host = NULL;
	struct hlist_head *chain;
	struct hlist_node *pos;

	mutex_lock(&nlm_host_mutex);
	for_each_host(host, pos, chain, cache) {
		if (host->h_nsmhandle == nsm
		    && host->h_nsmstate != info->state) {
			host->h_nsmstate = info->state;
			host->h_state++;

			nlm_get_host(host);
			mutex_unlock(&nlm_host_mutex);
			goto out;
		}
	}
out:
	mutex_unlock(&nlm_host_mutex);
	return host;
}

/**
 * nlm_host_rebooted - Release all resources held by rebooted host
 * @info: pointer to decoded results of NLM_SM_NOTIFY call
@@ -450,8 +475,6 @@ void nlm_release_host(struct nlm_host *host)
 */
void nlm_host_rebooted(const struct nlm_reboot *info)
{
	struct hlist_head *chain;
	struct hlist_node *pos;
	struct nsm_handle *nsm;
	struct nlm_host	*host;

@@ -464,16 +487,7 @@ void nlm_host_rebooted(const struct nlm_reboot *info)
	 * lock for this.
	 * To avoid processing a host several times, we match the nsmstate.
	 */
again:	mutex_lock(&nlm_host_mutex);
	for_each_host(host, pos, chain, nlm_hosts) {
		if (host->h_nsmhandle == nsm
		 && host->h_nsmstate != info->state) {
			host->h_nsmstate = info->state;
			host->h_state++;

			nlm_get_host(host);
			mutex_unlock(&nlm_host_mutex);

	while ((host = next_host_state(nlm_hosts, nsm, info)) != NULL) {
		if (host->h_server) {
			/* We're server for this guy, just ditch
			 * all the locks he held. */
@@ -482,12 +496,8 @@ again: mutex_lock(&nlm_host_mutex);
			/* He's the server, initiate lock recovery. */
			nlmclnt_recovery(host);
		}

		nlm_release_host(host);
			goto again;
	}
	}
	mutex_unlock(&nlm_host_mutex);
	nsm_release(nsm);
}