<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>