Message ID | 1358351078-58915-2-git-send-email-jasowang@redhat.com |
---|---|
State | Changes Requested, archived |
Delegated to: | David Miller |
Headers | show |
On Wed, Jan 16, 2013 at 11:44:36PM +0800, Jason Wang wrote: > Currently, when vhost_init_used() fails the sock refcnt and ubufs were > leaked. Correct this by calling vhost_init_used() before assign ubufs and > restore the oldsock when it fails. > > Signed-off-by: Jason Wang <jasowang@redhat.com> Acked-by: Michael S. Tsirkin <mst@redhat.com> > --- > drivers/vhost/net.c | 16 +++++++++++----- > 1 files changed, 11 insertions(+), 5 deletions(-) > > diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c > index ebd08b2..d10ad6f 100644 > --- a/drivers/vhost/net.c > +++ b/drivers/vhost/net.c > @@ -827,15 +827,16 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) > r = PTR_ERR(ubufs); > goto err_ubufs; > } > - oldubufs = vq->ubufs; > - vq->ubufs = ubufs; > + > vhost_net_disable_vq(n, vq); > rcu_assign_pointer(vq->private_data, sock); > - vhost_net_enable_vq(n, vq); > - > r = vhost_init_used(vq); > if (r) > - goto err_vq; > + goto err_used; > + vhost_net_enable_vq(n, vq); > + > + oldubufs = vq->ubufs; > + vq->ubufs = ubufs; > > n->tx_packets = 0; > n->tx_zcopy_err = 0; > @@ -859,6 +860,11 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) > mutex_unlock(&n->dev.mutex); > return 0; > > +err_used: > + rcu_assign_pointer(vq->private_data, oldsock); > + vhost_net_enable_vq(n, vq); > + if (ubufs) > + vhost_ubuf_put_and_wait(ubufs); > err_ubufs: > fput(sock->file); > err_vq: > -- > 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index ebd08b2..d10ad6f 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -827,15 +827,16 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) r = PTR_ERR(ubufs); goto err_ubufs; } - oldubufs = vq->ubufs; - vq->ubufs = ubufs; + vhost_net_disable_vq(n, vq); rcu_assign_pointer(vq->private_data, sock); - vhost_net_enable_vq(n, vq); - r = vhost_init_used(vq); if (r) - goto err_vq; + goto err_used; + vhost_net_enable_vq(n, vq); + + oldubufs = vq->ubufs; + vq->ubufs = ubufs; n->tx_packets = 0; n->tx_zcopy_err = 0; @@ -859,6 +860,11 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) mutex_unlock(&n->dev.mutex); return 0; +err_used: + rcu_assign_pointer(vq->private_data, oldsock); + vhost_net_enable_vq(n, vq); + if (ubufs) + vhost_ubuf_put_and_wait(ubufs); err_ubufs: fput(sock->file); err_vq:
Currently, when vhost_init_used() fails the sock refcnt and ubufs were leaked. Correct this by calling vhost_init_used() before assign ubufs and restore the oldsock when it fails. Signed-off-by: Jason Wang <jasowang@redhat.com> --- drivers/vhost/net.c | 16 +++++++++++----- 1 files changed, 11 insertions(+), 5 deletions(-)