datapath: Use local variable for freeing on flow put error.
authorJesse Gross <jesse@nicira.com>
Fri, 24 Dec 2010 05:50:49 +0000 (21:50 -0800)
committerJesse Gross <jesse@nicira.com>
Wed, 29 Dec 2010 18:43:08 +0000 (10:43 -0800)
If inserting a flow failed and we need to free the actions, we
currently directly free them from the flow struct.  This is fine
but it makes sparse complain about directly accessing an RCU
protected field.  We could insert some casts to avoid this but
it's cleaner to just free the data from the local variable
instead.

Found with sparse.

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

index 3d5629d32b8b4b9dd1830d33e5a6cc6420f17098..8e76af2ecae1a4ddc9edac27a9aa11ad5497d957 100644 (file)
@@ -823,6 +823,7 @@ static int do_put_flow(struct datapath *dp, struct odp_flow_put *uf,
        struct tbl_node *flow_node;
        struct sw_flow *flow;
        struct tbl *table;
+       struct sw_flow_actions *acts = NULL;
        int error;
        u32 hash;
 
@@ -831,8 +832,6 @@ static int do_put_flow(struct datapath *dp, struct odp_flow_put *uf,
        flow_node = tbl_lookup(table, &uf->flow.key, hash, flow_cmp);
        if (!flow_node) {
                /* No such flow. */
-               struct sw_flow_actions *acts;
-
                error = -ENOENT;
                if (!(uf->flags & ODPPF_CREATE))
                        goto error;
@@ -906,7 +905,7 @@ static int do_put_flow(struct datapath *dp, struct odp_flow_put *uf,
        return 0;
 
 error_free_flow_acts:
-       kfree(flow->sf_acts);
+       kfree(acts);
 error_free_flow:
        flow->sf_acts = NULL;
        flow_put(flow);