[SSI] openssi/kernel/cluster/ssi/net ipvs_svr.c,1.29,1.30
Roger Tsang <[email protected]> Wed, 18 Dec 2013 07:32:40 +0000
| Newsgroups | gmane.linux.cluster.ssic.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/net
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv8929/cluster/ssi/net
Modified Files:
Tag: OPENSSI-FC
ipvs_svr.c
Log Message:
- clean up, move unrelated bug fixes out of compiler pragma.
- ripvs_add_entry: use memcpy() to avoid strlen() calls; avoid traversing beyond allocated memory region of string buffer since caller passes non-null terminated string.
Index: ipvs_svr.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/net/ipvs_svr.c,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- ipvs_svr.c 18 Dec 2013 07:10:31 -0000 1.29
+++ ipvs_svr.c 18 Dec 2013 07:32:38 -0000 1.30
@@ -277,27 +277,15 @@
struct ipvs_dirinfo *info;
char lvs_sched[IP_VS_SCHEDNAME_MAXLEN];
-#ifdef IPVS_SERVICE_RACE_FIX
- SSI_ASSERT(sched_len < IP_VS_SCHEDNAME_MAXLEN);
- if (sched_len >= IP_VS_SCHEDNAME_MAXLEN)
- sched_len = IP_VS_SCHEDNAME_MAXLEN-1;
- strlcpy(lvs_sched, sched, sched_len+1);
+ sched_len = min(sched_len, IP_VS_SCHEDNAME_MAXLEN-1);
+ memcpy(lvs_sched, sched, sched_len);
+ lvs_sched[sched_len] = '\0';
*rval = service_add(cvip, port, rip, weight, protocol, lvs_sched);
- /* Only if there is an IPVS entry. */
- if (!*rval || *rval == -EEXIST)
-#else
- strncpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
- lvs_sched[IP_VS_SCHEDNAME_MAXLEN-1] = '\0';
- *rval = service_add(cvip, port, rip, weight, protocol, lvs_sched);
- /* XXX: Not sure if we need this. */
- if (!rval)
-#endif
/* Inform all the possible director nodes */
- if ((info = get_director(cvip))) {
- /* only from master director node */
- if (info->dnode == this_node)
+ if ((!*rval || *rval == -EEXIST) && (info = get_director(cvip))) {
+ if (__is_master_director(info))
(void) pdirector_update(info, port, rip, weight,
protocol, lvs_sched, 1);
put_director(info);
@@ -306,7 +294,6 @@
return 0;
}
-/* ripvs_add_entry() without get_director() call */
void
local_ipvs_add_entry(
struct ipvs_dirinfo *info,
@@ -317,28 +304,12 @@
u_short protocol,
char *sched)
{
- char lvs_sched[IP_VS_SCHEDNAME_MAXLEN];
-
-#ifdef IPVS_SERVICE_RACE_FIX
- SSI_ASSERT(strlen(sched) < IP_VS_SCHEDNAME_MAXLEN);
- strlcpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
-
- *rval = service_add(info->daddr, port, rip, weight, protocol, lvs_sched);
- /* Only if there is an IPVS entry. */
- if (!*rval || *rval == -EEXIST)
-#else
- strncpy(lvs_sched, sched, IP_VS_SCHEDNAME_MAXLEN);
- lvs_sched[IP_VS_SCHEDNAME_MAXLEN-1] = '\0';
+ SSI_ASSERT(__is_master_director(info));
+ *rval = service_add(info->daddr, port, rip, weight, protocol, sched);
- *rval = service_add(info->daddr, port, rip, weight, protocol, lvs_sched);
- /* XXX: Not sure if we need this. */
- if (!rval)
-#endif
/* Inform all the possible director nodes */
- /* only from master director node */
- if (info->dnode == this_node)
- (void) pdirector_update(info, port, rip, weight,
- protocol, lvs_sched, 1);
+ if (!*rval || *rval == -EEXIST)
+ (void) pdirector_update(info, port, rip, weight, protocol, sched, 1);
}
int
@@ -353,15 +324,10 @@
struct ipvs_dirinfo *info;
*rval = service_del(cvip, port, rip, protocol);
-#ifdef IPVS_SERVICE_RACE_FIX
- if (*rval != -EBADR)
-#else
- if (!rval)
-#endif
+
/* Inform all the possible director nodes */
- if ((info = get_director(cvip))) {
- /* only from master director node */
- if (info->dnode == this_node)
+ if ((*rval != -EBADR) && (info = get_director(cvip))) {
+ if (__is_master_director(info))
(void) pdirector_update(info, port, rip, 0, protocol, 0, 0);
put_director(info);
}
@@ -369,7 +335,6 @@
return 0;
}
-/* ripvs_del_entry() without get_director() call */
void
local_ipvs_del_entry(
struct ipvs_dirinfo *info,
@@ -378,15 +343,11 @@
u_int rip,
u_short protocol)
{
+ SSI_ASSERT(__is_master_director(info));
*rval = service_del(info->daddr, port, rip, protocol);
-#ifdef IPVS_SERVICE_RACE_FIX
- if (*rval != -EBADR)
-#else
- if (!rval)
-#endif
+
/* Inform all the possible director nodes */
- /* only from master director node */
- if (info->dnode == this_node)
+ if (*rval != -EBADR)
(void) pdirector_update(info, port, rip, 0, protocol, 0, 0);
}
@@ -975,7 +936,7 @@
/* Allow this to run only on cvip master director node */
if ((info = get_director(dipaddr))) {
- if (info->dnode == this_node) {
+ if (__is_master_director(info)) {
put_director(info);
/* TODO: Could optimize away get_director() in path:
* set_master_director, ripvs_setdirector, modify_director,
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk