From b8e3537772b780c28475e49275aff04bcb973e5c Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Thu, 6 Jun 2013 15:20:39 +0300 Subject: [PATCH] --- yaml --- r: 377013 b: refs/heads/master c: 05c05351943cc03bf5c77e86953b24ae6fb21368 h: refs/heads/master i: 377011: 21da4da23c0459a0a131da8b8420fc65db36e538 v: v3 --- [refs] | 2 +- trunk/drivers/vhost/net.c | 4 ++++ trunk/drivers/vhost/vhost.c | 8 +++++++- trunk/drivers/vhost/vhost.h | 1 + 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index cb30d1255b05..c39220760c1c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: c2020be3c35ab230b4ee046c262ddab3e0d3aab4 +refs/heads/master: 05c05351943cc03bf5c77e86953b24ae6fb21368 diff --git a/trunk/drivers/vhost/net.c b/trunk/drivers/vhost/net.c index b07d96b8c0d1..8cf5aece8c84 100644 --- a/trunk/drivers/vhost/net.c +++ b/trunk/drivers/vhost/net.c @@ -1054,6 +1054,10 @@ static long vhost_net_set_owner(struct vhost_net *n) int r; mutex_lock(&n->dev.mutex); + if (vhost_dev_has_owner(&n->dev)) { + r = -EBUSY; + goto out; + } r = vhost_net_set_ubuf_info(n); if (r) goto out; diff --git a/trunk/drivers/vhost/vhost.c b/trunk/drivers/vhost/vhost.c index beee7f5787e6..60aa5ad09a2f 100644 --- a/trunk/drivers/vhost/vhost.c +++ b/trunk/drivers/vhost/vhost.c @@ -343,6 +343,12 @@ static int vhost_attach_cgroups(struct vhost_dev *dev) return attach.ret; } +/* Caller should have device mutex */ +bool vhost_dev_has_owner(struct vhost_dev *dev) +{ + return dev->mm; +} + /* Caller should have device mutex */ long vhost_dev_set_owner(struct vhost_dev *dev) { @@ -350,7 +356,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev) int err; /* Is there an owner already? */ - if (dev->mm) { + if (vhost_dev_has_owner(dev)) { err = -EBUSY; goto err_mm; } diff --git a/trunk/drivers/vhost/vhost.h b/trunk/drivers/vhost/vhost.h index a7ad63592987..64adcf99ff33 100644 --- a/trunk/drivers/vhost/vhost.h +++ b/trunk/drivers/vhost/vhost.h @@ -133,6 +133,7 @@ struct vhost_dev { long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs); long vhost_dev_set_owner(struct vhost_dev *dev); +bool vhost_dev_has_owner(struct vhost_dev *dev); long vhost_dev_check_owner(struct vhost_dev *); struct vhost_memory *vhost_dev_reset_owner_prepare(void); void vhost_dev_reset_owner(struct vhost_dev *, struct vhost_memory *);