diff options
author | Jeff Dike <jdike@addtoit.com> | 2010-03-04 22:10:14 +0100 |
---|---|---|
committer | Michael S. Tsirkin <mst@redhat.com> | 2010-03-07 12:28:53 +0100 |
commit | 1dace8c801ac531022bd31a7316a6b4351837617 (patch) | |
tree | 4a2edd69b3fb495a5eaaf7426e8a49ad5a56f990 /drivers/vhost/net.c | |
parent | vhost-net: restart tx poll on sk_sndbuf full (diff) | |
download | linux-1dace8c801ac531022bd31a7316a6b4351837617.tar.xz linux-1dace8c801ac531022bd31a7316a6b4351837617.zip |
vhost: fix error path in vhost_net_set_backend
An error could cause vhost_net_set_backend to exit without unlocking
vq->mutex. Fix this.
Signed-off-by: Jeff Dike <jdike@linux.intel.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Diffstat (limited to 'drivers/vhost/net.c')
-rw-r--r-- | drivers/vhost/net.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index ad37da2b6cb5..fcafb6b170fb 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c @@ -508,12 +508,12 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) /* Verify that ring has been setup correctly. */ if (!vhost_vq_access_ok(vq)) { r = -EFAULT; - goto err; + goto err_vq; } sock = get_socket(fd); if (IS_ERR(sock)) { r = PTR_ERR(sock); - goto err; + goto err_vq; } /* start polling new socket */ @@ -524,12 +524,14 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd) vhost_net_disable_vq(n, vq); rcu_assign_pointer(vq->private_data, sock); vhost_net_enable_vq(n, vq); - mutex_unlock(&vq->mutex); done: if (oldsock) { vhost_net_flush_vq(n, index); fput(oldsock->file); } + +err_vq: + mutex_unlock(&vq->mutex); err: mutex_unlock(&n->dev.mutex); return r; |