diff options
-rw-r--r-- | drivers/vhost/net.c | 4 | ||||
-rw-r--r-- | drivers/vhost/vhost.c | 8 | ||||
-rw-r--r-- | drivers/vhost/vhost.h | 1 |
3 files changed, 12 insertions, 1 deletions
diff --git a/drivers/vhost/net.c b/drivers/vhost/net.c index b07d96b8c0d1..8cf5aece8c84 100644 --- a/drivers/vhost/net.c +++ b/drivers/vhost/net.c | |||
@@ -1054,6 +1054,10 @@ static long vhost_net_set_owner(struct vhost_net *n) | |||
1054 | int r; | 1054 | int r; |
1055 | 1055 | ||
1056 | mutex_lock(&n->dev.mutex); | 1056 | mutex_lock(&n->dev.mutex); |
1057 | if (vhost_dev_has_owner(&n->dev)) { | ||
1058 | r = -EBUSY; | ||
1059 | goto out; | ||
1060 | } | ||
1057 | r = vhost_net_set_ubuf_info(n); | 1061 | r = vhost_net_set_ubuf_info(n); |
1058 | if (r) | 1062 | if (r) |
1059 | goto out; | 1063 | goto out; |
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index beee7f5787e6..60aa5ad09a2f 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c | |||
@@ -344,13 +344,19 @@ static int vhost_attach_cgroups(struct vhost_dev *dev) | |||
344 | } | 344 | } |
345 | 345 | ||
346 | /* Caller should have device mutex */ | 346 | /* Caller should have device mutex */ |
347 | bool vhost_dev_has_owner(struct vhost_dev *dev) | ||
348 | { | ||
349 | return dev->mm; | ||
350 | } | ||
351 | |||
352 | /* Caller should have device mutex */ | ||
347 | long vhost_dev_set_owner(struct vhost_dev *dev) | 353 | long vhost_dev_set_owner(struct vhost_dev *dev) |
348 | { | 354 | { |
349 | struct task_struct *worker; | 355 | struct task_struct *worker; |
350 | int err; | 356 | int err; |
351 | 357 | ||
352 | /* Is there an owner already? */ | 358 | /* Is there an owner already? */ |
353 | if (dev->mm) { | 359 | if (vhost_dev_has_owner(dev)) { |
354 | err = -EBUSY; | 360 | err = -EBUSY; |
355 | goto err_mm; | 361 | goto err_mm; |
356 | } | 362 | } |
diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h index a7ad63592987..64adcf99ff33 100644 --- a/drivers/vhost/vhost.h +++ b/drivers/vhost/vhost.h | |||
@@ -133,6 +133,7 @@ struct vhost_dev { | |||
133 | 133 | ||
134 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs); | 134 | long vhost_dev_init(struct vhost_dev *, struct vhost_virtqueue **vqs, int nvqs); |
135 | long vhost_dev_set_owner(struct vhost_dev *dev); | 135 | long vhost_dev_set_owner(struct vhost_dev *dev); |
136 | bool vhost_dev_has_owner(struct vhost_dev *dev); | ||
136 | long vhost_dev_check_owner(struct vhost_dev *); | 137 | long vhost_dev_check_owner(struct vhost_dev *); |
137 | struct vhost_memory *vhost_dev_reset_owner_prepare(void); | 138 | struct vhost_memory *vhost_dev_reset_owner_prepare(void); |
138 | void vhost_dev_reset_owner(struct vhost_dev *, struct vhost_memory *); | 139 | void vhost_dev_reset_owner(struct vhost_dev *, struct vhost_memory *); |