srp_transport: Fix attribute registration
authorBart Van Assche <bvanassche@acm.org>
Fri, 21 Oct 2011 17:31:07 +0000 (19:31 +0200)
committerRoland Dreier <roland@purestorage.com>
Sat, 1 Dec 2012 01:40:33 +0000 (17:40 -0800)
Register transport attributes after the attribute array has been set
up instead of before.  The current code can trigger a race condition
because the code reading the attribute array can run on another thread
than the code that initialized that array.  Make sure that any code
reading the attribute array will see all values written into that
array.

Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Cc: FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>
Cc: Robert Jennings <rcj@linux.vnet.ibm.com>
Acked-by: David Dillow <dillowda@ornl.gov>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/scsi/scsi_transport_srp.c

index 21a045e0559ff7ad9a209742f55b020b99adcb6b..07c4394624f1feddb21c7c267f476b05ad292af0 100644 (file)
@@ -324,13 +324,14 @@ srp_attach_transport(struct srp_function_template *ft)
        i->rport_attr_cont.ac.attrs = &i->rport_attrs[0];
        i->rport_attr_cont.ac.class = &srp_rport_class.class;
        i->rport_attr_cont.ac.match = srp_rport_match;
-       transport_container_register(&i->rport_attr_cont);
 
        count = 0;
        SETUP_RPORT_ATTRIBUTE_RD(port_id);
        SETUP_RPORT_ATTRIBUTE_RD(roles);
        i->rport_attrs[count] = NULL;
 
+       transport_container_register(&i->rport_attr_cont);
+
        i->f = ft;
 
        return &i->t;