NSM: Refactor nsm_handle creation into a helper function
authorChuck Lever <chuck.lever@oracle.com>
Thu, 11 Dec 2008 22:55:52 +0000 (17:55 -0500)
committerJ. Bruce Fields <bfields@citi.umich.edu>
Tue, 6 Jan 2009 16:53:55 +0000 (11:53 -0500)
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>
fs/lockd/mon.c

index 7407022..315ca07 100644 (file)
@@ -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: