Skip to content

Commit dbd380b

Browse files
committed
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
Pull misc fixes from Al Viro: "vhost race fix and a percpu_ref_init-caused cgroup double-free fix. The latter had manifested as buggered struct mount refcounting - those are also using percpu data structures, but anything that does percpu allocations could be hit" * 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: Fix double fget() in vhost_net_set_backend() percpu_ref_init(): clean ->percpu_count_ref on failure
2 parents db1fd3f + fb4554c commit dbd380b

File tree

2 files changed

+8
-8
lines changed

2 files changed

+8
-8
lines changed

drivers/vhost/net.c

+7-8
Original file line numberDiff line numberDiff line change
@@ -1450,13 +1450,9 @@ static struct socket *get_raw_socket(int fd)
14501450
return ERR_PTR(r);
14511451
}
14521452

1453-
static struct ptr_ring *get_tap_ptr_ring(int fd)
1453+
static struct ptr_ring *get_tap_ptr_ring(struct file *file)
14541454
{
14551455
struct ptr_ring *ring;
1456-
struct file *file = fget(fd);
1457-
1458-
if (!file)
1459-
return NULL;
14601456
ring = tun_get_tx_ring(file);
14611457
if (!IS_ERR(ring))
14621458
goto out;
@@ -1465,7 +1461,6 @@ static struct ptr_ring *get_tap_ptr_ring(int fd)
14651461
goto out;
14661462
ring = NULL;
14671463
out:
1468-
fput(file);
14691464
return ring;
14701465
}
14711466

@@ -1552,8 +1547,12 @@ static long vhost_net_set_backend(struct vhost_net *n, unsigned index, int fd)
15521547
r = vhost_net_enable_vq(n, vq);
15531548
if (r)
15541549
goto err_used;
1555-
if (index == VHOST_NET_VQ_RX)
1556-
nvq->rx_ring = get_tap_ptr_ring(fd);
1550+
if (index == VHOST_NET_VQ_RX) {
1551+
if (sock)
1552+
nvq->rx_ring = get_tap_ptr_ring(sock->file);
1553+
else
1554+
nvq->rx_ring = NULL;
1555+
}
15571556

15581557
oldubufs = nvq->ubufs;
15591558
nvq->ubufs = ubufs;

lib/percpu-refcount.c

+1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ int percpu_ref_init(struct percpu_ref *ref, percpu_ref_func_t *release,
7676
data = kzalloc(sizeof(*ref->data), gfp);
7777
if (!data) {
7878
free_percpu((void __percpu *)ref->percpu_count_ptr);
79+
ref->percpu_count_ptr = 0;
7980
return -ENOMEM;
8081
}
8182

0 commit comments

Comments
 (0)