diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-08 10:12:46 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-05-08 10:12:46 -0700 |
commit | d1cd7c85f9e29740fddec6f25d8bf061937bf58d (patch) | |
tree | 6d1f8e555d3a416442856724b57dc414eac5d5a4 /include | |
parent | b3a5e648f5917ea508ecab9a629028b186d38eae (diff) | |
parent | d4023db71108375e4194e92730ba0d32d7f07813 (diff) | |
download | linux-stable-d1cd7c85f9e29740fddec6f25d8bf061937bf58d.tar.gz linux-stable-d1cd7c85f9e29740fddec6f25d8bf061937bf58d.tar.bz2 linux-stable-d1cd7c85f9e29740fddec6f25d8bf061937bf58d.zip |
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI updates from James Bottomley:
"This is mostly update of the usual drivers: qla2xxx, qedf, smartpqi,
hpsa, lpfc, ufs, mpt3sas, ibmvfc and hisi_sas. Plus number of minor
changes, spelling fixes and other trivia"
* tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (298 commits)
scsi: qla2xxx: Avoid that lockdep complains about unsafe locking in tcm_qla2xxx_close_session()
scsi: qla2xxx: Avoid that qlt_send_resp_ctio() corrupts memory
scsi: qla2xxx: Fix hardirq-unsafe locking
scsi: qla2xxx: Complain loudly about reference count underflow
scsi: qla2xxx: Use __le64 instead of uint32_t[2] for sending DMA addresses to firmware
scsi: qla2xxx: Introduce the dsd32 and dsd64 data structures
scsi: qla2xxx: Check the size of firmware data structures at compile time
scsi: qla2xxx: Pass little-endian values to the firmware
scsi: qla2xxx: Fix race conditions in the code for aborting SCSI commands
scsi: qla2xxx: Use an on-stack completion in qla24xx_control_vp()
scsi: qla2xxx: Make qla24xx_async_abort_cmd() static
scsi: qla2xxx: Remove unnecessary locking from the target code
scsi: qla2xxx: Remove qla_tgt_cmd.released
scsi: qla2xxx: Complain if a command is released that is owned by the firmware
scsi: qla2xxx: target: Fix offline port handling and host reset handling
scsi: qla2xxx: Fix abort handling in tcm_qla2xxx_write_pending()
scsi: qla2xxx: Fix error handling in qlt_alloc_qfull_cmd()
scsi: qla2xxx: Simplify qlt_send_term_imm_notif()
scsi: qla2xxx: Fix use-after-free issues in qla2xxx_qpair_sp_free_dma()
scsi: qla2xxx: Fix a qla24xx_enable_msix() error path
...
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/nvme-fc-driver.h | 6 | ||||
-rw-r--r-- | include/scsi/libsas.h | 13 | ||||
-rw-r--r-- | include/scsi/osd_attributes.h | 398 | ||||
-rw-r--r-- | include/scsi/osd_protocol.h | 676 | ||||
-rw-r--r-- | include/scsi/osd_sec.h | 45 | ||||
-rw-r--r-- | include/scsi/osd_sense.h | 263 | ||||
-rw-r--r-- | include/scsi/osd_types.h | 45 | ||||
-rw-r--r-- | include/scsi/scsi_host.h | 6 | ||||
-rw-r--r-- | include/scsi/scsi_transport_fc.h | 18 | ||||
-rw-r--r-- | include/target/iscsi/iscsi_target_core.h | 1 | ||||
-rw-r--r-- | include/target/target_core_base.h | 4 | ||||
-rw-r--r-- | include/target/target_core_fabric.h | 1 | ||||
-rw-r--r-- | include/uapi/scsi/fc/fc_els.h | 33 |
13 files changed, 64 insertions, 1445 deletions
diff --git a/include/linux/nvme-fc-driver.h b/include/linux/nvme-fc-driver.h index 2bb349035431..c48e96436f56 100644 --- a/include/linux/nvme-fc-driver.h +++ b/include/linux/nvme-fc-driver.h @@ -17,12 +17,6 @@ -/* FC Port role bitmask - can merge with FC Port Roles in fc transport */ -#define FC_PORT_ROLE_NVME_INITIATOR 0x10 -#define FC_PORT_ROLE_NVME_TARGET 0x20 -#define FC_PORT_ROLE_NVME_DISCOVERY 0x40 - - /** * struct nvme_fc_port_info - port-specific ids and FC connection-specific * data element used during NVME Host role diff --git a/include/scsi/libsas.h b/include/scsi/libsas.h index 56b2dba7d911..b08febec7895 100644 --- a/include/scsi/libsas.h +++ b/include/scsi/libsas.h @@ -224,6 +224,13 @@ struct sas_work { struct work_struct work; }; +/* Lots of code duplicates this in the SCSI tree, which can be factored out */ +static inline bool sas_dev_type_is_expander(enum sas_device_type type) +{ + return type == SAS_EDGE_EXPANDER_DEVICE || + type == SAS_FANOUT_EXPANDER_DEVICE; +} + static inline void INIT_SAS_WORK(struct sas_work *sw, void (*fn)(struct work_struct *)) { INIT_WORK(&sw->work, fn); @@ -245,9 +252,9 @@ static inline struct sas_discovery_event *to_sas_discovery_event(struct work_str struct sas_discovery { struct sas_discovery_event disc_work[DISC_NUM_EVENTS]; unsigned long pending; - u8 fanout_sas_addr[8]; - u8 eeds_a[8]; - u8 eeds_b[8]; + u8 fanout_sas_addr[SAS_ADDR_SIZE]; + u8 eeds_a[SAS_ADDR_SIZE]; + u8 eeds_b[SAS_ADDR_SIZE]; int max_level; }; diff --git a/include/scsi/osd_attributes.h b/include/scsi/osd_attributes.h deleted file mode 100644 index 8a6acd054e4e..000000000000 --- a/include/scsi/osd_attributes.h +++ /dev/null @@ -1,398 +0,0 @@ -/* SPDX-License-Identifier: GPL-2.0 */ -#ifndef __OSD_ATTRIBUTES_H__ -#define __OSD_ATTRIBUTES_H__ - -#include <scsi/osd_protocol.h> - -/* - * Contains types and constants that define attribute pages and attribute - * numbers and their data types. - */ - -#define ATTR_SET(pg, id, l, ptr) \ - { .attr_page = pg, .attr_id = id, .len = l, .val_ptr = ptr } - -#define ATTR_DEF(pg, id, l) ATTR_SET(pg, id, l, NULL) - -/* osd-r10 4.7.3 Attributes pages */ -enum { - OSD_APAGE_OBJECT_FIRST = 0x0, - OSD_APAGE_OBJECT_DIRECTORY = 0, - OSD_APAGE_OBJECT_INFORMATION = 1, - OSD_APAGE_OBJECT_QUOTAS = 2, - OSD_APAGE_OBJECT_TIMESTAMP = 3, - OSD_APAGE_OBJECT_COLLECTIONS = 4, - OSD_APAGE_OBJECT_SECURITY = 5, - OSD_APAGE_OBJECT_LAST = 0x2fffffff, - - OSD_APAGE_PARTITION_FIRST = 0x30000000, - OSD_APAGE_PARTITION_DIRECTORY = OSD_APAGE_PARTITION_FIRST + 0, - OSD_APAGE_PARTITION_INFORMATION = OSD_APAGE_PARTITION_FIRST + 1, - OSD_APAGE_PARTITION_QUOTAS = OSD_APAGE_PARTITION_FIRST + 2, - OSD_APAGE_PARTITION_TIMESTAMP = OSD_APAGE_PARTITION_FIRST + 3, - OSD_APAGE_PARTITION_ATTR_ACCESS = OSD_APAGE_PARTITION_FIRST + 4, - OSD_APAGE_PARTITION_SECURITY = OSD_APAGE_PARTITION_FIRST + 5, - OSD_APAGE_PARTITION_LAST = 0x5FFFFFFF, - - OSD_APAGE_COLLECTION_FIRST = 0x60000000, - OSD_APAGE_COLLECTION_DIRECTORY = OSD_APAGE_COLLECTION_FIRST + 0, - OSD_APAGE_COLLECTION_INFORMATION = OSD_APAGE_COLLECTION_FIRST + 1, - OSD_APAGE_COLLECTION_TIMESTAMP = OSD_APAGE_COLLECTION_FIRST + 3, - OSD_APAGE_COLLECTION_SECURITY = OSD_APAGE_COLLECTION_FIRST + 5, - OSD_APAGE_COLLECTION_LAST = 0x8FFFFFFF, - - OSD_APAGE_ROOT_FIRST = 0x90000000, - OSD_APAGE_ROOT_DIRECTORY = OSD_APAGE_ROOT_FIRST + 0, - OSD_APAGE_ROOT_INFORMATION = OSD_APAGE_ROOT_FIRST + 1, - OSD_APAGE_ROOT_QUOTAS = OSD_APAGE_ROOT_FIRST + 2, - OSD_APAGE_ROOT_TIMESTAMP = OSD_APAGE_ROOT_FIRST + 3, - OSD_APAGE_ROOT_SECURITY = OSD_APAGE_ROOT_FIRST + 5, - OSD_APAGE_ROOT_LAST = 0xBFFFFFFF, - - OSD_APAGE_RESERVED_TYPE_FIRST = 0xC0000000, - OSD_APAGE_RESERVED_TYPE_LAST = 0xEFFFFFFF, - - OSD_APAGE_COMMON_FIRST = 0xF0000000, - OSD_APAGE_COMMON_LAST = 0xFFFFFFFD, - - OSD_APAGE_CURRENT_COMMAND = 0xFFFFFFFE, - - OSD_APAGE_REQUEST_ALL = 0xFFFFFFFF, -}; - -/* subcategories of attr pages within each range above */ -enum { - OSD_APAGE_STD_FIRST = 0x0, - OSD_APAGE_STD_DIRECTORY = 0, - OSD_APAGE_STD_INFORMATION = 1, - OSD_APAGE_STD_QUOTAS = 2, - OSD_APAGE_STD_TIMESTAMP = 3, - OSD_APAGE_STD_COLLECTIONS = 4, - OSD_APAGE_STD_POLICY_SECURITY = 5, - OSD_APAGE_STD_LAST = 0x0000007F, - - OSD_APAGE_RESERVED_FIRST = 0x00000080, - OSD_APAGE_RESERVED_LAST = 0x00007FFF, - - OSD_APAGE_OTHER_STD_FIRST = 0x00008000, - OSD_APAGE_OTHER_STD_LAST = 0x0000EFFF, - - OSD_APAGE_PUBLIC_FIRST = 0x0000F000, - OSD_APAGE_PUBLIC_LAST = 0x0000FFFF, - - OSD_APAGE_APP_DEFINED_FIRST = 0x00010000, - OSD_APAGE_APP_DEFINED_LAST = 0x1FFFFFFF, - - OSD_APAGE_VENDOR_SPECIFIC_FIRST = 0x20000000, - OSD_APAGE_VENDOR_SPECIFIC_LAST = 0x2FFFFFFF, -}; - -enum { - OSD_ATTR_PAGE_IDENTIFICATION = 0, /* in all pages 40 bytes */ -}; - -struct page_identification { - u8 vendor_identification[8]; - u8 page_identification[32]; -} __packed; - -struct osd_attr_page_header { - __be32 page_number; - __be32 page_length; -} __packed; - -/* 7.1.2.8 Root Information attributes page (OSD_APAGE_ROOT_INFORMATION) */ -enum { - OSD_ATTR_RI_OSD_SYSTEM_ID = 0x3, /* 20 */ - OSD_ATTR_RI_VENDOR_IDENTIFICATION = 0x4, /* 8 */ - OSD_ATTR_RI_PRODUCT_IDENTIFICATION = 0x5, /* 16 */ - OSD_ATTR_RI_PRODUCT_MODEL = 0x6, /* 32 */ - OSD_ATTR_RI_PRODUCT_REVISION_LEVEL = 0x7, /* 4 */ - OSD_ATTR_RI_PRODUCT_SERIAL_NUMBER = 0x8, /* variable */ - OSD_ATTR_RI_OSD_NAME = 0x9, /* variable */ - OSD_ATTR_RI_MAX_CDB_CONTINUATION_LEN = 0xA, /* 4 */ - OSD_ATTR_RI_TOTAL_CAPACITY = 0x80, /* 8 */ - OSD_ATTR_RI_USED_CAPACITY = 0x81, /* 8 */ - OSD_ATTR_RI_NUMBER_OF_PARTITIONS = 0xC0, /* 8 */ - OSD_ATTR_RI_CLOCK = 0x100, /* 6 */ - OARI_DEFAULT_ISOLATION_METHOD = 0X110, /* 1 */ - OARI_SUPPORTED_ISOLATION_METHODS = 0X111, /* 32 */ - - OARI_DATA_ATOMICITY_GUARANTEE = 0X120, /* 8 */ - OARI_DATA_ATOMICITY_ALIGNMENT = 0X121, /* 8 */ - OARI_ATTRIBUTES_ATOMICITY_GUARANTEE = 0X122, /* 8 */ - OARI_DATA_ATTRIBUTES_ATOMICITY_MULTIPLIER = 0X123, /* 1 */ - - OARI_MAXIMUM_SNAPSHOTS_COUNT = 0X1C1, /* 0 or 4 */ - OARI_MAXIMUM_CLONES_COUNT = 0X1C2, /* 0 or 4 */ - OARI_MAXIMUM_BRANCH_DEPTH = 0X1CC, /* 0 or 4 */ - OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_FIRST = 0X200, /* 0 or 4 */ - OARI_SUPPORTED_OBJECT_DUPLICATION_METHOD_LAST = 0X2ff, /* 0 or 4 */ - OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_FIRST = 0X300, /* 0 or 4 */ - OARI_SUPPORTED_TIME_OF_DUPLICATION_METHOD_LAST = 0X30F, /* 0 or 4 */ - OARI_SUPPORT_FOR_DUPLICATED_OBJECT_FREEZING = 0X310, /* 0 or 4 */ - OARI_SUPPORT_FOR_SNAPSHOT_REFRESHING = 0X311, /* 0 or 1 */ - OARI_SUPPORTED_CDB_CONTINUATION_DESC_TYPE_FIRST = 0X7000001,/* 0 or 4 */ - OARI_SUPPORTED_CDB_CONTINUATION_DESC_TYPE_LAST = 0X700FFFF,/* 0 or 4 */ -}; -/* Root_Information_attributes_page does not have a get_page structure */ - -/* 7.1.2.9 Partition Information attributes page - * (OSD_APAGE_PARTITION_INFORMATION) - */ -enum { - OSD_ATTR_PI_PARTITION_ID = 0x1, /* 8 */ - OSD_ATTR_PI_USERNAME = 0x9, /* variable */ - OSD_ATTR_PI_USED_CAPACITY = 0x81, /* 8 */ - OSD_ATTR_PI_USED_CAPACITY_INCREMENT = 0x84, /* 0 or 8 */ - OSD_ATTR_PI_NUMBER_OF_OBJECTS = 0xC1, /* 8 */ - - OSD_ATTR_PI_ACTUAL_DATA_SPACE = 0xD1, /* 0 or 8 */ - OSD_ATTR_PI_RESERVED_DATA_SPACE = 0xD2, /* 0 or 8 */ - OSD_ATTR_PI_DEFAULT_SNAPSHOT_DUPLICATION_METHOD = 0x200,/* 0 or 4 */ - OSD_ATTR_PI_DEFAULT_CLONE_DUPLICATION_METHOD = 0x201,/* 0 or 4 */ - OSD_ATTR_PI_DEFAULT_SP_TIME_OF_DUPLICATION = 0x300,/* 0 or 4 */ - OSD_ATTR_PI_DEFAULT_CLONE_TIME_OF_DUPLICATION = 0x301,/* 0 or 4 */ -}; -/* Partition Information attributes page does not have a get_page structure */ - -/* 7.1.2.10 Collection Information attributes page - * (OSD_APAGE_COLLECTION_INFORMATION) - */ -enum { - OSD_ATTR_CI_PARTITION_ID = 0x1, /* 8 */ - OSD_ATTR_CI_COLLECTION_OBJECT_ID = 0x2, /* 8 */ - OSD_ATTR_CI_USERNAME = 0x9, /* variable */ - OSD_ATTR_CI_COLLECTION_TYPE = 0xA, /* 1 */ - OSD_ATTR_CI_USED_CAPACITY = 0x81, /* 8 */ -}; -/* Collection Information attributes page does not have a get_page structure */ - -/* 7.1.2.11 User Object Information attributes page - * (OSD_APAGE_OBJECT_INFORMATION) - */ -enum { - OSD_ATTR_OI_PARTITION_ID = 0x1, /* 8 */ - OSD_ATTR_OI_OBJECT_ID = 0x2, /* 8 */ - OSD_ATTR_OI_USERNAME = 0x9, /* variable */ - OSD_ATTR_OI_USED_CAPACITY = 0x81, /* 8 */ - OSD_ATTR_OI_LOGICAL_LENGTH = 0x82, /* 8 */ - SD_ATTR_OI_ACTUAL_DATA_SPACE = 0XD1, /* 0 OR 8 */ - SD_ATTR_OI_RESERVED_DATA_SPACE = 0XD2, /* 0 OR 8 */ -}; -/* Object Information attributes page does not have a get_page structure */ - -/* 7.1.2.12 Root Quotas attributes page (OSD_APAGE_ROOT_QUOTAS) */ -enum { - OSD_ATTR_RQ_DEFAULT_MAXIMUM_USER_OBJECT_LENGTH = 0x1, /* 8 */ - OSD_ATTR_RQ_PARTITION_CAPACITY_QUOTA = 0x10001, /* 8 */ - OSD_ATTR_RQ_PARTITION_OBJECT_COUNT = 0x10002, /* 8 */ - OSD_ATTR_RQ_PARTITION_COLLECTIONS_PER_USER_OBJECT = 0x10081, /* 4 */ - OSD_ATTR_RQ_PARTITION_COUNT = 0x20002, /* 8 */ -}; - -struct Root_Quotas_attributes_page { - struct osd_attr_page_header hdr; /* id=R+2, size=0x24 */ - __be64 default_maximum_user_object_length; - __be64 partition_capacity_quota; - __be64 partition_object_count; - __be64 partition_collections_per_user_object; - __be64 partition_count; -} __packed; - -/* 7.1.2.13 Partition Quotas attributes page (OSD_APAGE_PARTITION_QUOTAS)*/ -enum { - OSD_ATTR_PQ_DEFAULT_MAXIMUM_USER_OBJECT_LENGTH = 0x1, /* 8 */ - OSD_ATTR_PQ_CAPACITY_QUOTA = 0x10001, /* 8 */ - OSD_ATTR_PQ_OBJECT_COUNT = 0x10002, /* 8 */ - OSD_ATTR_PQ_COLLECTIONS_PER_USER_OBJECT = 0x10081, /* 4 */ -}; - -struct Partition_Quotas_attributes_page { - struct osd_attr_page_header hdr; /* id=P+2, size=0x1C */ - __be64 default_maximum_user_object_length; - __be64 capacity_quota; - __be64 object_count; - __be64 collections_per_user_object; -} __packed; - -/* 7.1.2.14 User Object Quotas attributes page (OSD_APAGE_OBJECT_QUOTAS) */ -enum { - OSD_ATTR_OQ_MAXIMUM_LENGTH = 0x1, /* 8 */ -}; - -struct Object_Quotas_attributes_page { - struct osd_attr_page_header hdr; /* id=U+2, size=0x8 */ - __be64 maximum_length; -} __packed; - -/* 7.1.2.15 Root Timestamps attributes page (OSD_APAGE_ROOT_TIMESTAMP) */ -enum { - OSD_ATTR_RT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */ - OSD_ATTR_RT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */ - OSD_ATTR_RT_TIMESTAMP_BYPASS = 0xFFFFFFFE, /* 1 */ -}; - -struct root_timestamps_attributes_page { - struct osd_attr_page_header hdr; /* id=R+3, size=0xD */ - struct osd_timestamp attributes_accessed_time; - struct osd_timestamp attributes_modified_time; - u8 timestamp_bypass; -} __packed; - -/* 7.1.2.16 Partition Timestamps attributes page - * (OSD_APAGE_PARTITION_TIMESTAMP) - */ -enum { - OSD_ATTR_PT_CREATED_TIME = 0x1, /* 6 */ - OSD_ATTR_PT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */ - OSD_ATTR_PT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */ - OSD_ATTR_PT_DATA_ACCESSED_TIME = 0x4, /* 6 */ - OSD_ATTR_PT_DATA_MODIFIED_TIME = 0x5, /* 6 */ - OSD_ATTR_PT_TIMESTAMP_BYPASS = 0xFFFFFFFE, /* 1 */ -}; - -struct partition_timestamps_attributes_page { - struct osd_attr_page_header hdr; /* id=P+3, size=0x1F */ - struct osd_timestamp created_time; - struct osd_timestamp attributes_accessed_time; - struct osd_timestamp attributes_modified_time; - struct osd_timestamp data_accessed_time; - struct osd_timestamp data_modified_time; - u8 timestamp_bypass; -} __packed; - -/* 7.1.2.17/18 Collection/Object Timestamps attributes page - * (OSD_APAGE_COLLECTION_TIMESTAMP/OSD_APAGE_OBJECT_TIMESTAMP) - */ -enum { - OSD_ATTR_OT_CREATED_TIME = 0x1, /* 6 */ - OSD_ATTR_OT_ATTRIBUTES_ACCESSED_TIME = 0x2, /* 6 */ - OSD_ATTR_OT_ATTRIBUTES_MODIFIED_TIME = 0x3, /* 6 */ - OSD_ATTR_OT_DATA_ACCESSED_TIME = 0x4, /* 6 */ - OSD_ATTR_OT_DATA_MODIFIED_TIME = 0x5, /* 6 */ -}; - -/* same for collection */ -struct object_timestamps_attributes_page { - struct osd_attr_page_header hdr; /* id=C+3/3, size=0x1E */ - struct osd_timestamp created_time; - struct osd_timestamp attributes_accessed_time; - struct osd_timestamp attributes_modified_time; - struct osd_timestamp data_accessed_time; - struct osd_timestamp data_modified_time; -} __packed; - -/* OSD2r05: 7.1.3.19 Attributes Access attributes page - * (OSD_APAGE_PARTITION_ATTR_ACCESS) - * - * each attribute is of the form below. Total array length is deduced - * from the attribute's length - * (See allowed_attributes_access of the struct osd_cap_object_descriptor) - */ -struct attributes_access_attr { - struct osd_attributes_list_attrid attr_list[0]; -} __packed; - -/* OSD2r05: 7.1.2.21 Collections attributes page */ -/* TBD */ - -/* 7.1.2.20 Root Policy/Security attributes page (OSD_APAGE_ROOT_SECURITY) */ -enum { - OSD_ATTR_RS_DEFAULT_SECURITY_METHOD = 0x1, /* 1 */ - OSD_ATTR_RS_OLDEST_VALID_NONCE_LIMIT = 0x2, /* 6 */ - OSD_ATTR_RS_NEWEST_VALID_NONCE_LIMIT = 0x3, /* 6 */ - OSD_ATTR_RS_PARTITION_DEFAULT_SECURITY_METHOD = 0x6, /* 1 */ - OSD_ATTR_RS_SUPPORTED_SECURITY_METHODS = 0x7, /* 2 */ - OSD_ATTR_RS_ADJUSTABLE_CLOCK = 0x9, /* 6 */ - OSD_ATTR_RS_MASTER_KEY_IDENTIFIER = 0x7FFD, /* 0 or 7 */ - OSD_ATTR_RS_ROOT_KEY_IDENTIFIER = 0x7FFE, /* 0 or 7 */ - OSD_ATTR_RS_SUPPORTED_INTEGRITY_ALGORITHM_0 = 0x80000000,/* 1,(x16)*/ - OSD_ATTR_RS_SUPPORTED_DH_GROUP_0 = 0x80000010,/* 1,(x16)*/ -}; - -struct root_security_attributes_page { - struct osd_attr_page_header hdr; /* id=R+5, size=0x3F */ - u8 default_security_method; - u8 partition_default_security_method; - __be16 supported_security_methods; - u8 mki_valid_rki_valid; - struct osd_timestamp oldest_valid_nonce_limit; - struct osd_timestamp newest_valid_nonce_limit; - struct osd_timestamp adjustable_clock; - u8 master_key_identifier[32-25]; - u8 root_key_identifier[39-32]; - u8 supported_integrity_algorithm[16]; - u8 supported_dh_group[16]; -} __packed; - -/* 7.1.2.21 Partition Policy/Security attributes page - * (OSD_APAGE_PARTITION_SECURITY) - */ -enum { - OSD_ATTR_PS_DEFAULT_SECURITY_METHOD = 0x1, /* 1 */ - OSD_ATTR_PS_OLDEST_VALID_NONCE = 0x2, /* 6 */ - OSD_ATTR_PS_NEWEST_VALID_NONCE = 0x3, /* 6 */ - OSD_ATTR_PS_REQUEST_NONCE_LIST_DEPTH = 0x4, /* 2 */ - OSD_ATTR_PS_FROZEN_WORKING_KEY_BIT_MASK = 0x5, /* 2 */ - OSD_ATTR_PS_PARTITION_KEY_IDENTIFIER = 0x7FFF, /* 0 or 7 */ - OSD_ATTR_PS_WORKING_KEY_IDENTIFIER_FIRST = 0x8000, /* 0 or 7 */ - OSD_ATTR_PS_WORKING_KEY_IDENTIFIER_LAST = 0x800F, /* 0 or 7 */ - OSD_ATTR_PS_POLICY_ACCESS_TAG = 0x40000001, /* 4 */ - OSD_ATTR_PS_USER_OBJECT_POLICY_ACCESS_TAG = 0x40000002, /* 4 */ -}; - -struct partition_security_attributes_page { - struct osd_attr_page_header hdr; /* id=p+5, size=0x8f */ - u8 reserved[3]; - u8 default_security_method; - struct osd_timestamp oldest_valid_nonce; - struct osd_timestamp newest_valid_nonce; - __be16 request_nonce_list_depth; - __be16 frozen_working_key_bit_mask; - __be32 policy_access_tag; - __be32 user_object_policy_access_tag; - u8 pki_valid; - __be16 wki_00_0f_vld; - struct osd_key_identifier partition_key_identifier; - struct osd_key_identifier working_key_identifiers[16]; -} __packed; - -/* 7.1.2.22/23 Collection/Object Policy-Security attributes page - * (OSD_APAGE_COLLECTION_SECURITY/OSD_APAGE_OBJECT_SECURITY) - */ -enum { - OSD_ATTR_OS_POLICY_ACCESS_TAG = 0x40000001, /* 4 */ -}; - -struct object_security_attributes_page { - struct osd_attr_page_header hdr; /* id=C+5/5, size=4 */ - __be32 policy_access_tag; -} __packed; - -/* OSD2r05: 7.1.3.31 Current Command attributes page - * (OSD_APAGE_CURRENT_COMMAND) - */ -enum { - OSD_ATTR_CC_RESPONSE_INTEGRITY_CHECK_VALUE = 0x1, /* 32 */ - OSD_ATTR_CC_OBJECT_TYPE = 0x2, /* 1 */ - OSD_ATTR_CC_PARTITION_ID = 0x3, /* 8 */ - OSD_ATTR_CC_OBJECT_ID = 0x4, /* 8 */ - OSD_ATTR_CC_STARTING_BYTE_ADDRESS_OF_APPEND = 0x5, /* 8 */ - OSD_ATTR_CC_CHANGE_IN_USED_CAPACITY = 0x6, /* 8 */ -}; - -/*TBD: osdv1_current_command_attributes_page */ - -struct osdv2_current_command_attributes_page { - struct osd_attr_page_header hdr; /* id=0xFFFFFFFE, size=0x44 */ - u8 response_integrity_check_value[OSD_CRYPTO_KEYID_SIZE]; - u8 object_type; - u8 reserved[3]; - __be64 partition_id; - __be64 object_id; - __be64 starting_byte_address_of_append; - __be64 change_in_used_capacity; -}; - -#endif /*ndef __OSD_ATTRIBUTES_H__*/ diff --git a/include/scsi/osd_protocol.h b/include/scsi/osd_protocol.h deleted file mode 100644 index e0ca835e7bf7..000000000000 --- a/include/scsi/osd_protocol.h +++ /dev/null @@ -1,676 +0,0 @@ -/* - * osd_protocol.h - OSD T10 standard C definitions. - * - * Copyright (C) 2008 Panasas Inc. All rights reserved. - * - * Authors: - * Boaz Harrosh <ooo@electrozaur.com> - * Benny Halevy <bhalevy@panasas.com> - * - * 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_PROTOCOL_H__ -#define __OSD_PROTOCOL_H__ - -#include <linux/types.h> -#include <linux/kernel.h> -#include <asm/unaligned.h> -#include <scsi/scsi.h> - -enum { - OSDv1_ADDITIONAL_CDB_LENGTH = 192, - OSDv1_TOTAL_CDB_LEN = OSDv1_ADDITIONAL_CDB_LENGTH + 8, - OSDv1_CAP_LEN = 80, - - /* Latest supported version */ - OSDv2_ADDITIONAL_CDB_LENGTH = 228, - OSD_ADDITIONAL_CDB_LENGTH = - OSDv2_ADDITIONAL_CDB_LENGTH, - OSD_TOTAL_CDB_LEN = OSD_ADDITIONAL_CDB_LENGTH + 8, - OSD_CAP_LEN = 104, - - OSD_SYSTEMID_LEN = 20, - OSDv1_CRYPTO_KEYID_SIZE = 20, - OSDv2_CRYPTO_KEYID_SIZE = 32, - OSD_CRYPTO_KEYID_SIZE = OSDv2_CRYPTO_KEYID_SIZE, - OSD_CRYPTO_SEED_SIZE = 4, - OSD_CRYPTO_NONCE_SIZE = 12, - OSD_MAX_SENSE_LEN = 252, /* from SPC-3 */ - - OSD_PARTITION_FIRST_ID = 0x10000, - OSD_OBJECT_FIRST_ID = 0x10000, -}; - -/* (osd-r10 5.2.4) - * osd2r03: 5.2.3 Caching control bits - */ -enum osd_options_byte { - OSD_CDB_FUA = 0x08, /* Force Unit Access */ - OSD_CDB_DPO = 0x10, /* Disable Page Out */ -}; - -/* - * osd2r03: 5.2.5 Isolation. - * First 3 bits, V2-only. - * Also for attr 110h "default isolation method" at Root Information page - */ -enum osd_options_byte_isolation { - OSD_ISOLATION_DEFAULT = 0, - OSD_ISOLATION_NONE = 1, - OSD_ISOLATION_STRICT = 2, - OSD_ISOLATION_RANGE = 4, - OSD_ISOLATION_FUNCTIONAL = 5, - OSD_ISOLATION_VENDOR = 7, -}; - -/* (osd-r10: 6.7) - * osd2r03: 6.8 FLUSH, FLUSH COLLECTION, FLUSH OSD, FLUSH PARTITION - */ -enum osd_options_flush_scope_values { - OSD_CDB_FLUSH_ALL = 0, - OSD_CDB_FLUSH_ATTR_ONLY = 1, - - OSD_CDB_FLUSH_ALL_RECURSIVE = 2, - /* V2-only */ - OSD_CDB_FLUSH_ALL_RANGE = 2, -}; - -/* osd2r03: 5.2.10 Timestamps control */ -enum { - OSD_CDB_NORMAL_TIMESTAMPS = 0, - OSD_CDB_BYPASS_TIMESTAMPS = 0x7f, -}; - -/* (osd-r10: 5.2.2.1) - * osd2r03: 5.2.4.1 Get and set attributes CDB format selection - * 2 bits at second nibble of command_specific_options byte - */ -enum osd_attributes_mode { - /* V2-only */ - OSD_CDB_SET_ONE_ATTR = 0x10, - - OSD_CDB_GET_ATTR_PAGE_SET_ONE = 0x20, - OSD_CDB_GET_SET_ATTR_LISTS = 0x30, - - OSD_CDB_GET_SET_ATTR_MASK = 0x30, -}; - -/* (osd-r10: 4.12.5) - * osd2r03: 4.14.5 Data-In and Data-Out buffer offsets - * byte offset = mantissa * (2^(exponent+8)) - * struct { - * unsigned mantissa: 28; - * int exponent: 04; - * } - */ -typedef __be32 osd_cdb_offset; - -enum { - OSD_OFFSET_UNUSED = 0xFFFFFFFF, - OSD_OFFSET_MAX_BITS = 28, - - OSDv1_OFFSET_MIN_SHIFT = 8, - OSD_OFFSET_MIN_SHIFT = 3, - OSD_OFFSET_MAX_SHIFT = 16, -}; - -/* Return the smallest allowed encoded offset that contains @offset. - * - * The actual encoded offset returned is @offset + *padding. - * (up to max_shift, non-inclusive) - */ -osd_cdb_offset __osd_encode_offset(u64 offset, unsigned *padding, - int min_shift, int max_shift); - -/* Minimum alignment is 256 bytes - * Note: Seems from std v1 that exponent can be from 0+8 to 0xE+8 (inclusive) - * which is 8 to 23 but IBM code restricts it to 16, so be it. - */ -static inline osd_cdb_offset osd_encode_offset_v1(u64 offset, unsigned *padding) -{ - return __osd_encode_offset(offset, padding, - OSDv1_OFFSET_MIN_SHIFT, OSD_OFFSET_MAX_SHIFT); -} - -/* Minimum 8 bytes alignment - * Same as v1 but since exponent can be signed than a less than - * 256 alignment can be reached with small offsets (<2GB) - */ -static inline osd_cdb_offset osd_encode_offset_v2(u64 offset, unsigned *padding) -{ - return __osd_encode_offset(offset, padding, - OSD_OFFSET_MIN_SHIFT, OSD_OFFSET_MAX_SHIFT); -} - -/* osd2r03: 5.2.1 Overview */ -struct osd_cdb_head { - struct scsi_varlen_cdb_hdr varlen_cdb; -/*10*/ u8 options; - u8 command_specific_options; - u8 timestamp_control; -/*13*/ u8 reserved1[3]; -/*16*/ __be64 partition; -/*24*/ __be64 object; -/*32*/ union { /* V1 vs V2 alignment differences */ - struct __osdv1_cdb_addr_len { -/*32*/ __be32 list_identifier;/* Rarely used */ -/*36*/ __be64 length; -/*44*/ __be64 start_address; - } __packed v1; - - struct __osdv2_cdb_addr_len { - /* called allocation_length in some commands */ -/*32*/ __be64 length; -/*40*/ __be64 start_address; - union { -/*48*/ __be32 list_identifier;/* Rarely used */ - /* OSD2r05 5.2.5 CDB continuation length */ -/*48*/ __be32 cdb_continuation_length; - }; - } __packed v2; - }; -/*52*/ union { /* selected attributes mode Page/List/Single */ - struct osd_attributes_page_mode { -/*52*/ __be32 get_attr_page; -/*56*/ __be32 get_attr_alloc_length; -/*60*/ osd_cdb_offset get_attr_offset; - -/*64*/ __be32 set_attr_page; -/*68*/ __be32 set_attr_id; -/*72*/ __be32 set_attr_length; -/*76*/ osd_cdb_offset set_attr_offset; -/*80*/ } __packed attrs_page; - - struct osd_attributes_list_mode { -/*52*/ __be32 get_attr_desc_bytes; -/*56*/ osd_cdb_offset get_attr_desc_offset; - -/*60*/ __be32 get_attr_alloc_length; -/*64*/ osd_cdb_offset get_attr_offset; - -/*68*/ __be32 set_attr_bytes; -/*72*/ osd_cdb_offset set_attr_offset; - __be32 not_used; -/*80*/ } __packed attrs_list; - - /* osd2r03:5.2.4.2 Set one attribute value using CDB fields */ - struct osd_attributes_cdb_mode { -/*52*/ __be32 set_attr_page; -/*56*/ __be32 set_attr_id; -/*60*/ __be16 set_attr_len; -/*62*/ u8 set_attr_val[18]; -/*80*/ } __packed attrs_cdb; -/*52*/ u8 get_set_attributes_parameters[28]; - }; -} __packed; -/*80*/ - -/*160 v1*/ -struct osdv1_security_parameters { -/*160*/u8 integrity_check_value[OSDv1_CRYPTO_KEYID_SIZE]; -/*180*/u8 request_nonce[OSD_CRYPTO_NONCE_SIZE]; -/*192*/osd_cdb_offset data_in_integrity_check_offset; -/*196*/osd_cdb_offset data_out_integrity_check_offset; -} __packed; -/*200 v1*/ - -/*184 v2*/ -struct osdv2_security_parameters { -/*184*/u8 integrity_check_value[OSDv2_CRYPTO_KEYID_SIZE]; -/*216*/u8 request_nonce[OSD_CRYPTO_NONCE_SIZE]; -/*228*/osd_cdb_offset data_in_integrity_check_offset; -/*232*/osd_cdb_offset data_out_integrity_check_offset; -} __packed; -/*236 v2*/ - -struct osd_security_parameters { - union { - struct osdv1_security_parameters v1; - struct osdv2_security_parameters v2; - }; -}; - -struct osdv1_cdb { - struct osd_cdb_head h; - u8 caps[OSDv1_CAP_LEN]; - struct osdv1_security_parameters sec_params; -} __packed; - -struct osdv2_cdb { - struct osd_cdb_head h; - u8 caps[OSD_CAP_LEN]; - struct osdv2_security_parameters sec_params; -} __packed; - -struct osd_cdb { - union { - struct osdv1_cdb v1; - struct osdv2_cdb v2; - u8 buff[OSD_TOTAL_CDB_LEN]; - }; -} __packed; - -static inline struct osd_cdb_head *osd_cdb_head(struct osd_cdb *ocdb) -{ - return (struct osd_cdb_head *)ocdb->buff; -} - -/* define both version actions - * Ex name = FORMAT_OSD we have OSD_ACT_FORMAT_OSD && OSDv1_ACT_FORMAT_OSD - */ -#define OSD_ACT___(Name, Num) \ - OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), \ - OSDv1_ACT_##Name = cpu_to_be16(0x8800 + Num), - -/* V2 only actions */ -#define OSD_ACT_V2(Name, Num) \ - OSD_ACT_##Name = cpu_to_be16(0x8880 + Num), - -#define OSD_ACT_V1_V2(Name, Num1, Num2) \ - OSD_ACT_##Name = cpu_to_be16(Num2), \ - OSDv1_ACT_##Name = cpu_to_be16(Num1), - -enum osd_service_actions { - OSD_ACT_V2(OBJECT_STRUCTURE_CHECK, 0x00) - OSD_ACT___(FORMAT_OSD, 0x01) - OSD_ACT___(CREATE, 0x02) - OSD_ACT___(LIST, 0x03) - OSD_ACT_V2(PUNCH, 0x04) - OSD_ACT___(READ, 0x05) - OSD_ACT___(WRITE, 0x06) - OSD_ACT___(APPEND, 0x07) - OSD_ACT___(FLUSH, 0x08) - OSD_ACT_V2(CLEAR, 0x09) - OSD_ACT___(REMOVE, 0x0A) - OSD_ACT___(CREATE_PARTITION, 0x0B) - OSD_ACT___(REMOVE_PARTITION, 0x0C) - OSD_ACT___(GET_ATTRIBUTES, 0x0E) - OSD_ACT___(SET_ATTRIBUTES, 0x0F) - OSD_ACT___(CREATE_AND_WRITE, 0x12) - OSD_ACT___(CREATE_COLLECTION, 0x15) - OSD_ACT___(REMOVE_COLLECTION, 0x16) - OSD_ACT___(LIST_COLLECTION, 0x17) - OSD_ACT___(SET_KEY, 0x18) - OSD_ACT___(SET_MASTER_KEY, 0x19) - OSD_ACT___(FLUSH_COLLECTION, 0x1A) - OSD_ACT___(FLUSH_PARTITION, 0x1B) - OSD_ACT___(FLUSH_OSD, 0x1C) - - OSD_ACT_V2(QUERY, 0x20) - OSD_ACT_V2(REMOVE_MEMBER_OBJECTS, 0x21) - OSD_ACT_V2(GET_MEMBER_ATTRIBUTES, 0x22) - OSD_ACT_V2(SET_MEMBER_ATTRIBUTES, 0x23) - - OSD_ACT_V2(CREATE_CLONE, 0x28) - OSD_ACT_V2(CREATE_SNAPSHOT, 0x29) - OSD_ACT_V2(DETACH_CLONE, 0x2A) - OSD_ACT_V2(REFRESH_SNAPSHOT_CLONE, 0x2B) - OSD_ACT_V2(RESTORE_PARTITION_FROM_SNAPSHOT, 0x2C) - - OSD_ACT_V2(READ_MAP, 0x31) - OSD_ACT_V2(READ_MAPS_COMPARE, 0x32) - - OSD_ACT_V1_V2(PERFORM_SCSI_COMMAND, 0x8F7E, 0x8F7C) - OSD_ACT_V1_V2(SCSI_TASK_MANAGEMENT, 0x8F7F, 0x8F7D) - /* 0x8F80 to 0x8FFF are Vendor specific */ -}; - -/* osd2r03: 7.1.3.2 List entry format for retrieving attributes */ -struct osd_attributes_list_attrid { - __be32 attr_page; - __be32 attr_id; -} __packed; - -/* - * NOTE: v1: is not aligned. - */ -struct osdv1_attributes_list_element { - __be32 attr_page; - __be32 attr_id; - __be16 attr_bytes; /* valid bytes at attr_val without padding */ - u8 attr_val[0]; -} __packed; - -/* - * osd2r03: 7.1.3.3 List entry format for retrieved attributes and - * for setting attributes - * NOTE: v2 is 8-bytes aligned - */ -struct osdv2_attributes_list_element { - __be32 attr_page; - __be32 attr_id; - u8 reserved[6]; - __be16 attr_bytes; /* valid bytes at attr_val without padding */ - u8 attr_val[0]; -} __packed; - -enum { - OSDv1_ATTRIBUTES_ELEM_ALIGN = 1, - OSD_ATTRIBUTES_ELEM_ALIGN = 8, -}; - -enum { - OSD_ATTR_LIST_ALL_PAGES = 0xFFFFFFFF, - OSD_ATTR_LIST_ALL_IN_PAGE = 0xFFFFFFFF, -}; - -static inline unsigned osdv1_attr_list_elem_size(unsigned len) -{ - return ALIGN(len + sizeof(struct osdv1_attributes_list_element), - OSDv1_ATTRIBUTES_ELEM_ALIGN); -} - -static inline unsigned osdv2_attr_list_elem_size(unsigned len) -{ - return ALIGN(len + sizeof(struct osdv2_attributes_list_element), - OSD_ATTRIBUTES_ELEM_ALIGN); -} - -/* - * osd2r03: 7.1.3 OSD attributes lists (Table 184) — List type values - */ -enum osd_attr_list_types { - OSD_ATTR_LIST_GET = 0x1, /* descriptors only */ - OSD_ATTR_LIST_SET_RETRIEVE = 0x9, /*descriptors/values variable-length*/ - OSD_V2_ATTR_LIST_MULTIPLE = 0xE, /* ver2, Multiple Objects lists*/ - OSD_V1_ATTR_LIST_CREATE_MULTIPLE = 0xF,/*ver1, used by create_multple*/ -}; - -/* osd2r03: 7.1.3.4 Multi-object retrieved attributes format */ -struct osd_attributes_list_multi_header { - __be64 object_id; - u8 object_type; /* object_type enum below */ - u8 reserved[5]; - __be16 list_bytes; - /* followed by struct osd_attributes_list_element's */ -}; - -struct osdv1_attributes_list_header { - u8 type; /* low 4-bit only */ - u8 pad; - __be16 list_bytes; /* Initiator shall set to Zero. Only set by target */ - /* - * type=9 followed by struct osd_attributes_list_element's - * type=E followed by struct osd_attributes_list_multi_header's - */ -} __packed; - -static inline unsigned osdv1_list_size(struct osdv1_attributes_list_header *h) -{ - return be16_to_cpu(h->list_bytes); -} - -struct osdv2_attributes_list_header { - u8 type; /* lower 4-bits only */ - u8 pad[3]; -/*4*/ __be32 list_bytes; /* Initiator shall set to zero. Only set by target */ - /* - * type=9 followed by struct osd_attributes_list_element's - * type=E followed by struct osd_attributes_list_multi_header's - */ -} __packed; - -static inline unsigned osdv2_list_size(struct osdv2_attributes_list_header *h) -{ - return be32_to_cpu(h->list_bytes); -} - -/* (osd-r10 6.13) - * osd2r03: 6.15 LIST (Table 79) LIST command parameter data. - * for root_lstchg below - */ -enum { - OSD_OBJ_ID_LIST_PAR = 0x1, /* V1-only. Not used in V2 */ - OSD_OBJ_ID_LIST_LSTCHG = 0x2, -}; - -/* - * osd2r03: 6.15.2 LIST command parameter data - * (Also for LIST COLLECTION) - */ -struct osd_obj_id_list { - __be64 list_bytes; /* bytes in list excluding list_bytes (-8) */ - __be64 continuation_id; - __be32 list_identifier; - u8 pad[3]; - u8 root_lstchg; - __be64 object_ids[0]; -} __packed; - -static inline bool osd_is_obj_list_done(struct osd_obj_id_list *list, - bool *is_changed) -{ - *is_changed = (0 != (list->root_lstchg & OSD_OBJ_ID_LIST_LSTCHG)); - return 0 != list->continuation_id; -} - -/* - * osd2r03: 4.12.4.5 The ALLDATA security method - */ -struct osd_data_out_integrity_info { - __be64 data_bytes; - __be64 set_attributes_bytes; - __be64 get_attributes_bytes; - __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE]; -} __packed; - -/* Same osd_data_out_integrity_info is used for OSD2/OSD1. The only difference - * Is the sizeof the structure since in OSD1 the last array is smaller. Use - * below for version independent handling of this structure - */ -static inline int osd_data_out_integrity_info_sizeof(bool is_ver1) -{ - return sizeof(struct osd_data_out_integrity_info) - - (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE)); -} - -struct osd_data_in_integrity_info { - __be64 data_bytes; - __be64 retrieved_attributes_bytes; - __u8 integrity_check_value[OSD_CRYPTO_KEYID_SIZE]; -} __packed; - -/* Same osd_data_in_integrity_info is used for OSD2/OSD1. The only difference - * Is the sizeof the structure since in OSD1 the last array is smaller. Use - * below for version independent handling of this structure - */ -static inline int osd_data_in_integrity_info_sizeof(bool is_ver1) -{ - return sizeof(struct osd_data_in_integrity_info) - - (is_ver1 * (OSDv2_CRYPTO_KEYID_SIZE - OSDv1_CRYPTO_KEYID_SIZE)); -} - -struct osd_timestamp { - u8 time[6]; /* number of milliseconds since 1/1/1970 UT (big endian) */ -} __packed; -/* FIXME: define helper functions to convert to/from osd time format */ - -/* - * Capability & Security definitions - * osd2r03: 4.11.2.2 Capability format - * osd2r03: 5.2.8 Security parameters - */ - -struct osd_key_identifier { - u8 id[7]; /* if you know why 7 please email ooo@electrozaur.com */ -} __packed; - -/* for osd_capability.format */ -enum { - OSD_SEC_CAP_FORMAT_NO_CAPS = 0, - OSD_SEC_CAP_FORMAT_VER1 = 1, - OSD_SEC_CAP_FORMAT_VER2 = 2, -}; - -/* security_method */ -enum { - OSD_SEC_NOSEC = 0, - OSD_SEC_CAPKEY = 1, - OSD_SEC_CMDRSP = 2, - OSD_SEC_ALLDATA = 3, -}; - -enum object_type { - OSD_SEC_OBJ_ROOT = 0x1, - OSD_SEC_OBJ_PARTITION = 0x2, - OSD_SEC_OBJ_COLLECTION = 0x40, - OSD_SEC_OBJ_USER = 0x80, -}; - -enum osd_capability_bit_masks { - OSD_SEC_CAP_APPEND = BIT(0), - OSD_SEC_CAP_OBJ_MGMT = BIT(1), - OSD_SEC_CAP_REMOVE = BIT(2), - OSD_SEC_CAP_CREATE = BIT(3), - OSD_SEC_CAP_SET_ATTR = BIT(4), - OSD_SEC_CAP_GET_ATTR = BIT(5), - OSD_SEC_CAP_WRITE = BIT(6), - OSD_SEC_CAP_READ = BIT(7), - - OSD_SEC_CAP_NONE1 = BIT(8), - OSD_SEC_CAP_NONE2 = BIT(9), - OSD_SEC_GBL_REM = BIT(10), /*v2 only*/ - OSD_SEC_CAP_QUERY = BIT(11), /*v2 only*/ - OSD_SEC_CAP_M_OBJECT = BIT(12), /*v2 only*/ - OSD_SEC_CAP_POL_SEC = BIT(13), - OSD_SEC_CAP_GLOBAL = BIT(14), - OSD_SEC_CAP_DEV_MGMT = BIT(15), -}; - -/* for object_descriptor_type (hi nibble used) */ -enum { - OSD_SEC_OBJ_DESC_NONE = 0, /* Not allowed */ - OSD_SEC_OBJ_DESC_OBJ = 1 << 4, /* v1: also collection */ - OSD_SEC_OBJ_DESC_PAR = 2 << 4, /* also root */ - OSD_SEC_OBJ_DESC_COL = 3 << 4, /* v2 only */ -}; - -/* (osd-r10:4.9.2.2) - * osd2r03:4.11.2.2 Capability format - */ -struct osd_capability_head { - u8 format; /* low nibble */ - u8 integrity_algorithm__key_version; /* MAKE_BYTE(integ_alg, key_ver) */ - u8 security_method; - u8 reserved1; -/*04*/ struct osd_timestamp expiration_time; -/*10*/ u8 audit[20]; -/*30*/ u8 discriminator[12]; -/*42*/ struct osd_timestamp object_created_time; -/*48*/ u8 object_type; -/*49*/ u8 permissions_bit_mask[5]; -/*54*/ u8 reserved2; -/*55*/ u8 object_descriptor_type; /* high nibble */ -} __packed; - -/*56 v1*/ -struct osdv1_cap_object_descriptor { - union { - struct { -/*56*/ __be32 policy_access_tag; -/*60*/ __be64 allowed_partition_id; -/*68*/ __be64 allowed_object_id; -/*76*/ __be32 reserved; - } __packed obj_desc; - -/*56*/ u8 object_descriptor[24]; - }; -} __packed; -/*80 v1*/ - -/*56 v2*/ -struct osd_cap_object_descriptor { - union { - struct { -/*56*/ __be32 allowed_attributes_access; -/*60*/ __be32 policy_access_tag; -/*64*/ __be16 boot_epoch; -/*66*/ u8 reserved[6]; -/*72*/ __be64 allowed_partition_id; -/*80*/ __be64 allowed_object_id; -/*88*/ __be64 allowed_range_length; -/*96*/ __be64 allowed_range_start; - } __packed obj_desc; - -/*56*/ u8 object_descriptor[48]; - }; -} __packed; -/*104 v2*/ - -struct osdv1_capability { - struct osd_capability_head h; - struct osdv1_cap_object_descriptor od; -} __packed; - -struct osd_capability { - struct osd_capability_head h; - struct osd_cap_object_descriptor od; -} __packed; - -/** - * osd_sec_set_caps - set cap-bits into the capabilities header - * - * @cap: The osd_capability_head to set cap bits to. - * @bit_mask: Use an ORed list of enum osd_capability_bit_masks values - * - * permissions_bit_mask is unaligned use below to set into caps - * in a version independent way - */ -static inline void osd_sec_set_caps(struct osd_capability_head *cap, - u16 bit_mask) -{ - /* - *Note: The bits above are defined LE order this is because this way - * they can grow in the future to more then 16, and still retain - * there constant values. - */ - put_unaligned_le16(bit_mask, &cap->permissions_bit_mask); -} - -/* osd2r05a sec 5.3: CDB continuation segment formats */ -enum osd_continuation_segment_format { - CDB_CONTINUATION_FORMAT_V2 = 0x01, -}; - -struct osd_continuation_segment_header { - u8 format; - u8 reserved1; - __be16 service_action; - __be32 reserved2; - u8 integrity_check[OSDv2_CRYPTO_KEYID_SIZE]; -} __packed; - -/* osd2r05a sec 5.4.1: CDB continuation descriptors */ -enum osd_continuation_descriptor_type { - NO_MORE_DESCRIPTORS = 0x0000, - SCATTER_GATHER_LIST = 0x0001, - QUERY_LIST = 0x0002, - USER_OBJECT = 0x0003, - COPY_USER_OBJECT_SOURCE = 0x0101, - EXTENSION_CAPABILITIES = 0xFFEE -}; - -struct osd_continuation_descriptor_header { - __be16 type; - u8 reserved; - u8 pad_length; - __be32 length; -} __packed; - - -/* osd2r05a sec 5.4.2: Scatter/gather list */ -struct osd_sg_list_entry { - __be64 offset; - __be64 len; -}; - -struct osd_sg_continuation_descriptor { - struct osd_continuation_descriptor_header hdr; - struct osd_sg_list_entry entries[]; -}; - -#endif /* ndef __OSD_PROTOCOL_H__ */ diff --git a/include/scsi/osd_sec.h b/include/scsi/osd_sec.h deleted file mode 100644 index 7abeb0f0db30..000000000000 --- a/include/scsi/osd_sec.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * osd_sec.h - OSD security manager API - * - * Copyright (C) 2008 Panasas Inc. All rights reserved. - * - * Authors: - * Boaz Harrosh <ooo@electrozaur.com> - * Benny Halevy <bhalevy@panasas.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * - */ -#ifndef __OSD_SEC_H__ -#define __OSD_SEC_H__ - -#include <scsi/osd_protocol.h> -#include <scsi/osd_types.h> - -/* - * Contains types and constants of osd capabilities and security - * encoding/decoding. - * API is trying to keep security abstract so initiator of an object - * based pNFS client knows as little as possible about security and - * capabilities. It is the Server's osd-initiator place to know more. - * Also can be used by osd-target. - */ -void osd_sec_encode_caps(void *caps, ...);/* NI */ -void osd_sec_init_nosec_doall_caps(void *caps, - const struct osd_obj_id *obj, bool is_collection, const bool is_v1); - -bool osd_is_sec_alldata(struct osd_security_parameters *sec_params); - -/* Conditionally sign the CDB according to security setting in ocdb - * with cap_key */ -void osd_sec_sign_cdb(struct osd_cdb *ocdb, const u8 *cap_key); - -/* Unconditionally sign the BIO data with cap_key. - * Check for osd_is_sec_alldata() was done prior to calling this. */ -void osd_sec_sign_data(void *data_integ, struct bio *bio, const u8 *cap_key); - -/* Version independent copy of caps into the cdb */ -void osd_set_caps(struct osd_cdb *cdb, const void *caps); - -#endif /* ndef __OSD_SEC_H__ */ diff --git a/include/scsi/osd_sense.h b/include/scsi/osd_sense.h deleted file mode 100644 index d52aa93a0b2d..000000000000 --- a/include/scsi/osd_sense.h +++ /dev/null @@ -1,263 +0,0 @@ -/* - * osd_sense.h - OSD Related sense handling definitions. - * - * Copyright (C) 2008 Panasas Inc. All rights reserved. - * - * Authors: - * Boaz Harrosh <ooo@electrozaur.com> - * Benny Halevy <bhalevy@panasas.com> - * - * 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 <scsi/osd_protocol.h> - -/* 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__ */ diff --git a/include/scsi/osd_types.h b/include/scsi/osd_types.h deleted file mode 100644 index 48e8a165e136..000000000000 --- a/include/scsi/osd_types.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * osd_types.h - Types and constants which are not part of the protocol. - * - * Copyright (C) 2008 Panasas Inc. All rights reserved. - * - * Authors: - * Boaz Harrosh <ooo@electrozaur.com> - * Benny Halevy <bhalevy@panasas.com> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 - * - * Contains types and constants that are implementation specific and are - * used by more than one part of the osd library. - * (Eg initiator/target/security_manager/...) - */ -#ifndef __OSD_TYPES_H__ -#define __OSD_TYPES_H__ - -struct osd_systemid { - u8 data[OSD_SYSTEMID_LEN]; -}; - -typedef u64 __bitwise osd_id; - -struct osd_obj_id { - osd_id partition; - osd_id id; -}; - -static const struct __weak osd_obj_id osd_root_object = {0, 0}; - -struct osd_attr { - u32 attr_page; - u32 attr_id; - u16 len; /* byte count of operand */ - void *val_ptr; /* in network order */ -}; - -struct osd_sg_entry { - u64 offset; - u64 len; -}; - -#endif /* ndef __OSD_TYPES_H__ */ diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h index 2b539a1b3f62..a5fcdad4a03e 100644 --- a/include/scsi/scsi_host.h +++ b/include/scsi/scsi_host.h @@ -628,6 +628,9 @@ struct Scsi_Host { /* Host responded with short (<36 bytes) INQUIRY result */ unsigned short_inquiry:1; + /* The transport requires the LUN bits NOT to be stored in CDB[1] */ + unsigned no_scsi2_lun_in_cdb:1; + /* * Optional work queue to be utilized by the transport */ @@ -639,9 +642,6 @@ struct Scsi_Host { */ struct workqueue_struct *tmf_work_q; - /* The transport requires the LUN bits NOT to be stored in CDB[1] */ - unsigned no_scsi2_lun_in_cdb:1; - /* * Value host_blocked counts down from */ diff --git a/include/scsi/scsi_transport_fc.h b/include/scsi/scsi_transport_fc.h index 15da45dc2a5d..b375c3303fe2 100644 --- a/include/scsi/scsi_transport_fc.h +++ b/include/scsi/scsi_transport_fc.h @@ -165,6 +165,9 @@ enum fc_tgtid_binding_type { #define FC_PORT_ROLE_FCP_INITIATOR 0x02 #define FC_PORT_ROLE_IP_PORT 0x04 #define FC_PORT_ROLE_FCP_DUMMY_INITIATOR 0x08 +#define FC_PORT_ROLE_NVME_INITIATOR 0x10 +#define FC_PORT_ROLE_NVME_TARGET 0x20 +#define FC_PORT_ROLE_NVME_DISCOVERY 0x40 /* The following are for compatibility */ #define FC_RPORT_ROLE_UNKNOWN FC_PORT_ROLE_UNKNOWN @@ -473,6 +476,7 @@ enum fc_host_event_code { FCH_EVT_PORT_ONLINE = 0x202, FCH_EVT_PORT_FABRIC = 0x204, FCH_EVT_LINK_UNKNOWN = 0x500, + FCH_EVT_LINK_FPIN = 0x501, FCH_EVT_VENDOR_UNIQUE = 0xffff, }; @@ -755,7 +759,7 @@ fc_remote_port_chkready(struct fc_rport *rport) return result; } -static inline u64 wwn_to_u64(u8 *wwn) +static inline u64 wwn_to_u64(const u8 *wwn) { return get_unaligned_be64(wwn); } @@ -798,11 +802,17 @@ u32 fc_get_event_number(void); void fc_host_post_event(struct Scsi_Host *shost, u32 event_number, enum fc_host_event_code event_code, u32 event_data); void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number, - u32 data_len, char * data_buf, u64 vendor_id); + u32 data_len, char *data_buf, u64 vendor_id); +void fc_host_post_fc_event(struct Scsi_Host *shost, u32 event_number, + enum fc_host_event_code event_code, + u32 data_len, char *data_buf, u64 vendor_id); /* Note: when specifying vendor_id to fc_host_post_vendor_event() - * be sure to read the Vendor Type and ID formatting requirements - * specified in scsi_netlink.h + * or fc_host_post_fc_event(), be sure to read the Vendor Type + * and ID formatting requirements specified in scsi_netlink.h + * Note: when calling fc_host_post_fc_event(), vendor_id may be + * specified as 0. */ +void fc_host_fpin_rcv(struct Scsi_Host *shost, u32 fpin_len, char *fpin_buf); struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel, struct fc_vport_identifiers *); int fc_vport_terminate(struct fc_vport *vport); diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h index 24c398f4a68f..a49d37140a64 100644 --- a/include/target/iscsi/iscsi_target_core.h +++ b/include/target/iscsi/iscsi_target_core.h @@ -473,6 +473,7 @@ struct iscsi_cmd { struct timer_list dataout_timer; /* Iovecs for SCSI data payload RX/TX w/ kernel level sockets */ struct kvec *iov_data; + void *overflow_buf; /* Iovecs for miscellaneous purposes */ #define ISCSI_MISC_IOVECS 5 struct kvec iov_misc[ISCSI_MISC_IOVECS]; diff --git a/include/target/target_core_base.h b/include/target/target_core_base.h index 19a5bf4214fc..7c9716fe731e 100644 --- a/include/target/target_core_base.h +++ b/include/target/target_core_base.h @@ -795,8 +795,8 @@ struct se_device { spinlock_t se_tmr_lock; spinlock_t qf_cmd_lock; struct semaphore caw_sem; - /* Used for legacy SPC-2 reservationsa */ - struct se_node_acl *dev_reserved_node_acl; + /* Used for legacy SPC-2 reservations */ + struct se_session *reservation_holder; /* Used for ALUA Logical Unit Group membership */ struct t10_alua_lu_gp_member *dev_alua_lu_gp_mem; /* Used for SPC-3 Persistent Reservations */ diff --git a/include/target/target_core_fabric.h b/include/target/target_core_fabric.h index 8ed90407f062..063f133e47c2 100644 --- a/include/target/target_core_fabric.h +++ b/include/target/target_core_fabric.h @@ -142,6 +142,7 @@ void transport_register_session(struct se_portal_group *, struct se_node_acl *, struct se_session *, void *); ssize_t target_show_dynamic_sessions(struct se_portal_group *, char *); void transport_free_session(struct se_session *); +void target_spc2_release(struct se_node_acl *nacl); void target_put_nacl(struct se_node_acl *); void transport_deregister_session_configfs(struct se_session *); void transport_deregister_session(struct se_session *); diff --git a/include/uapi/scsi/fc/fc_els.h b/include/uapi/scsi/fc/fc_els.h index b7e0a5ed40de..a81c53508cc6 100644 --- a/include/uapi/scsi/fc/fc_els.h +++ b/include/uapi/scsi/fc/fc_els.h @@ -52,6 +52,7 @@ enum fc_els_cmd { ELS_RRQ = 0x12, /* reinstate recovery qualifier */ ELS_REC = 0x13, /* read exchange concise */ ELS_SRR = 0x14, /* sequence retransmission request */ + ELS_FPIN = 0x16, /* Fabric Performance Impact Notification */ ELS_PRLI = 0x20, /* process login */ ELS_PRLO = 0x21, /* process logout */ ELS_SCN = 0x22, /* state change notification */ @@ -119,6 +120,7 @@ enum fc_els_cmd { [ELS_RRQ] = "RRQ", \ [ELS_REC] = "REC", \ [ELS_SRR] = "SRR", \ + [ELS_FPIN] = "FPIN", \ [ELS_PRLI] = "PRLI", \ [ELS_PRLO] = "PRLO", \ [ELS_SCN] = "SCN", \ @@ -829,4 +831,35 @@ enum fc_els_clid_ic { ELS_CLID_IC_LIP = 8, /* receiving LIP */ }; + +/* + * Fabric Notification Descriptor Tag values + */ +enum fc_fn_dtag { + ELS_FN_DTAG_LNK_INTEGRITY = 0x00020001, /* Link Integrity */ + ELS_FN_DTAG_PEER_CONGEST = 0x00020003, /* Peer Congestion */ + ELS_FN_DTAG_CONGESTION = 0x00020004, /* Congestion */ +}; + +/* + * Fabric Notification Descriptor + */ +struct fc_fn_desc { + __be32 fn_desc_tag; /* Notification Descriptor Tag */ + __be32 fn_desc_value_len; /* Length of Descriptor Value field + * (in bytes) + */ + __u8 fn_desc_value[0]; /* Descriptor Value */ +}; + +/* + * ELS_FPIN - Fabric Performance Impact Notification + */ +struct fc_els_fpin { + __u8 fpin_cmd; /* command (0x16) */ + __u8 fpin_zero[3]; /* specified as zero - part of cmd */ + __be32 fpin_desc_cnt; /* count of descriptors */ + struct fc_fn_desc fpin_desc[0]; /* Descriptor list */ +}; + #endif /* _FC_ELS_H_ */ |