diff options
author | Jason Wang <jasowang@redhat.com> | 2013-06-05 19:54:36 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-06-08 02:49:08 -0400 |
commit | 8f475a318aaa37f0168a8ab99f2faa251e5638de (patch) | |
tree | 799463540c03b1370d6244ee741463a09e34a958 /drivers/net/macvtap.c | |
parent | 1d2f41ed23343e083566339574807ca7ea75dbba (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.c | 27 |
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 | ||
896 | static 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 | |||
909 | static 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: |