Message ID | 20111214062943.GD7499@elgon.mountain |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Le mercredi 14 décembre 2011 à 09:29 +0300, Dan Carpenter a écrit : > 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> > --- > I haven't tested this, and I'm not super familiar with this code. > Please review it carefully. > Acked-by: Eric Dumazet <eric.dumazet@gmail.com> -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Wed, Dec 14, 2011 at 07:29:43AM CET, dan.carpenter@oracle.com wrote: >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> >--- >I haven't tested this, and I'm not super familiar with this code. >Please review it carefully. > >diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c >index 1414c93..4d39d80 100644 >--- a/net/8021q/vlan_core.c >+++ b/net/8021q/vlan_core.c >@@ -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); Acked-by: Jiri Pirko <jpirko@redhat.com> Thanks Dan! -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
From: Dan Carpenter <dan.carpenter@oracle.com> Date: Wed, 14 Dec 2011 09:29:43 +0300 > 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> Applied. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c index 1414c93..4d39d80 100644 --- a/net/8021q/vlan_core.c +++ b/net/8021q/vlan_core.c @@ -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);
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> --- I haven't tested this, and I'm not super familiar with this code. Please review it carefully. -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html