vhost: check owner before we overwrite ubuf_info
If device has an owner, we shouldn't touch ubuf_info since it might be in use. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
c2020be3c3
commit
05c0535194
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 *);
|
||||
|
|
Loading…
Reference in New Issue
Block a user