macvtap: introduce macvtap_get_vlan()
authorJason Wang <jasowang@redhat.com>
Wed, 5 Jun 2013 23:54:36 +0000 (23:54 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 8 Jun 2013 06:49:08 +0000 (23:49 -0700)
Factor out the device holding logic to a macvtap_get_vlan(), this will be also
used by multiqueue API.

Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/macvtap.c

index 8949631c080c6145bd5abbfd1e92e59f304e5ade..d18130b3fe0d93e09c6e1ab25ca41bc412984bd0 100644 (file)
@@ -893,6 +893,24 @@ out:
        return ret;
 }
 
+static struct macvlan_dev *macvtap_get_vlan(struct macvtap_queue *q)
+{
+       struct macvlan_dev *vlan;
+
+       rcu_read_lock_bh();
+       vlan = rcu_dereference_bh(q->vlan);
+       if (vlan)
+               dev_hold(vlan->dev);
+       rcu_read_unlock_bh();
+
+       return vlan;
+}
+
+static void macvtap_put_vlan(struct macvlan_dev *vlan)
+{
+       dev_put(vlan->dev);
+}
+
 /*
  * provide compatibility with generic tun/tap interface
  */
@@ -924,12 +942,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
                return ret;
 
        case TUNGETIFF:
-               rcu_read_lock_bh();
-               vlan = rcu_dereference_bh(q->vlan);
-               if (vlan)
-                       dev_hold(vlan->dev);
-               rcu_read_unlock_bh();
-
+               vlan = macvtap_get_vlan(q);
                if (!vlan)
                        return -ENOLINK;
 
@@ -937,7 +950,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
                if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) ||
                    put_user(q->flags, &ifr->ifr_flags))
                        ret = -EFAULT;
-               dev_put(vlan->dev);
+               macvtap_put_vlan(vlan);
                return ret;
 
        case TUNGETFEATURES: