tipc: Optimize detection of duplicate media registration
[deliverable/linux.git] / 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);
This page took 0.035708 seconds and 5 git commands to generate.