tipc: Optimize detection of duplicate media registration
authorAllan Stephens <allan.stephens@windriver.com>
Thu, 6 Oct 2011 20:40:55 +0000 (16:40 -0400)
committerPaul Gortmaker <paul.gortmaker@windriver.com>
Tue, 27 Dec 2011 16:13:06 +0000 (11:13 -0500)
Streamlines the detection of an attempt to register a TIPC media structure
using an already registered name or type identifier. The revised logic now
reuses an existing routine to detect an existing name and no longer
unnecessarily manipulates the media type counter during an unsuccessful
registration attempt.

Signed-off-by: Allan Stephens <allan.stephens@windriver.com>
Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
net/tipc/bearer.c

index 75af271b9cfa4a87d42c8ea1045956dd8c83c0ae..9ff89207846ab87bf160717b96498ab5757e7fa6 100644 (file)
@@ -80,6 +80,21 @@ static struct media *media_find(const char *name)
        return NULL;
 }
 
+/**
+ * media_find_id - locates specified media object by type identifier
+ */
+
+static struct media *media_find_id(u8 type)
+{
+       u32 i;
+
+       for (i = 0; i < media_count; i++) {
+               if (media_list[i].type_id == type)
+                       return &media_list[i];
+       }
+       return NULL;
+}
+
 /**
  * tipc_register_media - register a media type
  *
@@ -88,8 +103,6 @@ static struct media *media_find(const char *name)
 
 int  tipc_register_media(struct media *m_ptr)
 {
-       u32 media_id;
-       u32 i;
        int res = -EINVAL;
 
        write_lock_bh(&tipc_net_lock);
@@ -121,29 +134,18 @@ int  tipc_register_media(struct media *m_ptr)
                goto exit;
        }
 
-       media_id = media_count++;
-       if (media_id >= MAX_MEDIA) {
+       if (media_count >= MAX_MEDIA) {
                warn("Media <%s> rejected, media limit reached (%u)\n",
                     m_ptr->name, MAX_MEDIA);
-               media_count--;
                goto exit;
        }
-       for (i = 0; i < media_id; i++) {
-               if (media_list[i].type_id == m_ptr->type_id) {
-                       warn("Media <%s> rejected, duplicate type (%u)\n",
-                            m_ptr->name, m_ptr->type_id);
-                       media_count--;
-                       goto exit;
-               }
-               if (!strcmp(m_ptr->name, media_list[i].name)) {
-                       warn("Media <%s> rejected, duplicate name\n",
-                            m_ptr->name);
-                       media_count--;
-                       goto exit;
-               }
+       if (media_find(m_ptr->name) || media_find_id(m_ptr->type_id)) {
+               warn("Media <%s> rejected, already registered\n", m_ptr->name);
+               goto exit;
        }
 
-       media_list[media_id] = *m_ptr;
+       media_list[media_count] = *m_ptr;
+       media_count++;
        res = 0;
 exit:
        write_unlock_bh(&tipc_net_lock);