Commit 1431d2a4 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: get rid of urb->lock

Now that urb->status isn't used, urb->lock doesn't protect anything.
This patch (as980) removes it and replaces it with a private mutex in
the one remaining place it was still used: usb_kill_urb.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 4a00027d
...@@ -39,7 +39,6 @@ void usb_init_urb(struct urb *urb) ...@@ -39,7 +39,6 @@ void usb_init_urb(struct urb *urb)
if (urb) { if (urb) {
memset(urb, 0, sizeof(*urb)); memset(urb, 0, sizeof(*urb));
kref_init(&urb->kref); kref_init(&urb->kref);
spin_lock_init(&urb->lock);
INIT_LIST_HEAD(&urb->anchor_list); INIT_LIST_HEAD(&urb->anchor_list);
} }
} }
...@@ -541,19 +540,21 @@ int usb_unlink_urb(struct urb *urb) ...@@ -541,19 +540,21 @@ int usb_unlink_urb(struct urb *urb)
*/ */
void usb_kill_urb(struct urb *urb) void usb_kill_urb(struct urb *urb)
{ {
static DEFINE_MUTEX(reject_mutex);
might_sleep(); might_sleep();
if (!(urb && urb->dev && urb->ep)) if (!(urb && urb->dev && urb->ep))
return; return;
spin_lock_irq(&urb->lock); mutex_lock(&reject_mutex);
++urb->reject; ++urb->reject;
spin_unlock_irq(&urb->lock); mutex_unlock(&reject_mutex);
usb_hcd_unlink_urb(urb, -ENOENT); usb_hcd_unlink_urb(urb, -ENOENT);
wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0); wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0);
spin_lock_irq(&urb->lock); mutex_lock(&reject_mutex);
--urb->reject; --urb->reject;
spin_unlock_irq(&urb->lock); mutex_unlock(&reject_mutex);
} }
/** /**
......
...@@ -1241,7 +1241,6 @@ struct urb ...@@ -1241,7 +1241,6 @@ struct urb
{ {
/* private: usb core and host controller only fields in the urb */ /* private: usb core and host controller only fields in the urb */
struct kref kref; /* reference count of the URB */ struct kref kref; /* reference count of the URB */
spinlock_t lock; /* lock for the URB */
void *hcpriv; /* private data for host controller */ void *hcpriv; /* private data for host controller */
atomic_t use_count; /* concurrent submissions counter */ atomic_t use_count; /* concurrent submissions counter */
u8 reject; /* submissions will fail */ u8 reject; /* submissions will fail */
...@@ -1299,7 +1298,6 @@ static inline void usb_fill_control_urb (struct urb *urb, ...@@ -1299,7 +1298,6 @@ static inline void usb_fill_control_urb (struct urb *urb,
usb_complete_t complete_fn, usb_complete_t complete_fn,
void *context) void *context)
{ {
spin_lock_init(&urb->lock);
urb->dev = dev; urb->dev = dev;
urb->pipe = pipe; urb->pipe = pipe;
urb->setup_packet = setup_packet; urb->setup_packet = setup_packet;
...@@ -1330,7 +1328,6 @@ static inline void usb_fill_bulk_urb (struct urb *urb, ...@@ -1330,7 +1328,6 @@ static inline void usb_fill_bulk_urb (struct urb *urb,
usb_complete_t complete_fn, usb_complete_t complete_fn,
void *context) void *context)
{ {
spin_lock_init(&urb->lock);
urb->dev = dev; urb->dev = dev;
urb->pipe = pipe; urb->pipe = pipe;
urb->transfer_buffer = transfer_buffer; urb->transfer_buffer = transfer_buffer;
...@@ -1366,7 +1363,6 @@ static inline void usb_fill_int_urb (struct urb *urb, ...@@ -1366,7 +1363,6 @@ static inline void usb_fill_int_urb (struct urb *urb,
void *context, void *context,
int interval) int interval)
{ {
spin_lock_init(&urb->lock);
urb->dev = dev; urb->dev = dev;
urb->pipe = pipe; urb->pipe = pipe;
urb->transfer_buffer = transfer_buffer; urb->transfer_buffer = transfer_buffer;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment