From 98bc7b8d125c2756deadfc889dcefd4e6f2fcd02 Mon Sep 17 00:00:00 2001 From: Hans de Goede Date: Fri, 9 Mar 2012 11:31:07 +0100 Subject: [PATCH] Don't print an error when libusb_cancel_transfer() fails with NOT_FOUND As stated in the documentation for libusb_cancel_transfer(), LIBUSB_ERROR_NOT_FOUND is an expected return value for libusb_cancel_transfer() under certain circumstances, so printing an error every time this happens is undesirable. Even more so because under Linux IOCTL_USBFS_DISCARDURB sets errno to EINVAL when the kernel can't not find the urb in the kernel's urbs-in-flight list, which means that the urb has already completed at the host controller level but it has not necessarily been reaped yet. IOW under Linux libusb_cancel_transfer() may yield a result of LIBUSB_ERROR_NOT_FOUND *before* the transfer's callback has been called! In conclusion there is no way for applications to avoid calling libusb_cancel_transfer() on already completed transfers, and these errors can and do happen frequently for some USB traffic. Signed-off-by: Hans de Goede --- libusb/io.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libusb/io.c b/libusb/io.c index 7ee2ccb..e9bd312 100644 --- a/libusb/io.c +++ b/libusb/io.c @@ -1353,8 +1353,11 @@ int API_EXPORTED libusb_cancel_transfer(struct libusb_transfer *transfer) usbi_mutex_lock(&itransfer->lock); r = usbi_backend->cancel_transfer(itransfer); if (r < 0) { - usbi_err(TRANSFER_CTX(transfer), - "cancel transfer failed error %d", r); + if (r != LIBUSB_ERROR_NOT_FOUND) + usbi_err(TRANSFER_CTX(transfer), + "cancel transfer failed error %d", r); + else + usbi_dbg("cancel transfer failed error %d", r); if (r == LIBUSB_ERROR_NO_DEVICE) itransfer->flags |= USBI_TRANSFER_DEVICE_DISAPPEARED;