diff options
author | Andreas Herrmann <aherrman@de.ibm.com> | 2006-01-05 03:59:34 -0500 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.(none)> | 2006-01-14 11:54:50 -0500 |
commit | f6cd94b126aa78ebaa21075df3b9577fbf995968 (patch) | |
tree | e98bd9be9cb06d5b98160222bde6a308121bf41a | |
parent | 9eb69aff79264b5f35e41922df20a488c67e9ee2 (diff) |
[SCSI] zfcp: transport class adaptations
Added host stats, removed superfluous get_starget_ functions,
removed some attributes from zfcp specific sysfs tree (e.g.
scsi_host_no, scsi_lun, wwnn and d_id).
Host stats are given for the physical adapter port not for the
virtual adapter. Reset stats is implemented in the device driver.
Signed-off-by: Andreas Herrmann <aherrman@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/s390/scsi/zfcp_aux.c | 2 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 3 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 185 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_adapter.c | 4 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_port.c | 4 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_sysfs_unit.c | 2 |
6 files changed, 136 insertions, 64 deletions
diff --git a/drivers/s390/scsi/zfcp_aux.c b/drivers/s390/scsi/zfcp_aux.c index 5e84c5aa7779..167fef39d8a7 100644 --- a/drivers/s390/scsi/zfcp_aux.c +++ b/drivers/s390/scsi/zfcp_aux.c | |||
@@ -1125,6 +1125,8 @@ zfcp_adapter_dequeue(struct zfcp_adapter *adapter) | |||
1125 | zfcp_free_low_mem_buffers(adapter); | 1125 | zfcp_free_low_mem_buffers(adapter); |
1126 | /* free memory of adapter data structure and queues */ | 1126 | /* free memory of adapter data structure and queues */ |
1127 | zfcp_qdio_free_queues(adapter); | 1127 | zfcp_qdio_free_queues(adapter); |
1128 | kfree(adapter->fc_stats); | ||
1129 | kfree(adapter->stats_reset_data); | ||
1128 | ZFCP_LOG_TRACE("freeing adapter structure\n"); | 1130 | ZFCP_LOG_TRACE("freeing adapter structure\n"); |
1129 | kfree(adapter); | 1131 | kfree(adapter); |
1130 | out: | 1132 | out: |
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index d81b737d68cc..3785b3c98a58 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -978,6 +978,9 @@ struct zfcp_adapter { | |||
978 | struct zfcp_adapter_mempool pool; /* Adapter memory pools */ | 978 | struct zfcp_adapter_mempool pool; /* Adapter memory pools */ |
979 | struct qdio_initialize qdio_init_data; /* for qdio_establish */ | 979 | struct qdio_initialize qdio_init_data; /* for qdio_establish */ |
980 | struct device generic_services; /* directory for WKA ports */ | 980 | struct device generic_services; /* directory for WKA ports */ |
981 | struct fc_host_statistics *fc_stats; | ||
982 | struct fsf_qtcb_bottom_port *stats_reset_data; | ||
983 | unsigned long stats_reset; | ||
981 | }; | 984 | }; |
982 | 985 | ||
983 | /* | 986 | /* |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 66608d13a634..5ca0992e97f4 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -49,8 +49,6 @@ static int zfcp_task_management_function(struct zfcp_unit *, u8, | |||
49 | 49 | ||
50 | static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, scsi_id_t, | 50 | static struct zfcp_unit *zfcp_unit_lookup(struct zfcp_adapter *, int, scsi_id_t, |
51 | scsi_lun_t); | 51 | scsi_lun_t); |
52 | static struct zfcp_port *zfcp_port_lookup(struct zfcp_adapter *, int, | ||
53 | scsi_id_t); | ||
54 | 52 | ||
55 | static struct device_attribute *zfcp_sysfs_sdev_attrs[]; | 53 | static struct device_attribute *zfcp_sysfs_sdev_attrs[]; |
56 | 54 | ||
@@ -406,18 +404,6 @@ zfcp_unit_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id, | |||
406 | return retval; | 404 | return retval; |
407 | } | 405 | } |
408 | 406 | ||
409 | static struct zfcp_port * | ||
410 | zfcp_port_lookup(struct zfcp_adapter *adapter, int channel, scsi_id_t id) | ||
411 | { | ||
412 | struct zfcp_port *port; | ||
413 | |||
414 | list_for_each_entry(port, &adapter->port_list_head, list) { | ||
415 | if (port->rport && (id == port->rport->scsi_target_id)) | ||
416 | return port; | ||
417 | } | ||
418 | return (struct zfcp_port *) NULL; | ||
419 | } | ||
420 | |||
421 | /** | 407 | /** |
422 | * zfcp_scsi_eh_abort_handler - abort the specified SCSI command | 408 | * zfcp_scsi_eh_abort_handler - abort the specified SCSI command |
423 | * @scpnt: pointer to scsi_cmnd to be aborted | 409 | * @scpnt: pointer to scsi_cmnd to be aborted |
@@ -731,61 +717,148 @@ zfcp_fsf_start_scsi_er_timer(struct zfcp_adapter *adapter) | |||
731 | /* | 717 | /* |
732 | * Support functions for FC transport class | 718 | * Support functions for FC transport class |
733 | */ | 719 | */ |
734 | static void | 720 | static struct fc_host_statistics* |
735 | zfcp_get_port_id(struct scsi_target *starget) | 721 | zfcp_init_fc_host_stats(struct zfcp_adapter *adapter) |
736 | { | 722 | { |
737 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 723 | struct fc_host_statistics *fc_stats; |
738 | struct zfcp_adapter *adapter = (struct zfcp_adapter *)shost->hostdata[0]; | ||
739 | struct zfcp_port *port; | ||
740 | unsigned long flags; | ||
741 | 724 | ||
742 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 725 | if (!adapter->fc_stats) { |
743 | port = zfcp_port_lookup(adapter, starget->channel, starget->id); | 726 | fc_stats = kmalloc(sizeof(*fc_stats), GFP_KERNEL); |
744 | if (port) | 727 | if (!fc_stats) |
745 | fc_starget_port_id(starget) = port->d_id; | 728 | return NULL; |
746 | else | 729 | adapter->fc_stats = fc_stats; /* freed in adater_dequeue */ |
747 | fc_starget_port_id(starget) = -1; | 730 | } |
748 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 731 | memset(adapter->fc_stats, 0, sizeof(*adapter->fc_stats)); |
732 | return adapter->fc_stats; | ||
749 | } | 733 | } |
750 | 734 | ||
751 | static void | 735 | static void |
752 | zfcp_get_port_name(struct scsi_target *starget) | 736 | zfcp_adjust_fc_host_stats(struct fc_host_statistics *fc_stats, |
737 | struct fsf_qtcb_bottom_port *data, | ||
738 | struct fsf_qtcb_bottom_port *old) | ||
753 | { | 739 | { |
754 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 740 | fc_stats->seconds_since_last_reset = data->seconds_since_last_reset - |
755 | struct zfcp_adapter *adapter = (struct zfcp_adapter *)shost->hostdata[0]; | 741 | old->seconds_since_last_reset; |
756 | struct zfcp_port *port; | 742 | fc_stats->tx_frames = data->tx_frames - old->tx_frames; |
757 | unsigned long flags; | 743 | fc_stats->tx_words = data->tx_words - old->tx_words; |
744 | fc_stats->rx_frames = data->rx_frames - old->rx_frames; | ||
745 | fc_stats->rx_words = data->rx_words - old->rx_words; | ||
746 | fc_stats->lip_count = data->lip - old->lip; | ||
747 | fc_stats->nos_count = data->nos - old->nos; | ||
748 | fc_stats->error_frames = data->error_frames - old->error_frames; | ||
749 | fc_stats->dumped_frames = data->dumped_frames - old->dumped_frames; | ||
750 | fc_stats->link_failure_count = data->link_failure - old->link_failure; | ||
751 | fc_stats->loss_of_sync_count = data->loss_of_sync - old->loss_of_sync; | ||
752 | fc_stats->loss_of_signal_count = data->loss_of_signal - | ||
753 | old->loss_of_signal; | ||
754 | fc_stats->prim_seq_protocol_err_count = data->psp_error_counts - | ||
755 | old->psp_error_counts; | ||
756 | fc_stats->invalid_tx_word_count = data->invalid_tx_words - | ||
757 | old->invalid_tx_words; | ||
758 | fc_stats->invalid_crc_count = data->invalid_crcs - old->invalid_crcs; | ||
759 | fc_stats->fcp_input_requests = data->input_requests - | ||
760 | old->input_requests; | ||
761 | fc_stats->fcp_output_requests = data->output_requests - | ||
762 | old->output_requests; | ||
763 | fc_stats->fcp_control_requests = data->control_requests - | ||
764 | old->control_requests; | ||
765 | fc_stats->fcp_input_megabytes = data->input_mb - old->input_mb; | ||
766 | fc_stats->fcp_output_megabytes = data->output_mb - old->output_mb; | ||
767 | } | ||
758 | 768 | ||
759 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 769 | static void |
760 | port = zfcp_port_lookup(adapter, starget->channel, starget->id); | 770 | zfcp_set_fc_host_stats(struct fc_host_statistics *fc_stats, |
761 | if (port) | 771 | struct fsf_qtcb_bottom_port *data) |
762 | fc_starget_port_name(starget) = port->wwpn; | 772 | { |
763 | else | 773 | fc_stats->seconds_since_last_reset = data->seconds_since_last_reset; |
764 | fc_starget_port_name(starget) = -1; | 774 | fc_stats->tx_frames = data->tx_frames; |
765 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 775 | fc_stats->tx_words = data->tx_words; |
776 | fc_stats->rx_frames = data->rx_frames; | ||
777 | fc_stats->rx_words = data->rx_words; | ||
778 | fc_stats->lip_count = data->lip; | ||
779 | fc_stats->nos_count = data->nos; | ||
780 | fc_stats->error_frames = data->error_frames; | ||
781 | fc_stats->dumped_frames = data->dumped_frames; | ||
782 | fc_stats->link_failure_count = data->link_failure; | ||
783 | fc_stats->loss_of_sync_count = data->loss_of_sync; | ||
784 | fc_stats->loss_of_signal_count = data->loss_of_signal; | ||
785 | fc_stats->prim_seq_protocol_err_count = data->psp_error_counts; | ||
786 | fc_stats->invalid_tx_word_count = data->invalid_tx_words; | ||
787 | fc_stats->invalid_crc_count = data->invalid_crcs; | ||
788 | fc_stats->fcp_input_requests = data->input_requests; | ||
789 | fc_stats->fcp_output_requests = data->output_requests; | ||
790 | fc_stats->fcp_control_requests = data->control_requests; | ||
791 | fc_stats->fcp_input_megabytes = data->input_mb; | ||
792 | fc_stats->fcp_output_megabytes = data->output_mb; | ||
793 | } | ||
794 | |||
795 | /** | ||
796 | * zfcp_get_fc_host_stats - provide fc_host_statistics for scsi_transport_fc | ||
797 | * | ||
798 | * assumption: scsi_transport_fc synchronizes calls of | ||
799 | * get_fc_host_stats and reset_fc_host_stats | ||
800 | * (XXX to be checked otherwise introduce locking) | ||
801 | */ | ||
802 | static struct fc_host_statistics * | ||
803 | zfcp_get_fc_host_stats(struct Scsi_Host *shost) | ||
804 | { | ||
805 | struct zfcp_adapter *adapter; | ||
806 | struct fc_host_statistics *fc_stats; | ||
807 | struct fsf_qtcb_bottom_port *data; | ||
808 | int ret; | ||
809 | |||
810 | adapter = (struct zfcp_adapter *)shost->hostdata[0]; | ||
811 | fc_stats = zfcp_init_fc_host_stats(adapter); | ||
812 | if (!fc_stats) | ||
813 | return NULL; | ||
814 | |||
815 | data = kmalloc(sizeof(*data), GFP_KERNEL); | ||
816 | if (!data) | ||
817 | return NULL; | ||
818 | memset(data, 0, sizeof(*data)); | ||
819 | |||
820 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); | ||
821 | if (ret) { | ||
822 | kfree(data); | ||
823 | return NULL; /* XXX return zeroed fc_stats? */ | ||
824 | } | ||
825 | |||
826 | if (adapter->stats_reset && | ||
827 | ((jiffies/HZ - adapter->stats_reset) < | ||
828 | data->seconds_since_last_reset)) { | ||
829 | zfcp_adjust_fc_host_stats(fc_stats, data, | ||
830 | adapter->stats_reset_data); | ||
831 | } else | ||
832 | zfcp_set_fc_host_stats(fc_stats, data); | ||
833 | |||
834 | kfree(data); | ||
835 | return fc_stats; | ||
766 | } | 836 | } |
767 | 837 | ||
768 | static void | 838 | static void |
769 | zfcp_get_node_name(struct scsi_target *starget) | 839 | zfcp_reset_fc_host_stats(struct Scsi_Host *shost) |
770 | { | 840 | { |
771 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 841 | struct zfcp_adapter *adapter; |
772 | struct zfcp_adapter *adapter = (struct zfcp_adapter *)shost->hostdata[0]; | 842 | struct fsf_qtcb_bottom_port *data, *old_data; |
773 | struct zfcp_port *port; | 843 | int ret; |
774 | unsigned long flags; | ||
775 | 844 | ||
776 | read_lock_irqsave(&zfcp_data.config_lock, flags); | 845 | adapter = (struct zfcp_adapter *)shost->hostdata[0]; |
777 | port = zfcp_port_lookup(adapter, starget->channel, starget->id); | 846 | data = kmalloc(sizeof(*data), GFP_KERNEL); |
778 | if (port) | 847 | if (!data) |
779 | fc_starget_node_name(starget) = port->wwnn; | 848 | return; |
780 | else | 849 | memset(data, 0, sizeof(*data)); |
781 | fc_starget_node_name(starget) = -1; | 850 | |
782 | read_unlock_irqrestore(&zfcp_data.config_lock, flags); | 851 | ret = zfcp_fsf_exchange_port_data(NULL, adapter, data); |
852 | if (ret == 0) { | ||
853 | adapter->stats_reset = jiffies/HZ; | ||
854 | old_data = adapter->stats_reset_data; | ||
855 | adapter->stats_reset_data = data; /* finally freed in | ||
856 | adater_dequeue */ | ||
857 | kfree(old_data); | ||
858 | } | ||
783 | } | 859 | } |
784 | 860 | ||
785 | struct fc_function_template zfcp_transport_functions = { | 861 | struct fc_function_template zfcp_transport_functions = { |
786 | .get_starget_port_id = zfcp_get_port_id, | ||
787 | .get_starget_port_name = zfcp_get_port_name, | ||
788 | .get_starget_node_name = zfcp_get_node_name, | ||
789 | .show_starget_port_id = 1, | 862 | .show_starget_port_id = 1, |
790 | .show_starget_port_name = 1, | 863 | .show_starget_port_name = 1, |
791 | .show_starget_node_name = 1, | 864 | .show_starget_node_name = 1, |
@@ -795,6 +868,10 @@ struct fc_function_template zfcp_transport_functions = { | |||
795 | .show_host_supported_classes = 1, | 868 | .show_host_supported_classes = 1, |
796 | .show_host_maxframe_size = 1, | 869 | .show_host_maxframe_size = 1, |
797 | .show_host_serial_number = 1, | 870 | .show_host_serial_number = 1, |
871 | .get_fc_host_stats = zfcp_get_fc_host_stats, | ||
872 | .reset_fc_host_stats = zfcp_reset_fc_host_stats, | ||
873 | /* no functions registered for following dynamic attributes but | ||
874 | directly set by LLDD */ | ||
798 | .show_host_speed = 1, | 875 | .show_host_speed = 1, |
799 | .show_host_port_id = 1, | 876 | .show_host_port_id = 1, |
800 | }; | 877 | }; |
diff --git a/drivers/s390/scsi/zfcp_sysfs_adapter.c b/drivers/s390/scsi/zfcp_sysfs_adapter.c index 0cd435280e7d..c85df9c016ae 100644 --- a/drivers/s390/scsi/zfcp_sysfs_adapter.c +++ b/drivers/s390/scsi/zfcp_sysfs_adapter.c | |||
@@ -69,12 +69,10 @@ ZFCP_DEFINE_ADAPTER_ATTR(physical_wwpn, "0x%016llx\n", adapter->physical_wwpn); | |||
69 | ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); | 69 | ZFCP_DEFINE_ADAPTER_ATTR(physical_s_id, "0x%06x\n", adapter->physical_s_id); |
70 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); | 70 | ZFCP_DEFINE_ADAPTER_ATTR(card_version, "0x%04x\n", adapter->hydra_version); |
71 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); | 71 | ZFCP_DEFINE_ADAPTER_ATTR(lic_version, "0x%08x\n", adapter->fsf_lic_version); |
72 | ZFCP_DEFINE_ADAPTER_ATTR(fc_service_class, "%d\n", adapter->fc_service_class); | ||
73 | ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%s\n", | 72 | ZFCP_DEFINE_ADAPTER_ATTR(fc_topology, "%s\n", |
74 | fc_topologies[adapter->fc_topology]); | 73 | fc_topologies[adapter->fc_topology]); |
75 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", | 74 | ZFCP_DEFINE_ADAPTER_ATTR(hardware_version, "0x%08x\n", |
76 | adapter->hardware_version); | 75 | adapter->hardware_version); |
77 | ZFCP_DEFINE_ADAPTER_ATTR(scsi_host_no, "0x%x\n", adapter->scsi_host_no); | ||
78 | ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask | 76 | ZFCP_DEFINE_ADAPTER_ATTR(in_recovery, "%d\n", atomic_test_mask |
79 | (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)); | 77 | (ZFCP_STATUS_COMMON_ERP_INUSE, &adapter->status)); |
80 | 78 | ||
@@ -259,9 +257,7 @@ static struct attribute *zfcp_adapter_attrs[] = { | |||
259 | &dev_attr_physical_s_id.attr, | 257 | &dev_attr_physical_s_id.attr, |
260 | &dev_attr_card_version.attr, | 258 | &dev_attr_card_version.attr, |
261 | &dev_attr_lic_version.attr, | 259 | &dev_attr_lic_version.attr, |
262 | &dev_attr_fc_service_class.attr, | ||
263 | &dev_attr_fc_topology.attr, | 260 | &dev_attr_fc_topology.attr, |
264 | &dev_attr_scsi_host_no.attr, | ||
265 | &dev_attr_status.attr, | 261 | &dev_attr_status.attr, |
266 | &dev_attr_hardware_version.attr, | 262 | &dev_attr_hardware_version.attr, |
267 | NULL | 263 | NULL |
diff --git a/drivers/s390/scsi/zfcp_sysfs_port.c b/drivers/s390/scsi/zfcp_sysfs_port.c index c55e82d91deb..3924eb38805c 100644 --- a/drivers/s390/scsi/zfcp_sysfs_port.c +++ b/drivers/s390/scsi/zfcp_sysfs_port.c | |||
@@ -65,8 +65,6 @@ static ssize_t zfcp_sysfs_port_##_name##_show(struct device *dev, struct device_ | |||
65 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_port_##_name##_show, NULL); | 65 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_port_##_name##_show, NULL); |
66 | 66 | ||
67 | ZFCP_DEFINE_PORT_ATTR(status, "0x%08x\n", atomic_read(&port->status)); | 67 | ZFCP_DEFINE_PORT_ATTR(status, "0x%08x\n", atomic_read(&port->status)); |
68 | ZFCP_DEFINE_PORT_ATTR(wwnn, "0x%016llx\n", port->wwnn); | ||
69 | ZFCP_DEFINE_PORT_ATTR(d_id, "0x%06x\n", port->d_id); | ||
70 | ZFCP_DEFINE_PORT_ATTR(in_recovery, "%d\n", atomic_test_mask | 68 | ZFCP_DEFINE_PORT_ATTR(in_recovery, "%d\n", atomic_test_mask |
71 | (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)); | 69 | (ZFCP_STATUS_COMMON_ERP_INUSE, &port->status)); |
72 | ZFCP_DEFINE_PORT_ATTR(access_denied, "%d\n", atomic_test_mask | 70 | ZFCP_DEFINE_PORT_ATTR(access_denied, "%d\n", atomic_test_mask |
@@ -245,8 +243,6 @@ static struct attribute *zfcp_port_common_attrs[] = { | |||
245 | &dev_attr_failed.attr, | 243 | &dev_attr_failed.attr, |
246 | &dev_attr_in_recovery.attr, | 244 | &dev_attr_in_recovery.attr, |
247 | &dev_attr_status.attr, | 245 | &dev_attr_status.attr, |
248 | &dev_attr_wwnn.attr, | ||
249 | &dev_attr_d_id.attr, | ||
250 | &dev_attr_access_denied.attr, | 246 | &dev_attr_access_denied.attr, |
251 | NULL | 247 | NULL |
252 | }; | 248 | }; |
diff --git a/drivers/s390/scsi/zfcp_sysfs_unit.c b/drivers/s390/scsi/zfcp_sysfs_unit.c index 0556642c9e1d..2f50815f65c7 100644 --- a/drivers/s390/scsi/zfcp_sysfs_unit.c +++ b/drivers/s390/scsi/zfcp_sysfs_unit.c | |||
@@ -65,7 +65,6 @@ static ssize_t zfcp_sysfs_unit_##_name##_show(struct device *dev, struct device_ | |||
65 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_unit_##_name##_show, NULL); | 65 | static DEVICE_ATTR(_name, S_IRUGO, zfcp_sysfs_unit_##_name##_show, NULL); |
66 | 66 | ||
67 | ZFCP_DEFINE_UNIT_ATTR(status, "0x%08x\n", atomic_read(&unit->status)); | 67 | ZFCP_DEFINE_UNIT_ATTR(status, "0x%08x\n", atomic_read(&unit->status)); |
68 | ZFCP_DEFINE_UNIT_ATTR(scsi_lun, "0x%x\n", unit->scsi_lun); | ||
69 | ZFCP_DEFINE_UNIT_ATTR(in_recovery, "%d\n", atomic_test_mask | 68 | ZFCP_DEFINE_UNIT_ATTR(in_recovery, "%d\n", atomic_test_mask |
70 | (ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)); | 69 | (ZFCP_STATUS_COMMON_ERP_INUSE, &unit->status)); |
71 | ZFCP_DEFINE_UNIT_ATTR(access_denied, "%d\n", atomic_test_mask | 70 | ZFCP_DEFINE_UNIT_ATTR(access_denied, "%d\n", atomic_test_mask |
@@ -138,7 +137,6 @@ static DEVICE_ATTR(failed, S_IWUSR | S_IRUGO, zfcp_sysfs_unit_failed_show, | |||
138 | zfcp_sysfs_unit_failed_store); | 137 | zfcp_sysfs_unit_failed_store); |
139 | 138 | ||
140 | static struct attribute *zfcp_unit_attrs[] = { | 139 | static struct attribute *zfcp_unit_attrs[] = { |
141 | &dev_attr_scsi_lun.attr, | ||
142 | &dev_attr_failed.attr, | 140 | &dev_attr_failed.attr, |
143 | &dev_attr_in_recovery.attr, | 141 | &dev_attr_in_recovery.attr, |
144 | &dev_attr_status.attr, | 142 | &dev_attr_status.attr, |