OSDN Git Service

IB/srp: Handle partial connection success correctly
authorBart Van Assche <bart.vanassche@sandisk.com>
Fri, 31 Jul 2015 21:13:22 +0000 (14:13 -0700)
committerDoug Ledford <dledford@redhat.com>
Sun, 30 Aug 2015 22:12:24 +0000 (18:12 -0400)
Avoid that the following kernel warning is reported if the SRP
target system accepts fewer channels per connection than what
was requested by the initiator system:

WARNING: at drivers/infiniband/ulp/srp/ib_srp.c:617 srp_destroy_qp+0xb1/0x120 [ib_srp]()
Call Trace:
[<ffffffff8105d67f>] warn_slowpath_common+0x7f/0xc0
[<ffffffff8105d6da>] warn_slowpath_null+0x1a/0x20
[<ffffffffa05419e1>] srp_destroy_qp+0xb1/0x120 [ib_srp]
[<ffffffffa05445fb>] srp_create_ch_ib+0x19b/0x420 [ib_srp]
[<ffffffffa0545257>] srp_create_target+0x7d7/0xa94 [ib_srp]
[<ffffffff8138dac0>] dev_attr_store+0x20/0x30
[<ffffffff812079ef>] sysfs_write_file+0xef/0x170
[<ffffffff81191fc4>] vfs_write+0xb4/0x130
[<ffffffff8119276f>] sys_write+0x5f/0xa0
[<ffffffff815a0a59>] system_call_fastpath+0x16/0x1b

Signed-off-by: Bart Van Assche <bart.vanassche@sandisk.com>
Cc: Sagi Grimberg <sagig@mellanox.com>
Cc: Sebastian Parschauer <sebastian.riemer@profitbricks.com>
Cc: Christoph Hellwig <hch@lst.de>
Cc: stable@vger.kernel.org
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/srp/ib_srp.c

index a0b92a1..ae13c96 100644 (file)
@@ -3263,7 +3263,7 @@ static ssize_t srp_create_target(struct device *dev,
                                        srp_free_ch_ib(target, ch);
                                        srp_free_req_data(target, ch);
                                        target->ch_count = ch - target->ch;
-                                       break;
+                                       goto connected;
                                }
                        }
 
@@ -3273,6 +3273,7 @@ static ssize_t srp_create_target(struct device *dev,
                node_idx++;
        }
 
+connected:
        target->scsi_host->nr_hw_queues = target->ch_count;
 
        ret = srp_add_target(host, target);