datapath: dp_sysfs_add_dp() needs RTNL lock.
authorJesse Gross <jesse@nicira.com>
Wed, 8 Dec 2010 20:02:42 +0000 (12:02 -0800)
committerJesse Gross <jesse@nicira.com>
Fri, 10 Dec 2010 01:43:37 +0000 (17:43 -0800)
We currently drop RTNL before adding a new datapath to sysfs but
then access the dp data structures.  This moves the call to
dp_sysfs_add_dp() before we drop the locks to prevent a potential
race.  All other calls to sysfs functions already hold RTNL.

Found with lockdep.

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

index 65d25c2a2f313c9ef7d5ba90baa194dbb717f327..08e7450e530759af3cd2e0a30fbd353d6898ec94 100644 (file)
@@ -267,11 +267,11 @@ static int create_dp(int dp_idx, const char __user *devnamep)
                goto err_destroy_local_port;
 
        rcu_assign_pointer(dps[dp_idx], dp);
+       dp_sysfs_add_dp(dp);
+
        mutex_unlock(&dp_mutex);
        rtnl_unlock();
 
-       dp_sysfs_add_dp(dp);
-
        return 0;
 
 err_destroy_local_port: