[ovs-dev] [PATCH 04/10] datapath: Don't directly access port array in query_port().

Jesse Gross jesse at nicira.com
Wed Dec 29 04:50:42 UTC 2010


query_port() directly accesses the datapath port array, without
using any kind of RCU dereference.  It's OK, since it is holding
DP mutex but this adds an explicit check to make sparse happy.
It also simplifies the code path somewhat.

Found with sparse.

Signed-off-by: Jesse Gross <jesse at nicira.com>
---
 datapath/datapath.c |   29 ++++++++---------------------
 1 files changed, 8 insertions(+), 21 deletions(-)

diff --git a/datapath/datapath.c b/datapath/datapath.c
index 4df7e9f..d606913 100644
--- a/datapath/datapath.c
+++ b/datapath/datapath.c
@@ -1281,45 +1281,32 @@ static int put_port(const struct vport *p, struct odp_port __user *uop)
 static int query_port(struct datapath *dp, struct odp_port __user *uport)
 {
 	struct odp_port port;
+	struct vport *vport;
 
 	if (copy_from_user(&port, uport, sizeof port))
 		return -EFAULT;
 
 	if (port.devname[0]) {
-		struct vport *vport;
-		int err = 0;
-
 		port.devname[IFNAMSIZ - 1] = '\0';
 
 		vport_lock();
-		rcu_read_lock();
-
 		vport = vport_locate(port.devname);
-		if (!vport) {
-			err = -ENODEV;
-			goto error_unlock;
-		}
-		if (vport->dp != dp) {
-			err = -ENOENT;
-			goto error_unlock;
-		}
-
-		port.port = vport->port_no;
-
-error_unlock:
-		rcu_read_unlock();
 		vport_unlock();
 
-		if (err)
-			return err;
+		if (!vport)
+			return -ENODEV;
+		if (vport->dp != dp)
+			return -ENOENT;
 	} else {
 		if (port.port >= DP_MAX_PORTS)
 			return -EINVAL;
 		if (!dp->ports[port.port])
 			return -ENOENT;
+
+		vport = get_vport_protected(dp, port.port);
 	}
 
-	return put_port(dp->ports[port.port], uport);
+	return put_port(vport, uport);
 }
 
 static int do_list_ports(struct datapath *dp, struct odp_port __user *uports,
-- 
1.7.1





More information about the dev mailing list