[SCSI] libfc: check for err when recv and state is incorrect
authorRobert Love <robert.w.love@intel.com>
Fri, 27 Feb 2009 18:55:34 +0000 (10:55 -0800)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Fri, 6 Mar 2009 21:44:36 +0000 (15:44 -0600)
commitefaf5c085dd2d31757b0ff7886970dfddd8d1808
treec88ab287ed1b78ecad88370c1c8929f17f13c271
parentd3b33327cab0c8e9cae2c12d908ca79433c0d1ac
[SCSI] libfc: check for err when recv and state is incorrect

If we've just created an interface and the an rport is
logging in we may have a request on the wire (say PRLI).
If we destroy the interface, we'll go through each rport
on the disc->rports list and set each rport's state to NONE.
Then the lport will reset the EM. The EM reset will send a
CLOSED event to the prli_resp() handler which will notice
that the state != PRLI. In this case it frees the frame
pointer, decrements the refcount and unlocks the rport.

The problem is that there isn't a frame in this case. It's
just a pointer with an embedded error code. The free causes
an Oops.

This patch moves the error checking to be before the state
checking.

Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/libfc/fc_lport.c
drivers/scsi/libfc/fc_rport.c