<div dir="ltr">Applied.<div>Thanks.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Mar 1, 2017 at 6:22 PM, Martin Wilck <span dir="ltr"><<a href="mailto:mwilck@suse.com" target="_blank">mwilck@suse.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This uses roughly 10% cycles of the sscanf-based implementation.<br>
<br>
Improves: ee8888f0 "multipath-tools: improve processing efficiency..."<br>
Signed-off-by: Martin Wilck <<a href="mailto:mwilck@suse.com">mwilck@suse.com</a>><br>
---<br>
 libmultipath/uevent.c | 37 +++++++++++++++++++++++-------<wbr>-------<br>
 1 file changed, 23 insertions(+), 14 deletions(-)<br>
<br>
diff --git a/libmultipath/uevent.c b/libmultipath/uevent.c<br>
index 6e2527bd..367e129a 100644<br>
--- a/libmultipath/uevent.c<br>
+++ b/libmultipath/uevent.c<br>
@@ -143,26 +143,35 @@ uevent_need_merge(void)<br>
        return need_merge;<br>
 }<br>
<br>
+static bool<br>
+uevent_can_discard_by_<wbr>devpath(const char *devpath)<br>
+{<br>
+       static const char BLOCK[] = "/block/";<br>
+       const char *tmp = strstr(devpath, BLOCK);<br>
+<br>
+       if (tmp == NULL) {<br>
+               condlog(4, "no /block/ in '%s'", devpath);<br>
+               return true;<br>
+       }<br>
+       tmp += sizeof(BLOCK) - 1;<br>
+       if (*tmp == '\0')<br>
+               /* just ".../block/" - discard */<br>
+               return true;<br>
+       /*<br>
+        * If there are more path elements after ".../block/xyz",<br>
+        * it's a partition - discard it; but don't discard ".../block/sda/".<br>
+        */<br>
+       tmp = strchr(tmp, '/');<br>
+       return tmp != NULL && *(tmp + 1) != '\0';<br>
+}<br>
+<br>
 bool<br>
 uevent_can_discard(struct uevent *uev)<br>
 {<br>
-       char *tmp;<br>
-       char a[11], b[11];<br>
        struct config * conf;<br>
<br>
-       /*<br>
-        * keep only block devices, discard partitions<br>
-        */<br>
-       tmp = strstr(uev->devpath, "/block/");<br>
-       if (tmp == NULL){<br>
-               condlog(4, "no /block/ in '%s'", uev->devpath);<br>
+       if (uevent_can_discard_by_<wbr>devpath(uev->devpath))<br>
                return true;<br>
-       }<br>
-       if (sscanf(tmp, "/block/%10s", a) != 1 ||<br>
-           sscanf(tmp, "/block/%10[^/]/%10s", a, b) == 2) {<br>
-               condlog(4, "discard event on %s", uev->devpath);<br>
-               return true;<br>
-       }<br>
<br>
        /*<br>
         * do not filter dm devices by devnode<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.12.0<br>
<br>
--<br>
dm-devel mailing list<br>
<a href="mailto:dm-devel@redhat.com">dm-devel@redhat.com</a><br>
<a href="https://www.redhat.com/mailman/listinfo/dm-devel" rel="noreferrer" target="_blank">https://www.redhat.com/<wbr>mailman/listinfo/dm-devel</a><br>
</font></span></blockquote></div><br></div>