diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index ac4273dddf34a59c0ccb0f7d0a4c62880674978c..52ec44b828f3530dd8dfdb33e8452be6aa2a819f 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -13,6 +13,9 @@ static void urb_destroy(struct kref *kref)
 {
 	struct urb *urb = to_urb(kref);
 
+	if (urb->transfer_flags & URB_FREE_BUFFER)
+		kfree(urb->transfer_buffer);
+
 	kfree(urb);
 }
 
diff --git a/include/linux/usb.h b/include/linux/usb.h
index efce9a4c511c6bead63767868e919500ea89f6f1..533c32374e01e58e36509a86695608060adf4761 100644
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -994,6 +994,7 @@ extern int usb_disabled(void);
 #define URB_ZERO_PACKET		0x0040	/* Finish bulk OUT with short packet */
 #define URB_NO_INTERRUPT	0x0080	/* HINT: no non-error interrupt
 					 * needed */
+#define URB_FREE_BUFFER		0x0100	/* Free transfer buffer with the URB */
 
 struct usb_iso_packet_descriptor {
 	unsigned int offset;