[PATCH 07/11] lockd: Refactor nlm_host_rebooted()

Chuck Lever
2010-04-01T19:03:26Z

We want to be able to call the lock recovery logic directly with an
nsm_handle. Factor that piece out of nlm_host_rebooted().

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
---

fs/lockd/host.c | 35 ++++++++++++++++++++++++-----------
include/linux/lockd/lockd.h | 2 ++
2 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/fs/lockd/host.c b/fs/lockd/host.c
index 0a62d8d..001d05b 100644
--- a/fs/lockd/host.c
+++ b/fs/lockd/host.c
@@ -669,26 +669,39 @@ 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;

nsm = nsm_reboot_lookup(info);
if (unlikely(nsm == NULL))
return;

- /* Mark all hosts tied to this NSM state as having rebooted.
- * We run the loop repeatedly, because we drop the host table
- * lock for this.
- * To avoid processing a host several times, we match the nsmstate.
- */
-again: mutex_lock(&nlm_host_mutex);
+ nlm_host_rebooted_nsm(nsm, info->state);
+}
+
+/**
+ * nlm_host_rebooted_nsm - start reboot recovery on remote peer
+ * @nsm: pointer to NSM handle for rebooting peer
+ * @nsmstate: new NSM state number of rebooting peer
+ *
+ * Mark all hosts tied to this NSM state as having rebooted. We run
+ * the loop repeatedly, because we drop the host table lock for this.
+ *
+ * To avoid processing a host several times, we match the nsmstate.
+ */
+void nlm_host_rebooted_nsm(const struct nsm_handle *nsm, const int nsmstate)
+{
+ struct hlist_head *chain;
+ struct hlist_node *pos;
+ struct nlm_host *host;
+
+again:
+ mutex_lock(&nlm_host_mutex);
+
for (chain = nlm_hosts; chain < nlm_hosts + NLM_HOST_NRHASH; ++chain) {
hlist_for_each_entry(host, pos, chain, h_hash) {
if (host->h_nsmhandle == nsm
- && host->h_nsmstate != info->state) {
- host->h_nsmstate = info->state;
+ && host->h_nsmstate != nsmstate) {
+ host->h_nsmstate = nsmstate;
host->h_state++;

nlm_get_host(host);
diff --git a/include/linux/lockd/lockd.h b/include/linux/lockd/lockd.h
index 3d1c594..3c20114 100644
--- a/include/linux/lockd/lockd.h
+++ b/include/linux/lockd/lockd.h
@@ -235,6 +235,8 @@ 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);
+void nlm_host_rebooted_nsm(const struct nsm_handle *nsm,
+ const int nsmstate);
void nlm_host_rebooted(const struct nlm_reboot *);

/*