Hi, On Sunday 27 September 2009 10:30:34 tom.leiming@xxxxxxxxx wrote: > From: Ming Lei <tom.leiming@xxxxxxxxx> > > This patch sets stream->urb_size as psize*npackets > before calling uvc_alloc_urb_buffers, which may fix > a possible failure of usb_buffer_free in case usb_buffer_alloc > returns NULL. The patch is based on the ideas below: > > 1,If usb_buffer_alloc can't allocate a buffer sucessfully, > uvc_free_urb_buffers will be called to free the allocated > buffers, and stream->urb_size is required to be passed to > usb_buffer_free; > > 2,uvc_free_urb_buffers can reset stream->urb_size. > > This patch is against linux-v2.6.31-next-20090926. Good catch, thanks. > Signed-off-by: Ming Lei <tom.leiming@xxxxxxxxx> Acked-by: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> I've applied the patch to my tree and I'll send a pull request. > --- > drivers/media/video/uvc/uvc_video.c | 4 ++-- > 1 files changed, 2 insertions(+), 2 deletions(-) > > diff --git a/drivers/media/video/uvc/uvc_video.c > b/drivers/media/video/uvc/uvc_video.c index f960e8e..31dba66 100644 > --- a/drivers/media/video/uvc/uvc_video.c > +++ b/drivers/media/video/uvc/uvc_video.c > @@ -768,9 +768,10 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming > *stream, > > /* Retry allocations until one succeed. */ > for (; npackets > 1; npackets /= 2) { > + stream->urb_size = psize * npackets; > for (i = 0; i < UVC_URBS; ++i) { > stream->urb_buffer[i] = usb_buffer_alloc( > - stream->dev->udev, psize * npackets, > + stream->dev->udev, stream->urb_size, > gfp_flags | __GFP_NOWARN, &stream->urb_dma[i]); > if (!stream->urb_buffer[i]) { > uvc_free_urb_buffers(stream); > @@ -779,7 +780,6 @@ static int uvc_alloc_urb_buffers(struct uvc_streaming > *stream, } > > if (i == UVC_URBS) { > - stream->urb_size = psize * npackets; > return npackets; > } > } > -- Regards, Laurent Pinchart -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html