/* * osd_sense.h - OSD Related sense handling definitions. * * Copyright (C) 2008 Panasas Inc. All rights reserved. * * Authors: * Boaz Harrosh * Benny Halevy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 * * This file contains types and constants that are defined by the protocol * Note: All names and symbols are taken from the OSD standard's text. */ #ifndef __OSD_SENSE_H__ #define __OSD_SENSE_H__ #include /* SPC3r23 4.5.6 Sense key and sense code definitions table 27 */ enum scsi_sense_keys { scsi_sk_no_sense = 0x0, scsi_sk_recovered_error = 0x1, scsi_sk_not_ready = 0x2, scsi_sk_medium_error = 0x3, scsi_sk_hardware_error = 0x4, scsi_sk_illegal_request = 0x5, scsi_sk_unit_attention = 0x6, scsi_sk_data_protect = 0x7, scsi_sk_blank_check = 0x8, scsi_sk_vendor_specific = 0x9, scsi_sk_copy_aborted = 0xa, scsi_sk_aborted_command = 0xb, scsi_sk_volume_overflow = 0xd, scsi_sk_miscompare = 0xe, scsi_sk_reserved = 0xf, }; /* SPC3r23 4.5.6 Sense key and sense code definitions table 28 */ /* Note: only those which can be returned by an OSD target. Most of * these errors are taken care of by the generic scsi layer. */ enum osd_additional_sense_codes { scsi_no_additional_sense_information = 0x0000, scsi_operation_in_progress = 0x0016, scsi_cleaning_requested = 0x0017, scsi_lunr_cause_not_reportable = 0x0400, scsi_logical_unit_is_in_process_of_becoming_ready = 0x0401, scsi_lunr_initializing_command_required = 0x0402, scsi_lunr_manual_intervention_required = 0x0403, scsi_lunr_operation_in_progress = 0x0407, scsi_lunr_selftest_in_progress = 0x0409, scsi_luna_asymmetric_access_state_transition = 0x040a, scsi_luna_target_port_in_standby_state = 0x040b, scsi_luna_target_port_in_unavailable_state = 0x040c, scsi_lunr_notify_enable_spinup_required = 0x0411, scsi_logical_unit_does_not_respond_to_selection = 0x0500, scsi_logical_unit_communication_failure = 0x0800, scsi_logical_unit_communication_timeout = 0x0801, scsi_logical_unit_communication_parity_error = 0x0802, scsi_error_log_overflow = 0x0a00, scsi_warning = 0x0b00, scsi_warning_specified_temperature_exceeded = 0x0b01, scsi_warning_enclosure_degraded = 0x0b02, scsi_write_error_unexpected_unsolicited_data = 0x0c0c, scsi_write_error_not_enough_unsolicited_data = 0x0c0d, scsi_invalid_information_unit = 0x0e00, scsi_invalid_field_in_command_information_unit = 0x0e03, scsi_read_error_failed_retransmission_request = 0x1113, scsi_parameter_list_length_error = 0x1a00, scsi_invalid_command_operation_code = 0x2000, scsi_invalid_field_in_cdb = 0x2400, osd_security_audit_value_frozen = 0x2404, osd_security_working_key_frozen = 0x2405, osd_nonce_not_unique = 0x2406, osd_nonce_timestamp_out_of_range = 0x2407, scsi_logical_unit_not_supported = 0x2500, scsi_invalid_field_in_parameter_list = 0x2600, scsi_parameter_not_supported = 0x2601, scsi_parameter_value_invalid = 0x2602, scsi_invalid_release_of_persistent_reservation = 0x2604, osd_invalid_dataout_buffer_integrity_check_value = 0x260f, scsi_not_ready_to_ready_change_medium_may_have_changed = 0x2800, scsi_power_on_reset_or_bus_device_reset_occurred = 0x2900, scsi_power_on_occurred = 0x2901, scsi_scsi_bus_reset_occurred = 0x2902, scsi_bus_device_reset_function_occurred = 0x2903, scsi_device_internal_reset = 0x2904, scsi_transceiver_mode_changed_to_single_ended = 0x2905, scsi_transceiver_mode_changed_to_lvd = 0x2906, scsi_i_t_nexus_loss_occurred = 0x2907, scsi_parameters_changed = 0x2a00, scsi_mode_parameters_changed = 0x2a01, scsi_asymmetric_access_state_changed = 0x2a06, scsi_priority_changed = 0x2a08, scsi_command_sequence_error = 0x2c00, scsi_previous_busy_status = 0x2c07, scsi_previous_task_set_full_status = 0x2c08, scsi_previous_reservation_conflict_status = 0x2c09, osd_partition_or_collection_contains_user_objects = 0x2c0a, scsi_commands_cleared_by_another_initiator = 0x2f00, scsi_cleaning_failure = 0x3007, scsi_enclosure_failure = 0x3400, scsi_enclosure_services_failure = 0x3500, scsi_unsupported_enclosure_function = 0x3501, scsi_enclosure_services_unavailable = 0x3502, scsi_enclosure_services_transfer_failure = 0x3503, scsi_enclosure_services_transfer_refused = 0x3504, scsi_enclosure_services_checksum_error = 0x3505, scsi_rounded_parameter = 0x3700, osd_read_past_end_of_user_object = 0x3b17, scsi_logical_unit_has_not_self_configured_yet = 0x3e00, scsi_logical_unit_failure = 0x3e01, scsi_timeout_on_logical_unit = 0x3e02, scsi_logical_unit_failed_selftest = 0x3e03, scsi_logical_unit_unable_to_update_selftest_log = 0x3e04, scsi_target_operating_conditions_have_changed = 0x3f00, scsi_microcode_has_been_changed = 0x3f01, scsi_inquiry_data_has_changed = 0x3f03, scsi_echo_buffer_overwritten = 0x3f0f, scsi_diagnostic_failure_on_component_nn_first = 0x4080, scsi_diagnostic_failure_on_component_nn_last = 0x40ff, scsi_message_error = 0x4300, scsi_internal_target_failure = 0x4400, scsi_select_or_reselect_failure = 0x4500, scsi_scsi_parity_error = 0x4700, scsi_data_phase_crc_error_detected = 0x4701, scsi_scsi_parity_error_detected_during_st_data_phase = 0x4702, scsi_asynchronous_information_protection_error_detected = 0x4704, scsi_protocol_service_crc_error = 0x4705, scsi_phy_test_function_in_progress = 0x4706, scsi_invalid_message_error = 0x4900, scsi_command_phase_error = 0x4a00, scsi_data_phase_error = 0x4b00, scsi_logical_unit_failed_self_configuration = 0x4c00, scsi_overlapped_commands_attempted = 0x4e00, osd_quota_error = 0x5507, scsi_failure_prediction_threshold_exceeded = 0x5d00, scsi_failure_prediction_threshold_exceeded_false = 0x5dff, scsi_voltage_fault = 0x6500, }; enum scsi_descriptor_types { scsi_sense_information = 0x0, scsi_sense_command_specific_information = 0x1, scsi_sense_key_specific = 0x2, scsi_sense_field_replaceable_unit = 0x3, scsi_sense_stream_commands = 0x4, scsi_sense_block_commands = 0x5, osd_sense_object_identification = 0x6, osd_sense_response_integrity_check = 0x7, osd_sense_attribute_identification = 0x8, scsi_sense_ata_return = 0x9, scsi_sense_Reserved_first = 0x0A, scsi_sense_Reserved_last = 0x7F, scsi_sense_Vendor_specific_first = 0x80, scsi_sense_Vendor_specific_last = 0xFF, }; struct scsi_sense_descriptor { /* for picking into desc type */ u8 descriptor_type; /* one of enum scsi_descriptor_types */ u8 additional_length; /* n - 1 */ u8 data[]; } __packed; /* OSD deploys only scsi descriptor_based sense buffers */ struct scsi_sense_descriptor_based { /*0*/ u8 response_code; /* 0x72 or 0x73 */ /*1*/ u8 sense_key; /* one of enum scsi_sense_keys (4 lower bits) */ /*2*/ __be16 additional_sense_code; /* enum osd_additional_sense_codes */ /*4*/ u8 Reserved[3]; /*7*/ u8 additional_sense_length; /* n - 7 */ /*8*/ struct scsi_sense_descriptor ssd[0]; /* variable length, 1 or more */ } __packed; /* some descriptors deployed by OSD */ /* SPC3r23 4.5.2.3 Command-specific information sense data descriptor */ /* Note: this is the same for descriptor_type=00 but with type=00 the * Reserved[0] == 0x80 (ie. bit-7 set) */ struct scsi_sense_command_specific_data_descriptor { /*0*/ u8 descriptor_type; /* (00h/01h) */ /*1*/ u8 additional_length; /* (0Ah) */ /*2*/ u8 Reserved[2]; /*4*/ __be64 information; } __packed; /*12*/ struct scsi_sense_key_specific_data_descriptor { /*0*/ u8 descriptor_type; /* (02h) */ /*1*/ u8 additional_length; /* (06h) */ /*2*/ u8 Reserved[2]; /* SKSV, C/D, Reserved (2), BPV, BIT POINTER (3) */ /*4*/ u8 sksv_cd_bpv_bp; /*5*/ __be16 value; /* field-pointer/progress-value/retry-count/... */ /*7*/ u8 Reserved2; } __packed; /*8*/ /* 4.16.2.1 OSD error identification sense data descriptor - table 52 */ /* Note: these bits are defined LE order for easy definition, this way the BIT() * number is the same as in the documentation. Below members at * osd_sense_identification_data_descriptor are therefore defined __le32. */ enum osd_command_functions_bits { OSD_CFB_COMMAND = BIT(4), OSD_CFB_CMD_CAP_VERIFIED = BIT(5), OSD_CFB_VALIDATION = BIT(7), OSD_CFB_IMP_ST_ATT = BIT(12), OSD_CFB_SET_ATT = BIT(20), OSD_CFB_SA_CAP_VERIFIED = BIT(21), OSD_CFB_GET_ATT = BIT(28), OSD_CFB_GA_CAP_VERIFIED = BIT(29), }; struct osd_sense_identification_data_descriptor { /*0*/ u8 descriptor_type; /* (06h) */ /*1*/ u8 additional_length; /* (1Eh) */ /*2*/ u8 Reserved[6]; /*8*/ __le32 not_initiated_functions; /*osd_command_functions_bits*/ /*12*/ __le32 completed_functions; /*osd_command_functions_bits*/ /*16*/ __be64 partition_id; /*24*/ __be64 object_id; } __packed; /*32*/ struct osd_sense_response_integrity_check_descriptor { /*0*/ u8 descriptor_type; /* (07h) */ /*1*/ u8 additional_length; /* (20h) */ /*2*/ u8 integrity_check_value[32]; /*FIXME: OSDv2_CRYPTO_KEYID_SIZE*/ } __packed; /*34*/ struct osd_sense_attributes_data_descriptor { /*0*/ u8 descriptor_type; /* (08h) */ /*1*/ u8 additional_length; /* (n-2) */ /*2*/ u8 Reserved[6]; struct osd_sense_attr { /*8*/ __be32 attr_page; /*12*/ __be32 attr_id; /*16*/ } sense_attrs[0]; /* 1 or more */ } __packed; /*variable*/ /* Dig into scsi_sk_illegal_request/scsi_invalid_field_in_cdb errors */ /*FIXME: Support also field in CAPS*/ #define OSD_CDB_OFFSET(F) offsetof(struct osd_cdb_head, F) enum osdv2_cdb_field_offset { OSDv1_CFO_STARTING_BYTE = OSD_CDB_OFFSET(v1.start_address), OSD_CFO_STARTING_BYTE = OSD_CDB_OFFSET(v2.start_address), OSD_CFO_PARTITION_ID = OSD_CDB_OFFSET(partition), OSD_CFO_OBJECT_ID = OSD_CDB_OFFSET(object), OSD_CFO_PERMISSIONS = sizeof(struct osd_cdb_head) + offsetof(struct osd_capability_head, permissions_bit_mask), }; #endif /* ndef __OSD_SENSE_H__ */ tp://marc.info/?l=linux-arch&m=148493613415294&w=2 * emailed patches from Ard Biesheuvel: module: unify absolute krctab definitions for 32-bit and 64-bit modversions: treat symbol CRCs as 32 bit quantities kbuild: modversions: add infrastructure for emitting relative CRCs 2017-02-03log2: make order_base_2() behave correctly on const input value zeroArd Biesheuvel1-1/+12 The function order_base_2() is defined (according to the comment block) as returning zero on input zero, but subsequently passes the input into roundup_pow_of_two(), which is explicitly undefined for input zero. This has gone unnoticed until now, but optimization passes in GCC 7 may produce constant folded function instances where a constant value of zero is passed into order_base_2(), resulting in link errors against the deliberately undefined '____ilog2_NaN'. So update order_base_2() to adhere to its own documented interface. [ See http://marc.info/?l=linux-kernel&m=147672952517795&w=2 and follow-up discussion for more background. The gcc "optimization pass" is really just broken, but now the GCC trunk problem seems to have escaped out of just specially built daily images, so we need to work around it in mainline. - Linus ] Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> 2017-02-03module: unify absolute krctab definitions for 32-bit and 64-bitArd Biesheuvel1-7/+0 The previous patch introduced a separate inline asm version of the krcrctab declaration template for use with 64-bit architectures, which cannot refer to ELF symbols using 32-bit quantities. This declaration should be equivalent to the C one for 32-bit architectures, but just in case - unify them in a separate patch, which can simply be dropped if it turns out to break anything. Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> 2017-02-03modversions: treat symbol CRCs as 32 bit quantitiesArd Biesheuvel3-12/+27 The modversion symbol CRCs are emitted as ELF symbols, which allows us to easily populate the kcrctab sections by relying on the linker to associate each kcrctab slot with the correct value. This has a couple of downsides: - Given that the CRCs are treated as memory addresses, we waste 4 bytes for each CRC on 64 bit architectures, - On architectures that support runtime relocation, a R_<arch>_RELATIVE relocation entry is emitted for each CRC value, which identifies it as a quantity that requires fixing up based on the actual runtime load offset of the kernel. This results in corrupted CRCs unless we explicitly undo the fixup (and this is currently being handled in the core module code) - Such runtime relocation entries take up 24 bytes of __init space each, resulting in a x8 overhead in [uncompressed] kernel size for CRCs. Switching to explicit 32 bit values on 64 bit architectures fixes most of these issues, given that 32 bit values are not treated as quantities that require fixing up based on the actual runtime load offset. Note that on some ELF64 architectures [such as PPC64], these 32-bit values are still emitted as [absolute] runtime relocatable quantities, even if the value resolves to a build time constant. Since relative relocations are always resolved at build time, this patch enables MODULE_REL_CRCS on powerpc when CONFIG_RELOCATABLE=y, which turns the absolute CRC references into relative references into .rodata where the actual CRC value is stored. So redefine all CRC fields and variables as u32, and redefine the __CRC_SYMBOL() macro for 64 bit builds to emit the CRC reference using inline assembler (which is necessary since 64-bit C code cannot use 32-bit types to hold memory addresses, even if they are ultimately resolved using values that do not exceed 0xffffffff). To avoid potential problems with legacy 32-bit architectures using legacy toolchains, the equivalent C definition of the kcrctab entry is retained for 32-bit architectures. Note that this mostly reverts commit d4703aefdbc8 ("module: handle ppc64 relocating kcrctabs when CONFIG_RELOCATABLE=y") Acked-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> 2017-02-02Merge branch 'perf-urgent-for-linus' of ↵Linus Torvalds1-3/+0 git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip Pull perf fixes from Ingo Molnar: "Five kernel fixes: - an mmap tracing ABI fix for certain mappings - a use-after-free fix, found via KASAN - three CPU hotplug related x86 PMU driver fixes" * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: perf/x86/intel/uncore: Make package handling more robust perf/x86/intel/uncore: Clean up hotplug conversion fallout perf/x86/intel/rapl: Make package handling more robust perf/core: Fix PERF_RECORD_MMAP2 prot/flags for anonymous memory perf/core: Fix use-after-free bug 2017-02-01Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/netLinus Torvalds4-19/+26 Pull networking fixes from David Miller: 1) Fix handling of interrupt status in stmmac driver. Just because we have masked the event from generating interrupts, doesn't mean the bit won't still be set in the interrupt status register. From Alexey Brodkin. 2) Fix DMA API debugging splats in gianfar driver, from Arseny Solokha. 3) Fix off-by-one error in __ip6_append_data(), from Vlad Yasevich. 4) cls_flow does not match on icmpv6 codes properly, from Simon Horman. 5) Initial MAC address can be set incorrectly in some scenerios, from Ivan Vecera. 6) Packet header pointer arithmetic fix in ip6_tnl_parse_tlv_end_lim(), from Dan Carpenter. 7) Fix divide by zero in __tcp_select_window(), from Eric Dumazet. 8) Fix crash in iwlwifi when unregistering thermal zone, from Jens Axboe. 9) Check for DMA mapping errors in starfire driver, from Alexey Khoroshilov. * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (31 commits) tcp: fix 0 divide in __tcp_select_window() ipv6: pointer math error in ip6_tnl_parse_tlv_enc_lim() net: fix ndo_features_check/ndo_fix_features comment ordering net/sched: matchall: Fix configuration race be2net: fix initial MAC setting ipv6: fix flow labels when the traffic class is non-0 net: thunderx: avoid dereferencing xcv when NULL net/sched: cls_flower: Correct matching on ICMPv6 code ipv6: Paritially checksum full MTU frames net/mlx4_core: Avoid command timeouts during VF driver device shutdown gianfar: synchronize DMA API usage by free_skb_rx_queue w/ gfar_new_page net: ethtool: add support for 2500BaseT and 5000BaseT link modes can: bcm: fix hrtimer/tasklet termination in bcm op removal net: adaptec: starfire: add checks for dma mapping errors net: phy: micrel: KSZ8795 do not set SUPPORTED_[Asym_]Pause can: Fix kernel panic at security_sock_rcv_skb net: macb: Fix 64 bit addressing support for GEM stmmac: Discard masked flags in interrupt status register net/mlx5e: Check ets capability before ets query FW command net/mlx5e: Fix update of hash function/key via ethtool ... 2017-02-01Merge branch 'for-linus' of ↵Linus Torvalds1-0/+1 git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs Pull fscache fixes from Al Viro. * 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs: fscache: Fix dead object requeue fscache: Clear outstanding writes when disabling a cookie FS-Cache: Initialise stores_lock in netfs cookie 2017-02-01net: fix ndo_features_check/ndo_fix_features comment orderingDimitris Michailidis1-14/+15 Commit cdba756f5803a2 ("net: move ndo_features_check() close to ndo_start_xmit()") inadvertently moved the doc comment for .ndo_fix_features instead of .ndo_features_check. Fix the comment ordering. Fixes: cdba756f5803a2 ("net: move ndo_features_check() close to ndo_start_xmit()") Signed-off-by: Dimitris Michailidis <dmichail@google.com> Acked-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net> 2017-02-01perf/x86/intel/uncore: Make package handling more robustThomas Gleixner1-2/+0 The package management code in uncore relies on package mapping being available before a CPU is started. This changed with: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") because the ACPI/BIOS information turned out to be unreliable, but that left uncore in broken state. This was not noticed because on a regular boot all CPUs are online before uncore is initialized. Move the allocation to the CPU online callback and simplify the hotplug handling. At this point the package mapping is established and correct. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sebastian Siewior <bigeasy@linutronix.de> Cc: Stephane Eranian <eranian@google.com> Cc: Vince Weaver <vincent.weaver@maine.edu> Cc: Yasuaki Ishimatsu <yasu.isimatu@gmail.com> Fixes: 9d85eb9119f4 ("x86/smpboot: Make logical package management more robust") Link: http://lkml.kernel.org/r/20170131230141.377156255@linutronix.de Signed-off-by: Ingo Molnar <mingo@kernel.org>