]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.39/patches.drivers/libfc-when-rport-goes-away-re.diff
Fix oinkmaster patch.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.39 / patches.drivers / libfc-when-rport-goes-away-re.diff
1 From: Abhijeet Joglekar <abjoglek@cisco.com>
2 Subject: libfc: when rport goes away (re-plogi), clean up exchanges to/from rport
3 References: bnc #465596
4
5 When a rport goes away, libFC does a plogi which will reset exchanges
6 at the rport. Clean exchanges at our end, both in transport and libFC.
7 If transport hooks into exch_mgr_reset, it will call back into
8 fc_exch_mgr_reset() to clean up libFC exchanges.
9
10 Signed-off-by: Abhijeet Joglekar <abjoglek@cisco.com>
11 Acked-by: Bernhard Walle <bwalle@suse.de>
12 ---
13
14 drivers/scsi/libfc/fc_rport.c | 7 ++++++-
15 1 file changed, 6 insertions(+), 1 deletion(-)
16
17
18 --- a/drivers/scsi/libfc/fc_rport.c
19 +++ b/drivers/scsi/libfc/fc_rport.c
20 @@ -215,6 +215,7 @@ static void fc_rport_state_enter(struct
21
22 static void fc_rport_work(struct work_struct *work)
23 {
24 + u32 port_id;
25 struct fc_rport_libfc_priv *rdata =
26 container_of(work, struct fc_rport_libfc_priv, event_work);
27 enum fc_rport_event event;
28 @@ -280,8 +281,12 @@ static void fc_rport_work(struct work_st
29 rport_ops->event_callback(lport, rport, event);
30 if (trans_state == FC_PORTSTATE_ROGUE)
31 put_device(&rport->dev);
32 - else
33 + else {
34 + port_id = rport->port_id;
35 fc_remote_port_delete(rport);
36 + lport->tt.exch_mgr_reset(lport, 0, port_id);
37 + lport->tt.exch_mgr_reset(lport, port_id, 0);
38 + }
39 } else
40 mutex_unlock(&rdata->rp_mutex);
41 }