datapath: Use RCU dereference in vport_get_ifindex().
authorJesse Gross <jesse@nicira.com>
Fri, 24 Dec 2010 00:47:45 +0000 (16:47 -0800)
committerJesse Gross <jesse@nicira.com>
Wed, 29 Dec 2010 18:42:10 +0000 (10:42 -0800)
If we don't have an ifindex for a device (because it is a virtual
port), we fall back to using the ifindex of the local port.
However, we weren't properly dereferencing the vport from the ports
array, so this adds that.  This isn't a real problem though, because
the local port always exists and never changes as long as the
datapath exists.

Found with sparse.

Signed-off-by: Jesse Gross <jesse@nicira.com>
Acked-by: Ben Pfaff <blp@nicira.com>
datapath/vport.c

index 9e847e5..6c053ac 100644 (file)
@@ -928,10 +928,10 @@ unsigned char vport_get_operstate(const struct vport *vport)
  *
  * @vport: vport from which to retrieve index
  *
- * Retrieves the system interface index of the given device.  Not all devices
- * will have system indexes, in which case the index of the datapath local
- * port is returned.  Returns a negative index on error.  Either RTNL lock or
- * rcu_read_lock must be held.
+ * Retrieves the system interface index of the given device.  Not all
+ * devices will have system indexes, in which case the index of the
+ * datapath local port is returned.  Returns a negative index on error.
+ * Either RTNL lock or rcu_read_lock must be held.
  */
 int vport_get_ifindex(const struct vport *vport)
 {
@@ -940,7 +940,8 @@ int vport_get_ifindex(const struct vport *vport)
 
        /* If we don't actually have an ifindex, use the local port's.
         * Userspace doesn't check it anyways. */
-       return vport_get_ifindex(vport->dp->ports[ODPP_LOCAL]);
+       return vport_get_ifindex(rcu_dereference_rtnl(vport->dp->
+                                               ports[ODPP_LOCAL]));
 }
 
 /**