USB: Don't use GFP_KERNEL while we cannot reset a storage device
Memory allocations with GFP_KERNEL can cause IO to a storage device which can fail resulting in a need to reset the device. Therefore GFP_KERNEL cannot be safely used between usb_lock_device() and usb_unlock_device(). Replace by GFP_NOIO. Signed-off-by: Oliver Neukum <oliver@neukum.org> Cc: stable <stable@kernel.org> Cc: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
a91b593edd
commit
acbe2febe7
@ -494,7 +494,7 @@ static ssize_t usb_device_dump(char __user **buffer, size_t *nbytes,
|
||||
return 0;
|
||||
/* allocate 2^1 pages = 8K (on i386);
|
||||
* should be more than enough for one device */
|
||||
pages_start = (char *)__get_free_pages(GFP_KERNEL, 1);
|
||||
pages_start = (char *)__get_free_pages(GFP_NOIO, 1);
|
||||
if (!pages_start)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -906,11 +906,11 @@ char *usb_cache_string(struct usb_device *udev, int index)
|
||||
if (index <= 0)
|
||||
return NULL;
|
||||
|
||||
buf = kmalloc(MAX_USB_STRING_SIZE, GFP_KERNEL);
|
||||
buf = kmalloc(MAX_USB_STRING_SIZE, GFP_NOIO);
|
||||
if (buf) {
|
||||
len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE);
|
||||
if (len > 0) {
|
||||
smallbuf = kmalloc(++len, GFP_KERNEL);
|
||||
smallbuf = kmalloc(++len, GFP_NOIO);
|
||||
if (!smallbuf)
|
||||
return buf;
|
||||
memcpy(smallbuf, buf, len);
|
||||
@ -1731,7 +1731,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
||||
if (cp) {
|
||||
nintf = cp->desc.bNumInterfaces;
|
||||
new_interfaces = kmalloc(nintf * sizeof(*new_interfaces),
|
||||
GFP_KERNEL);
|
||||
GFP_NOIO);
|
||||
if (!new_interfaces) {
|
||||
dev_err(&dev->dev, "Out of memory\n");
|
||||
return -ENOMEM;
|
||||
@ -1740,7 +1740,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
||||
for (; n < nintf; ++n) {
|
||||
new_interfaces[n] = kzalloc(
|
||||
sizeof(struct usb_interface),
|
||||
GFP_KERNEL);
|
||||
GFP_NOIO);
|
||||
if (!new_interfaces[n]) {
|
||||
dev_err(&dev->dev, "Out of memory\n");
|
||||
ret = -ENOMEM;
|
||||
|
Loading…
Reference in New Issue
Block a user