From 58f6d579e975275679e69a09acbf1a297ddad31d Mon Sep 17 00:00:00 2001 From: Florian Mickler Date: Mon, 21 Mar 2011 07:19:13 -0300 Subject: [PATCH] --- yaml --- r: 250191 b: refs/heads/master c: ee52f120b0adc469f5c67815cef79ecdd01cfd14 h: refs/heads/master i: 250189: f3fcd4d900f1f6c7ed46938aa0165a5e84358b6e 250187: d50878ef5ec482b2ca98222d9add58bdd4de5d19 250183: 2421cc8bfafee83fb82ebec1191ad82dc6761e2c 250175: eba06a09c96006826fd6305f1eb6f95d6752fe34 v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb/dvb-usb/vp702x.c | 23 +++++++++++++++++++---- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index fad2f9372e8f..5df2e24879b2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8ea793aa736137aa2453ce6877bb31a4b15dc28d +refs/heads/master: ee52f120b0adc469f5c67815cef79ecdd01cfd14 diff --git a/trunk/drivers/media/dvb/dvb-usb/vp702x.c b/trunk/drivers/media/dvb/dvb-usb/vp702x.c index 6dd50bc8418e..54355f84a98f 100644 --- a/trunk/drivers/media/dvb/dvb-usb/vp702x.c +++ b/trunk/drivers/media/dvb/dvb-usb/vp702x.c @@ -116,13 +116,28 @@ int vp702x_usb_inout_op(struct dvb_usb_device *d, u8 *o, int olen, u8 *i, int il static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o, int olen, u8 *i, int ilen, int msec) { + struct vp702x_device_state *st = d->priv; int ret = 0; u8 *buf; int buflen = max(olen + 2, ilen + 1); - buf = kmalloc(buflen, GFP_KERNEL); - if (!buf) - return -ENOMEM; + ret = mutex_lock_interruptible(&st->buf_mutex); + if (ret < 0) + return ret; + + if (buflen > st->buf_len) { + buf = kmalloc(buflen, GFP_KERNEL); + if (!buf) { + mutex_unlock(&st->buf_mutex); + return -ENOMEM; + } + info("successfully reallocated a bigger buffer"); + kfree(st->buf); + st->buf = buf; + st->buf_len = buflen; + } else { + buf = st->buf; + } buf[0] = 0x00; buf[1] = cmd; @@ -132,8 +147,8 @@ static int vp702x_usb_inout_cmd(struct dvb_usb_device *d, u8 cmd, u8 *o, if (ret == 0) memcpy(i, &buf[1], ilen); + mutex_unlock(&st->buf_mutex); - kfree(buf); return ret; }