<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7226.0">
<TITLE>Problems at boot time with drbd-8</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">I&#8217;ve been working on getting the pre-release version of DRBD8 up on my system and have run into a couple of</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">minor</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">problems&#8230; first of all, I found that drbdadm dies with a segfault when running &#8216;drbdadm adjust all&#8217; at boot time &#8211; turns out this is because the underlying &#8216;drbdsetup /dev/drbd0 show&#8217; command returns &#8220;# not configured&#8221; at that time &#8211; the parsing of this into a resource structure</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> by drbdadm</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> leaves the running-&gt;me field NULL and we then trip over an attempt to strcmp the name of the device with the configured name &#8211; after some checking, I found that this problem is actually fixed in the trunk so I moved forward to there, BUT there are still a couple of issues with startup, namely:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">The routine convert_after_option</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">(in drbdadm_main.c)</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">ends up being called twice when the &#8216;drbdadm adjust all&#8217; command is issued &#8211; once when comparing with the current running config and then again if a sync operation is actually kicked off &#8211; unforturnately, this routine actually crashes if the name stored in the after option is not a valid resource name (which of course it isn&#8217;t after it&#8217;s been converted the first time). I fixed this simply by not doing the conversion if the name does not represent a valid resource &#8211; if it truly is a bad resource name then the later attempt to use it will fail.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">The new code added to check IP addresses (</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">verify_ips in drbdadm_main.c) is not properly</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">initializing</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> the sin_addr local variable which should have the IP address of the local system</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"></FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">&#8211;</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> thus this routine always fails and you get the</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">&#8216;</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">OOPS: the IP address x.y.z.a isn</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">&#8217;</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">t configure/up on your system!</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">&#8217;</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> error message.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Tahoma">The definition &amp; use of INVALID_IP_IS_INVALID_CONF</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma"> are inconsistent; the definition defines it as zero and implies this means the option is disabled whereas the .c file uses #ifdef to check if it is enabled. I think this should be #if instead.</FONT></SPAN><SPAN LANG="en-us"> </SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">Attached is a patch that fixes these.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Tahoma">Simon</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>
<BR>

<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"><FONT FACE="Courier New">Index: user/drbdadm_main.c</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">===================================================================</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">--- user/drbdadm_main.c (revision 2739)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+++ user/drbdadm_main.c (working copy)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">@@ -794,6 +794,12 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;struct d_resource* res_by_name(const char *name);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;// Need to convert after from resourcename to minor_number.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+// NOTE: this _may_ already have been done (for example, adjust</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processing will call this, then may start a syncer op</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; which will call it again for the same resource). This is</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; detected by attempting to locate the resource structure</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for the resource -- if this fails, we assume the tx has</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; already been done.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;void convert_after_option(struct d_resource* res)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;{</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; struct d_option* opt;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">@@ -802,9 +808,13 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; if ( (opt = find_opt(res-&gt;sync_options, &quot;after&quot;)) ) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; char *ptr;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">-&nbsp;&nbsp;&nbsp; ssprintf(ptr,&quot;%d&quot;,dt_minor_of_dev(res_by_name(opt-&gt;value)-&gt;me-&gt;device));</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">-&nbsp;&nbsp;&nbsp; free(opt-&gt;value);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">-&nbsp;&nbsp;&nbsp; opt-&gt;value=strdup(ptr);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp; struct d_resource *ares = res_by_name(opt-&gt;value);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp; if (ares) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ssprintf(ptr,&quot;%d&quot;,dt_minor_of_dev(ares-&gt;me-&gt;device));</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; free(opt-&gt;value);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; opt-&gt;value=strdup(ptr);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp;&nbsp;&nbsp; }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;}</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">@@ -1293,6 +1303,7 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; const char *my_ip;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; my_ip = res-&gt;me-&gt;address;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+&nbsp; sin_addr.s_addr = inet_addr(my_ip);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; /* does DRBD support inet6? */</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; family = AF_INET;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">@@ -1316,7 +1327,7 @@</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; if (valid == 0) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, &quot;OOPS, the IP address %s isn't configure/up on your system!\n&quot;, my_ip);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">-#ifdef INVALID_IP_IS_INVALID_CONF</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">+#if INVALID_IP_IS_INVALID_CONF</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp;&nbsp;&nbsp; config_valid = 0;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;#endif</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT FACE="Courier New">&nbsp;&nbsp; }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN></P>

</BODY>
</HTML>