From: Davide Libenzi Date: Fri, 17 Oct 2008 23:17:40 +0000 (-0700) Subject: epoll: avoid double-inserts in case of EFAULT X-Git-Tag: v2.6.28-rc2~2 X-Git-Url: http://www.pilppa.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=9ce209d64d820a6d5ed6b952e2c0f917faad6031;hp=9ce209d64d820a6d5ed6b952e2c0f917faad6031;p=linux-2.6-omap-h63xx.git epoll: avoid double-inserts in case of EFAULT In commit f337b9c58332bdecde965b436e47ea4c94d30da0 ("epoll: drop unnecessary test") Thomas found that there is an unnecessary (always true) test in ep_send_events(). The callback never inserts into ->rdllink while the send loop is performed, and also does the ~EP_PRIVATE_BITS test. Given we're holding the mutex during this time, the conditions tested inside the loop are always true. HOWEVER. The test "!ep_is_linked(&epi->rdllink)" wasn't there because we insert into ->rdllink, but because the send-events loop might terminate before the whole list is scanned (-EFAULT). In such cases, when the loop terminates early, and when a (leftover) file received an event while we're performing the lockless loop, we need such test to avoid to double insert the epoll items. The list_splice() done a few steps below, will correctly re-insert the ones that were left on "txlist". This should fix the kenrel.org bugzilla entry 11831. Signed-off-by: Davide Libenzi Signed-off-by: Linus Torvalds ---