In order to make request_*muxed_region() behave more like mutex_lock(),
a possible failure case needs to be eliminated. When drivers do not
properly share the same I/O region, e.g. one is using request_region()
and the other is using request_muxed_region(), the kernel didn't
warn the user about it. This change modifies IORESOURCE_MUXED behaviour
so it always goes to sleep waiting for the resuorce to be freed
and the inconsistent resource flag usage is logged with KERN_ERR.

Signed-off-by: Zoltán Böszörményi <[email protected]>
---
 kernel/resource.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/kernel/resource.c b/kernel/resource.c
index 220f695..59fa426 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -1150,7 +1150,9 @@ struct resource * __request_declared_region(struct 
resource *parent,
                                continue;
                        }
                }
-               if (conflict->flags & flags & IORESOURCE_MUXED) {
+               if (flags & IORESOURCE_MUXED) {
+                       if (!(conflict->flags & IORESOURCE_MUXED))
+                               printk(KERN_ERR "Resource conflict between 
muxed \"%s\" and non-muxed \"%s\" I/O regions!\n", res->name, conflict->name);
                        add_wait_queue(&muxed_resource_wait, &wait);
                        write_unlock(&resource_lock);
                        set_current_state(TASK_UNINTERRUPTIBLE);
-- 
2.9.4

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to