Răsfoiți Sursa

tipc: Optimize detection of duplicate media registration

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>
Allan Stephens 13 ani în urmă
părinte
comite
c79be4549a
1 a modificat fișierele cu 21 adăugiri și 19 ștergeri
  1. 21 19
      net/tipc/bearer.c

+ 21 - 19
net/tipc/bearer.c

@@ -80,6 +80,21 @@ static struct media *media_find(const char *name)
 	return NULL;
 	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
  * 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)
 int  tipc_register_media(struct media *m_ptr)
 {
 {
-	u32 media_id;
-	u32 i;
 	int res = -EINVAL;
 	int res = -EINVAL;
 
 
 	write_lock_bh(&tipc_net_lock);
 	write_lock_bh(&tipc_net_lock);
@@ -121,29 +134,18 @@ int  tipc_register_media(struct media *m_ptr)
 		goto exit;
 		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",
 		warn("Media <%s> rejected, media limit reached (%u)\n",
 		     m_ptr->name, MAX_MEDIA);
 		     m_ptr->name, MAX_MEDIA);
-		media_count--;
 		goto exit;
 		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;
 	res = 0;
 exit:
 exit:
 	write_unlock_bh(&tipc_net_lock);
 	write_unlock_bh(&tipc_net_lock);