vlan: add rtnl_dereference() annotations
authorDan Carpenter <dan.carpenter@oracle.com>
Tue, 13 Dec 2011 20:29:43 +0000 (20:29 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 14 Dec 2011 07:39:30 +0000 (02:39 -0500)
The original code generates a Sparse warning:
net/8021q/vlan_core.c:336:9:
error: incompatible types in comparison expression (different address spaces)

It's ok to dereference __rcu pointers here because we are holding the
RTNL lock.  I've added some calls to rtnl_dereference() to silence the
warning.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Acked-by: Eric Dumazet <eric.dumazet@gmail.com>
Acked-by: Jiri Pirko <jpirko@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/8021q/vlan_core.c

index 1414c931bd3fe797b826b769b331754b08880f9d..4d39d802be2cb48dab7825ca4c2591c4fec013bb 100644 (file)
@@ -326,14 +326,16 @@ int vlan_vids_add_by_dev(struct net_device *dev,
                         const struct net_device *by_dev)
 {
        struct vlan_vid_info *vid_info;
+       struct vlan_info *vlan_info;
        int err;
 
        ASSERT_RTNL();
 
-       if (!by_dev->vlan_info)
+       vlan_info = rtnl_dereference(by_dev->vlan_info);
+       if (!vlan_info)
                return 0;
 
-       list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list) {
+       list_for_each_entry(vid_info, &vlan_info->vid_list, list) {
                err = vlan_vid_add(dev, vid_info->vid);
                if (err)
                        goto unwind;
@@ -342,7 +344,7 @@ int vlan_vids_add_by_dev(struct net_device *dev,
 
 unwind:
        list_for_each_entry_continue_reverse(vid_info,
-                                            &by_dev->vlan_info->vid_list,
+                                            &vlan_info->vid_list,
                                             list) {
                vlan_vid_del(dev, vid_info->vid);
        }
@@ -355,13 +357,15 @@ void vlan_vids_del_by_dev(struct net_device *dev,
                          const struct net_device *by_dev)
 {
        struct vlan_vid_info *vid_info;
+       struct vlan_info *vlan_info;
 
        ASSERT_RTNL();
 
-       if (!by_dev->vlan_info)
+       vlan_info = rtnl_dereference(by_dev->vlan_info);
+       if (!vlan_info)
                return;
 
-       list_for_each_entry(vid_info, &by_dev->vlan_info->vid_list, list)
+       list_for_each_entry(vid_info, &vlan_info->vid_list, list)
                vlan_vid_del(dev, vid_info->vid);
 }
 EXPORT_SYMBOL(vlan_vids_del_by_dev);