X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fusb%2Fmon%2Fmon_main.c;fp=drivers%2Fusb%2Fmon%2Fmon_main.c;h=c34944c75047e2e50307f15af5abcf1f5c4931a7;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=275a66f8305878b2f435506e675a851454b586af;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/usb/mon/mon_main.c b/drivers/usb/mon/mon_main.c index 275a66f83..c34944c75 100644 --- a/drivers/usb/mon/mon_main.c +++ b/drivers/usb/mon/mon_main.c @@ -12,7 +12,6 @@ #include #include #include -#include #include "usb_mon.h" #include "../core/hcd.h" @@ -24,7 +23,7 @@ static void mon_dissolve(struct mon_bus *mbus, struct usb_bus *ubus); static void mon_bus_drop(struct kref *r); static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus); -DEFINE_MUTEX(mon_lock); +DECLARE_MUTEX(mon_lock); static struct dentry *mon_dir; /* /dbg/usbmon */ static LIST_HEAD(mon_buses); /* All buses we know: struct mon_bus */ @@ -97,7 +96,6 @@ static void mon_submit(struct usb_bus *ubus, struct urb *urb) if (mbus->nreaders == 0) goto out_locked; - mbus->cnt_events++; list_for_each (pos, &mbus->r_list) { r = list_entry(pos, struct mon_reader, r_link); r->rnf_submit(r->r_data, urb); @@ -114,32 +112,20 @@ out_unlocked: /* */ -static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int error) +static void mon_submit_error(struct usb_bus *ubus, struct urb *urb, int err) { struct mon_bus *mbus; - unsigned long flags; - struct list_head *pos; - struct mon_reader *r; mbus = ubus->mon_bus; if (mbus == NULL) goto out_unlocked; - spin_lock_irqsave(&mbus->lock, flags); - if (mbus->nreaders == 0) - goto out_locked; - - mbus->cnt_events++; - list_for_each (pos, &mbus->r_list) { - r = list_entry(pos, struct mon_reader, r_link); - r->rnf_error(r->r_data, urb, error); - } + /* + * XXX Capture the error code and the 'E' event. + */ - spin_unlock_irqrestore(&mbus->lock, flags); return; -out_locked: - spin_unlock_irqrestore(&mbus->lock, flags); out_unlocked: return; } @@ -165,7 +151,6 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb) } spin_lock_irqsave(&mbus->lock, flags); - mbus->cnt_events++; list_for_each (pos, &mbus->r_list) { r = list_entry(pos, struct mon_reader, r_link); r->rnf_complete(r->r_data, urb); @@ -177,6 +162,7 @@ static void mon_complete(struct usb_bus *ubus, struct urb *urb) /* * Stop monitoring. + * Obviously this must be well locked, so no need to play with mb's. */ static void mon_stop(struct mon_bus *mbus) { @@ -210,14 +196,14 @@ static void mon_bus_remove(struct usb_bus *ubus) { struct mon_bus *mbus = ubus->mon_bus; - mutex_lock(&mon_lock); + down(&mon_lock); list_del(&mbus->bus_link); debugfs_remove(mbus->dent_t); debugfs_remove(mbus->dent_s); mon_dissolve(mbus, ubus); kref_put(&mbus->ref, mon_bus_drop); - mutex_unlock(&mon_lock); + up(&mon_lock); } static int mon_notify(struct notifier_block *self, unsigned long action, @@ -290,8 +276,9 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) char name[NAMESZ]; int rc; - if ((mbus = kzalloc(sizeof(struct mon_bus), GFP_KERNEL)) == NULL) + if ((mbus = kmalloc(sizeof(struct mon_bus), GFP_KERNEL)) == NULL) goto err_alloc; + memset(mbus, 0, sizeof(struct mon_bus)); kref_init(&mbus->ref); spin_lock_init(&mbus->lock); INIT_LIST_HEAD(&mbus->r_list); @@ -320,9 +307,9 @@ static void mon_bus_init(struct dentry *mondir, struct usb_bus *ubus) goto err_create_s; mbus->dent_s = d; - mutex_lock(&mon_lock); + down(&mon_lock); list_add_tail(&mbus->bus_link, &mon_buses); - mutex_unlock(&mon_lock); + up(&mon_lock); return; err_create_s: @@ -360,11 +347,11 @@ static int __init mon_init(void) usb_register_notify(&mon_nb); - mutex_lock(&usb_bus_list_lock); + down(&usb_bus_list_lock); list_for_each_entry (ubus, &usb_bus_list, bus_list) { mon_bus_init(mondir, ubus); } - mutex_unlock(&usb_bus_list_lock); + up(&usb_bus_list_lock); return 0; } @@ -376,7 +363,7 @@ static void __exit mon_exit(void) usb_unregister_notify(&mon_nb); usb_mon_deregister(); - mutex_lock(&mon_lock); + down(&mon_lock); while (!list_empty(&mon_buses)) { p = mon_buses.next; mbus = list_entry(p, struct mon_bus, bus_link); @@ -400,7 +387,7 @@ static void __exit mon_exit(void) mon_dissolve(mbus, mbus->u_bus); kref_put(&mbus->ref, mon_bus_drop); } - mutex_unlock(&mon_lock); + up(&mon_lock); debugfs_remove(mon_dir); }