[SCSI] libfc: don't exch_done() on invalid sequence ptr
[platform/adaptation/renesas_rcar/renesas_kernel.git] / drivers / scsi / libfc / fc_lport.c
index c1402fb..d385d11 100644 (file)
@@ -299,47 +299,54 @@ EXPORT_SYMBOL(fc_get_host_speed);
  */
 struct fc_host_statistics *fc_get_host_stats(struct Scsi_Host *shost)
 {
-       struct fc_host_statistics *fcoe_stats;
+       struct fc_host_statistics *fc_stats;
        struct fc_lport *lport = shost_priv(shost);
        struct timespec v0, v1;
        unsigned int cpu;
        u64 fcp_in_bytes = 0;
        u64 fcp_out_bytes = 0;
 
-       fcoe_stats = &lport->host_stats;
-       memset(fcoe_stats, 0, sizeof(struct fc_host_statistics));
+       fc_stats = &lport->host_stats;
+       memset(fc_stats, 0, sizeof(struct fc_host_statistics));
 
        jiffies_to_timespec(jiffies, &v0);
        jiffies_to_timespec(lport->boot_time, &v1);
-       fcoe_stats->seconds_since_last_reset = (v0.tv_sec - v1.tv_sec);
+       fc_stats->seconds_since_last_reset = (v0.tv_sec - v1.tv_sec);
 
        for_each_possible_cpu(cpu) {
-               struct fcoe_dev_stats *stats;
-
-               stats = per_cpu_ptr(lport->dev_stats, cpu);
-
-               fcoe_stats->tx_frames += stats->TxFrames;
-               fcoe_stats->tx_words += stats->TxWords;
-               fcoe_stats->rx_frames += stats->RxFrames;
-               fcoe_stats->rx_words += stats->RxWords;
-               fcoe_stats->error_frames += stats->ErrorFrames;
-               fcoe_stats->invalid_crc_count += stats->InvalidCRCCount;
-               fcoe_stats->fcp_input_requests += stats->InputRequests;
-               fcoe_stats->fcp_output_requests += stats->OutputRequests;
-               fcoe_stats->fcp_control_requests += stats->ControlRequests;
+               struct fc_stats *stats;
+
+               stats = per_cpu_ptr(lport->stats, cpu);
+
+               fc_stats->tx_frames += stats->TxFrames;
+               fc_stats->tx_words += stats->TxWords;
+               fc_stats->rx_frames += stats->RxFrames;
+               fc_stats->rx_words += stats->RxWords;
+               fc_stats->error_frames += stats->ErrorFrames;
+               fc_stats->invalid_crc_count += stats->InvalidCRCCount;
+               fc_stats->fcp_input_requests += stats->InputRequests;
+               fc_stats->fcp_output_requests += stats->OutputRequests;
+               fc_stats->fcp_control_requests += stats->ControlRequests;
                fcp_in_bytes += stats->InputBytes;
                fcp_out_bytes += stats->OutputBytes;
-               fcoe_stats->link_failure_count += stats->LinkFailureCount;
+               fc_stats->fcp_packet_alloc_failures += stats->FcpPktAllocFails;
+               fc_stats->fcp_packet_aborts += stats->FcpPktAborts;
+               fc_stats->fcp_frame_alloc_failures += stats->FcpFrameAllocFails;
+               fc_stats->link_failure_count += stats->LinkFailureCount;
        }
-       fcoe_stats->fcp_input_megabytes = div_u64(fcp_in_bytes, 1000000);
-       fcoe_stats->fcp_output_megabytes = div_u64(fcp_out_bytes, 1000000);
-       fcoe_stats->lip_count = -1;
-       fcoe_stats->nos_count = -1;
-       fcoe_stats->loss_of_sync_count = -1;
-       fcoe_stats->loss_of_signal_count = -1;
-       fcoe_stats->prim_seq_protocol_err_count = -1;
-       fcoe_stats->dumped_frames = -1;
-       return fcoe_stats;
+       fc_stats->fcp_input_megabytes = div_u64(fcp_in_bytes, 1000000);
+       fc_stats->fcp_output_megabytes = div_u64(fcp_out_bytes, 1000000);
+       fc_stats->lip_count = -1;
+       fc_stats->nos_count = -1;
+       fc_stats->loss_of_sync_count = -1;
+       fc_stats->loss_of_signal_count = -1;
+       fc_stats->prim_seq_protocol_err_count = -1;
+       fc_stats->dumped_frames = -1;
+
+       /* update exches stats */
+       fc_exch_update_stats(lport);
+
+       return fc_stats;
 }
 EXPORT_SYMBOL(fc_get_host_stats);
 
@@ -973,7 +980,8 @@ drop:
        rcu_read_unlock();
        FC_LPORT_DBG(lport, "dropping unexpected frame type %x\n", fh->fh_type);
        fc_frame_free(fp);
-       lport->tt.exch_done(sp);
+       if (sp)
+               lport->tt.exch_done(sp);
 }
 
 /**