<font size=2 face="sans-serif">Hello Ben,</font>
<br>
<br><font size=2 face="sans-serif">I add wwid judgment for safe.</font>
<br><font size=2 face="sans-serif">I think twice, and as you say, it is
safe enough without</font>
<br><font size=2 face="sans-serif">this judgment, I will delete these wwid
</font><font size=2>judgment</font><font size=2 face="sans-serif">.</font>
<br>
<br><font size=2 face="sans-serif">Tanks</font>
<br><font size=2 face="sans-serif">Tang Junhui</font>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
    </font><font size=1 face="sans-serif">"Benjamin
Marzinski" <bmarzins@redhat.com></font>
<br><font size=1 color=#5f5f5f face="sans-serif">收件人:    
    </font><font size=1 face="sans-serif">tang.junhui@zte.com.cn,
</font>
<br><font size=1 color=#5f5f5f face="sans-serif">抄送:    
   </font><font size=1 face="sans-serif">tang.wenjun3@zte.com.cn,
zhang.kai16@zte.com.cn, dm-devel@redhat.com, bart.vanassche@sandisk.com,
mwilck@suse.com</font>
<br><font size=1 color=#5f5f5f face="sans-serif">日期:    
    </font><font size=1 face="sans-serif">2017/01/04
09:28</font>
<br><font size=1 color=#5f5f5f face="sans-serif">主题:    
   </font><font size=1 face="sans-serif">Re: [dm-devel]
[PATCH 10/12] libmultipath: filter uevents before      
 proccessing</font>
<br><font size=1 color=#5f5f5f face="sans-serif">发件人:    
   </font><font size=1 face="sans-serif">dm-devel-bounces@redhat.com</font>
<br>
<hr noshade>
<br>
<br>
<br><tt><font size=2>On Tue, Dec 27, 2016 at 04:03:27PM +0800, tang.junhui@zte.com.cn
wrote:<br>
> From: tang.junhui <tang.junhui@zte.com.cn><br>
> <br>
> Before merging uevents, these uevents are going to be filtered:<br>
> Change or addition uevent of a removed path (it indicate by an<br>
> deletion uevent occurred later).<br>
> <br>
<br>
I think it's safe to remove add and change uevents if they are followed<br>
by a remove event, regardless of whether or not they have a wwid, as<br>
long as the kernel name is the same.  We only get the remove event
when<br>
the device is gone. Processing the add and change events will never get<br>
us anything in these cases, because there is no device to act on.<br>
<br>
-Ben<br>
<br>
> Change-Id: If00c2c2e23ea466c1d4643c541ed2d8f9a0c8dea<br>
> Signed-off-by: tang.junhui <tang.junhui@zte.com.cn><br>
> ---<br>
>  libmultipath/uevent.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++<br>
>  1 file changed, 55 insertions(+)<br>
> <br>
> diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c<br>
> index 114068c..424f272 100644<br>
> --- a/libmultipath/uevent.c<br>
> +++ b/libmultipath/uevent.c<br>
> @@ -140,6 +140,28 @@ uevent_can_discard(char *devpath, char *kernel)<br>
>  }<br>
>  <br>
>  bool<br>
> +uevent_can_filter(struct uevent *earlier, struct uevent *later)<br>
> +{<br>
> +<br>
> +                
/*<br>
> +                
 * filter earlier uvents if path has removed later, eg:<br>
> +                
 * "add path3 |chang path3 |add path2 |remove path3"<br>
> +                
 * can filter as:<br>
> +                
 * "add path2 |remove path3"<br>
> +                
 * uevent "add path3" and "chang path3" are filtered
out<br>
> +                
 */<br>
> +                
if (earlier->wwid && later->wwid &&<br>
> +                
                 !strcmp(earlier->wwid,
later->wwid) &&<br>
> +                
                 strncmp(later->kernel,
"dm-", 3) &&<br>
> +                
                 !strcmp(later->action,
"remove") &&<br>
> +                
                 !strcmp(earlier->kernel,
later->kernel)) {<br>
> +                
                 return
true;<br>
> +                
}<br>
> +<br>
> +                
return false;<br>
> +}<br>
> +<br>
> +bool<br>
>  merge_need_stop(struct uevent *earlier, struct uevent *later)<br>
>  {<br>
>                  
/*<br>
> @@ -196,6 +218,38 @@ uevent_can_merge(struct uevent *earlier, struct
uevent *later)<br>
>  }<br>
>  <br>
>  void<br>
> +uevent_filter(struct uevent *later, struct list_head *tmpq)<br>
> +{<br>
> +                
struct uevent *earlier, *temp;<br>
> +                
/*<br>
> +                
 * compare the uevent with earlier uevents<br>
> +                
 */<br>
> +                
list_for_some_entry_reverse(earlier, &later->node, tmpq, node) {<br>
> +next_earlier_node:<br>
> +                
                 /*<br>
> +                
                 
* filter unnessary earlier uevents by the later uevent<br>
> +                
                 
*/<br>
> +                
                 if
(uevent_can_filter(earlier, later)) {<br>
> +                
                 
               
condlog(2, "uevent: %s-%s-%s has removed by uevent: %s-%s-%s, filtered",<br>
> +                
                 
               
                 earlier->action,
earlier->kernel, earlier->wwid,<br>
> +                
                 
               
                 later->action,
later->kernel, later->wwid);<br>
> +<br>
> +                
                 
               
temp = earlier;<br>
> +                
                 
               
earlier = list_entry(earlier->node.prev, typeof(struct uevent), node);<br>
> +                
                 
               
list_del_init(&temp->node);<br>
> +                
                 
               
if (temp->udev)<br>
> +                
                 
               
                 udev_device_unref(temp->udev);<br>
> +                
                 
               
FREE(temp);<br>
> +<br>
> +                
                 
               
if (earlier ==  list_entry(tmpq, typeof(struct uevent), node))<br>
> +                
                 
               
                 break;<br>
> +                
                 
               
else<br>
> +                
                 
               
                 goto
next_earlier_node;<br>
> +                
                 }<br>
> +                
}<br>
> +}<br>
> +<br>
> +void<br>
>  uevent_merge(struct uevent *later, struct list_head *tmpq)<br>
>  {<br>
>                  
struct uevent *earlier, *temp;<br>
> @@ -232,6 +286,7 @@ merge_uevq(struct list_head *tmpq)<br>
>                  
struct uevent *later;<br>
>  <br>
>                  
list_for_each_entry_reverse(later, tmpq, node) {<br>
> +                
                 uevent_filter(later,
tmpq);<br>
>                  
                 uevent_merge(later,
tmpq);<br>
>                  
}<br>
>  }<br>
> -- <br>
> 2.8.1.windows.1<br>
> <br>
<br>
--<br>
dm-devel mailing list<br>
dm-devel@redhat.com<br>
</font></tt><a href="https://www.redhat.com/mailman/listinfo/dm-devel"><tt><font size=2>https://www.redhat.com/mailman/listinfo/dm-devel</font></tt></a><tt><font size=2><br>
</font></tt>
<br>