summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2008-12-11 17:55:52 -0500
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-01-06 11:53:55 -0500
commitb39b897c259fc1fd1998505f2b1d4ec1f115bce1 (patch)
tree1b331bb4d1d71401d2dec0c7f23c86795c09267a
parent92fd91b998a5216a6d6606704e71d541a180216c (diff)
NSM: Refactor nsm_handle creation into a helper function
Clean up. Refactor the creation of nsm_handles into a helper. Fields are initialized in increasing address order to make efficient use of CPU caches. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
-rw-r--r--fs/lockd/mon.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/fs/lockd/mon.c b/fs/lockd/mon.c
index 740702216042..315ca07715c7 100644
--- a/fs/lockd/mon.c
+++ b/fs/lockd/mon.c
@@ -239,6 +239,30 @@ static void nsm_init_private(struct nsm_handle *nsm)
*p = nsm_addr_in(nsm)->sin_addr.s_addr;
}
+static struct nsm_handle *nsm_create_handle(const struct sockaddr *sap,
+ const size_t salen,
+ const char *hostname,
+ const size_t hostname_len)
+{
+ struct nsm_handle *new;
+
+ new = kzalloc(sizeof(*new) + hostname_len + 1, GFP_KERNEL);
+ if (unlikely(new == NULL))
+ return NULL;
+
+ atomic_set(&new->sm_count, 1);
+ new->sm_name = (char *)(new + 1);
+ memcpy(nsm_addr(new), sap, salen);
+ new->sm_addrlen = salen;
+ nsm_init_private(new);
+ nsm_display_address((const struct sockaddr *)&new->sm_addr,
+ new->sm_addrbuf, sizeof(new->sm_addrbuf));
+ memcpy(new->sm_name, hostname, hostname_len);
+ new->sm_name[hostname_len] = '\0';
+
+ return new;
+}
+
/**
* nsm_get_handle - Find or create a cached nsm_handle
* @sap: pointer to socket address of handle to find
@@ -295,19 +319,9 @@ retry:
}
spin_unlock(&nsm_lock);
- nsm = kzalloc(sizeof(*nsm) + hostname_len + 1, GFP_KERNEL);
- if (nsm == NULL)
+ nsm = nsm_create_handle(sap, salen, hostname, hostname_len);
+ if (unlikely(nsm == NULL))
return NULL;
-
- memcpy(nsm_addr(nsm), sap, salen);
- nsm->sm_addrlen = salen;
- nsm->sm_name = (char *) (nsm + 1);
- memcpy(nsm->sm_name, hostname, hostname_len);
- nsm->sm_name[hostname_len] = '\0';
- nsm_init_private(nsm);
- nsm_display_address((struct sockaddr *)&nsm->sm_addr,
- nsm->sm_addrbuf, sizeof(nsm->sm_addrbuf));
- atomic_set(&nsm->sm_count, 1);
goto retry;
found: