[SCSI] libfc: rearrange code in fc_disc_gpn_ft_resp()

Code cleanup for fc_disc_gpn_ft_resp().

Some of the fc_disc.c code was poorly formatted. For example, some lines
in fc_disc.c were unnecessarily truncated and the buf variable could
be eliminated.

Also moved the increment of seq_count into fc_disc_gpn_ft_parse(), to
avoid doing it separately before each call.

Signed-off-by: Joe Eykholt <jeykholt@cisco.com>
Signed-off-by: Robert Love <robert.w.love@intel.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
This commit is contained in:
Joe Eykholt 2009-08-25 14:02:22 -07:00 committed by James Bottomley
parent c356afd486
commit a1c1e4e76c

View file

@ -469,6 +469,7 @@ static int fc_disc_gpn_ft_parse(struct fc_disc *disc, void *buf, size_t len)
struct fc_rport_priv *rdata; struct fc_rport_priv *rdata;
lport = disc->lport; lport = disc->lport;
disc->seq_count++;
/* /*
* Handle partial name record left over from previous call. * Handle partial name record left over from previous call.
@ -582,10 +583,10 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
struct fc_disc *disc = disc_arg; struct fc_disc *disc = disc_arg;
struct fc_ct_hdr *cp; struct fc_ct_hdr *cp;
struct fc_frame_header *fh; struct fc_frame_header *fh;
enum fc_disc_event event = DISC_EV_NONE;
unsigned int seq_cnt; unsigned int seq_cnt;
void *buf = NULL;
unsigned int len; unsigned int len;
int error; int error = 0;
mutex_lock(&disc->disc_mutex); mutex_lock(&disc->disc_mutex);
FC_DISC_DBG(disc, "Received a GPN_FT response\n"); FC_DISC_DBG(disc, "Received a GPN_FT response\n");
@ -600,8 +601,7 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
fh = fc_frame_header_get(fp); fh = fc_frame_header_get(fp);
len = fr_len(fp) - sizeof(*fh); len = fr_len(fp) - sizeof(*fh);
seq_cnt = ntohs(fh->fh_seq_cnt); seq_cnt = ntohs(fh->fh_seq_cnt);
if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && if (fr_sof(fp) == FC_SOF_I3 && seq_cnt == 0 && disc->seq_count == 0) {
disc->seq_count == 0) {
cp = fc_frame_payload_get(fp, sizeof(*cp)); cp = fc_frame_payload_get(fp, sizeof(*cp));
if (!cp) { if (!cp) {
FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n", FC_DISC_DBG(disc, "GPN_FT response too short, len %d\n",
@ -609,33 +609,29 @@ static void fc_disc_gpn_ft_resp(struct fc_seq *sp, struct fc_frame *fp,
} else if (ntohs(cp->ct_cmd) == FC_FS_ACC) { } else if (ntohs(cp->ct_cmd) == FC_FS_ACC) {
/* Accepted, parse the response. */ /* Accepted, parse the response. */
buf = cp + 1;
len -= sizeof(*cp); len -= sizeof(*cp);
error = fc_disc_gpn_ft_parse(disc, cp + 1, len);
} else if (ntohs(cp->ct_cmd) == FC_FS_RJT) { } else if (ntohs(cp->ct_cmd) == FC_FS_RJT) {
FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x " FC_DISC_DBG(disc, "GPN_FT rejected reason %x exp %x "
"(check zoning)\n", cp->ct_reason, "(check zoning)\n", cp->ct_reason,
cp->ct_explan); cp->ct_explan);
fc_disc_done(disc, DISC_EV_FAILED); event = DISC_EV_FAILED;
} else { } else {
FC_DISC_DBG(disc, "GPN_FT unexpected response code " FC_DISC_DBG(disc, "GPN_FT unexpected response code "
"%x\n", ntohs(cp->ct_cmd)); "%x\n", ntohs(cp->ct_cmd));
} }
} else if (fr_sof(fp) == FC_SOF_N3 && } else if (fr_sof(fp) == FC_SOF_N3 && seq_cnt == disc->seq_count) {
seq_cnt == disc->seq_count) { error = fc_disc_gpn_ft_parse(disc, fh + 1, len);
buf = fh + 1;
} else { } else {
FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? " FC_DISC_DBG(disc, "GPN_FT unexpected frame - out of sequence? "
"seq_cnt %x expected %x sof %x eof %x\n", "seq_cnt %x expected %x sof %x eof %x\n",
seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp)); seq_cnt, disc->seq_count, fr_sof(fp), fr_eof(fp));
} }
if (buf) { if (error)
disc->seq_count++; fc_disc_error(disc, fp);
error = fc_disc_gpn_ft_parse(disc, buf, len); else if (event != DISC_EV_NONE)
if (error) fc_disc_done(disc, event);
fc_disc_error(disc, fp);
}
fc_frame_free(fp); fc_frame_free(fp);
mutex_unlock(&disc->disc_mutex); mutex_unlock(&disc->disc_mutex);
} }