summaryrefslogtreecommitdiffstats
path: root/drivers/net/macvtap.c
diff options
context:
space:
mode:
authorJason Wang <jasowang@redhat.com>2013-06-05 19:54:36 -0400
committerDavid S. Miller <davem@davemloft.net>2013-06-08 02:49:08 -0400
commit8f475a318aaa37f0168a8ab99f2faa251e5638de (patch)
tree799463540c03b1370d6244ee741463a09e34a958 /drivers/net/macvtap.c
parent1d2f41ed23343e083566339574807ca7ea75dbba (diff)
macvtap: introduce macvtap_get_vlan()
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>
Diffstat (limited to 'drivers/net/macvtap.c')
-rw-r--r--drivers/net/macvtap.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/drivers/net/macvtap.c b/drivers/net/macvtap.c
index 8949631c080c..d18130b3fe0d 100644
--- a/drivers/net/macvtap.c
+++ b/drivers/net/macvtap.c
@@ -893,6 +893,24 @@ out:
893 return ret; 893 return ret;
894} 894}
895 895
896static struct macvlan_dev *macvtap_get_vlan(struct macvtap_queue *q)
897{
898 struct macvlan_dev *vlan;
899
900 rcu_read_lock_bh();
901 vlan = rcu_dereference_bh(q->vlan);
902 if (vlan)
903 dev_hold(vlan->dev);
904 rcu_read_unlock_bh();
905
906 return vlan;
907}
908
909static void macvtap_put_vlan(struct macvlan_dev *vlan)
910{
911 dev_put(vlan->dev);
912}
913
896/* 914/*
897 * provide compatibility with generic tun/tap interface 915 * provide compatibility with generic tun/tap interface
898 */ 916 */
@@ -924,12 +942,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
924 return ret; 942 return ret;
925 943
926 case TUNGETIFF: 944 case TUNGETIFF:
927 rcu_read_lock_bh(); 945 vlan = macvtap_get_vlan(q);
928 vlan = rcu_dereference_bh(q->vlan);
929 if (vlan)
930 dev_hold(vlan->dev);
931 rcu_read_unlock_bh();
932
933 if (!vlan) 946 if (!vlan)
934 return -ENOLINK; 947 return -ENOLINK;
935 948
@@ -937,7 +950,7 @@ static long macvtap_ioctl(struct file *file, unsigned int cmd,
937 if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) || 950 if (copy_to_user(&ifr->ifr_name, vlan->dev->name, IFNAMSIZ) ||
938 put_user(q->flags, &ifr->ifr_flags)) 951 put_user(q->flags, &ifr->ifr_flags))
939 ret = -EFAULT; 952 ret = -EFAULT;
940 dev_put(vlan->dev); 953 macvtap_put_vlan(vlan);
941 return ret; 954 return ret;
942 955
943 case TUNGETFEATURES: 956 case TUNGETFEATURES: