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;
|
return 0;
|
||||||
/* allocate 2^1 pages = 8K (on i386);
|
/* allocate 2^1 pages = 8K (on i386);
|
||||||
* should be more than enough for one device */
|
* 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)
|
if (!pages_start)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
|
|
@ -906,11 +906,11 @@ char *usb_cache_string(struct usb_device *udev, int index)
|
||||||
if (index <= 0)
|
if (index <= 0)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
buf = kmalloc(MAX_USB_STRING_SIZE, GFP_KERNEL);
|
buf = kmalloc(MAX_USB_STRING_SIZE, GFP_NOIO);
|
||||||
if (buf) {
|
if (buf) {
|
||||||
len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE);
|
len = usb_string(udev, index, buf, MAX_USB_STRING_SIZE);
|
||||||
if (len > 0) {
|
if (len > 0) {
|
||||||
smallbuf = kmalloc(++len, GFP_KERNEL);
|
smallbuf = kmalloc(++len, GFP_NOIO);
|
||||||
if (!smallbuf)
|
if (!smallbuf)
|
||||||
return buf;
|
return buf;
|
||||||
memcpy(smallbuf, buf, len);
|
memcpy(smallbuf, buf, len);
|
||||||
|
@ -1731,7 +1731,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
||||||
if (cp) {
|
if (cp) {
|
||||||
nintf = cp->desc.bNumInterfaces;
|
nintf = cp->desc.bNumInterfaces;
|
||||||
new_interfaces = kmalloc(nintf * sizeof(*new_interfaces),
|
new_interfaces = kmalloc(nintf * sizeof(*new_interfaces),
|
||||||
GFP_KERNEL);
|
GFP_NOIO);
|
||||||
if (!new_interfaces) {
|
if (!new_interfaces) {
|
||||||
dev_err(&dev->dev, "Out of memory\n");
|
dev_err(&dev->dev, "Out of memory\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
@ -1740,7 +1740,7 @@ int usb_set_configuration(struct usb_device *dev, int configuration)
|
||||||
for (; n < nintf; ++n) {
|
for (; n < nintf; ++n) {
|
||||||
new_interfaces[n] = kzalloc(
|
new_interfaces[n] = kzalloc(
|
||||||
sizeof(struct usb_interface),
|
sizeof(struct usb_interface),
|
||||||
GFP_KERNEL);
|
GFP_NOIO);
|
||||||
if (!new_interfaces[n]) {
|
if (!new_interfaces[n]) {
|
||||||
dev_err(&dev->dev, "Out of memory\n");
|
dev_err(&dev->dev, "Out of memory\n");
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
|
Loading…
Reference in New Issue