|
@@ -112,17 +112,15 @@ out:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+/* Requires RTNL */
|
|
|
static int macvtap_set_queue(struct net_device *dev, struct file *file,
|
|
|
struct macvtap_queue *q)
|
|
|
{
|
|
|
struct macvlan_dev *vlan = netdev_priv(dev);
|
|
|
- int err = -EBUSY;
|
|
|
|
|
|
- rtnl_lock();
|
|
|
if (vlan->numqueues == MAX_MACVTAP_QUEUES)
|
|
|
- goto out;
|
|
|
+ return -EBUSY;
|
|
|
|
|
|
- err = 0;
|
|
|
rcu_assign_pointer(q->vlan, vlan);
|
|
|
rcu_assign_pointer(vlan->taps[vlan->numvtaps], q);
|
|
|
sock_hold(&q->sk);
|
|
@@ -136,9 +134,7 @@ static int macvtap_set_queue(struct net_device *dev, struct file *file,
|
|
|
vlan->numvtaps++;
|
|
|
vlan->numqueues++;
|
|
|
|
|
|
-out:
|
|
|
- rtnl_unlock();
|
|
|
- return err;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static int macvtap_disable_queue(struct macvtap_queue *q)
|
|
@@ -454,11 +450,12 @@ static void macvtap_sock_destruct(struct sock *sk)
|
|
|
static int macvtap_open(struct inode *inode, struct file *file)
|
|
|
{
|
|
|
struct net *net = current->nsproxy->net_ns;
|
|
|
- struct net_device *dev = dev_get_by_macvtap_minor(iminor(inode));
|
|
|
+ struct net_device *dev;
|
|
|
struct macvtap_queue *q;
|
|
|
- int err;
|
|
|
+ int err = -ENODEV;
|
|
|
|
|
|
- err = -ENODEV;
|
|
|
+ rtnl_lock();
|
|
|
+ dev = dev_get_by_macvtap_minor(iminor(inode));
|
|
|
if (!dev)
|
|
|
goto out;
|
|
|
|
|
@@ -498,6 +495,7 @@ out:
|
|
|
if (dev)
|
|
|
dev_put(dev);
|
|
|
|
|
|
+ rtnl_unlock();
|
|
|
return err;
|
|
|
}
|
|
|
|