Commit 69088a04 authored by Bodo Stroesser's avatar Bodo Stroesser Committed by Martin K. Petersen

scsi: target: Make transport_flags per device

pgr_support and alua_support device attributes show the inverted value of
the transport_flags:

 * TRANSPORT_FLAG_PASSTHROUGH_PGR
 * TRANSPORT_FLAG_PASSTHROUGH_ALUA

These attributes are per device, while the flags are per backend. Rename
the transport_flags in backend/transport to transport_flags_default and use
this value to initialize the new transport_flags field in the se_device
structure.

Now data and attribute both are per se_device.

Link: https://lore.kernel.org/r/20200427150823.15350-4-bstroesser@ts.fujitsu.comReviewed-by: default avatarMike Christie <mchristi@redhat.com>
Signed-off-by: default avatarBodo Stroesser <bstroesser@ts.fujitsu.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4703b625
...@@ -677,7 +677,7 @@ target_alua_state_check(struct se_cmd *cmd) ...@@ -677,7 +677,7 @@ target_alua_state_check(struct se_cmd *cmd)
if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE) if (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)
return 0; return 0;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA)
return 0; return 0;
/* /*
...@@ -1090,7 +1090,7 @@ int core_alua_do_port_transition( ...@@ -1090,7 +1090,7 @@ int core_alua_do_port_transition(
struct t10_alua_tg_pt_gp *tg_pt_gp; struct t10_alua_tg_pt_gp *tg_pt_gp;
int primary, valid_states, rc = 0; int primary, valid_states, rc = 0;
if (l_dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) if (l_dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA)
return -ENODEV; return -ENODEV;
valid_states = l_tg_pt_gp->tg_pt_gp_alua_supported_states; valid_states = l_tg_pt_gp->tg_pt_gp_alua_supported_states;
...@@ -1920,7 +1920,7 @@ ssize_t core_alua_store_tg_pt_gp_info( ...@@ -1920,7 +1920,7 @@ ssize_t core_alua_store_tg_pt_gp_info(
unsigned char buf[TG_PT_GROUP_NAME_BUF]; unsigned char buf[TG_PT_GROUP_NAME_BUF];
int move = 0; int move = 0;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA ||
(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE))
return -ENODEV; return -ENODEV;
...@@ -2177,7 +2177,7 @@ ssize_t core_alua_store_offline_bit( ...@@ -2177,7 +2177,7 @@ ssize_t core_alua_store_offline_bit(
unsigned long tmp; unsigned long tmp;
int ret; int ret;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA || if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA ||
(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) (dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE))
return -ENODEV; return -ENODEV;
...@@ -2263,7 +2263,7 @@ ssize_t core_alua_store_secondary_write_metadata( ...@@ -2263,7 +2263,7 @@ ssize_t core_alua_store_secondary_write_metadata(
int core_setup_alua(struct se_device *dev) int core_setup_alua(struct se_device *dev)
{ {
if (!(dev->transport->transport_flags & if (!(dev->transport_flags &
TRANSPORT_FLAG_PASSTHROUGH_ALUA) && TRANSPORT_FLAG_PASSTHROUGH_ALUA) &&
!(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) { !(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) {
struct t10_alua_lu_gp_member *lu_gp_mem; struct t10_alua_lu_gp_member *lu_gp_mem;
......
...@@ -1099,7 +1099,7 @@ static ssize_t block_size_store(struct config_item *item, ...@@ -1099,7 +1099,7 @@ static ssize_t block_size_store(struct config_item *item,
static ssize_t alua_support_show(struct config_item *item, char *page) static ssize_t alua_support_show(struct config_item *item, char *page)
{ {
struct se_dev_attrib *da = to_attrib(item); struct se_dev_attrib *da = to_attrib(item);
u8 flags = da->da_dev->transport->transport_flags; u8 flags = da->da_dev->transport_flags;
return snprintf(page, PAGE_SIZE, "%d\n", return snprintf(page, PAGE_SIZE, "%d\n",
flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA ? 0 : 1); flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA ? 0 : 1);
...@@ -1108,7 +1108,7 @@ static ssize_t alua_support_show(struct config_item *item, char *page) ...@@ -1108,7 +1108,7 @@ static ssize_t alua_support_show(struct config_item *item, char *page)
static ssize_t pgr_support_show(struct config_item *item, char *page) static ssize_t pgr_support_show(struct config_item *item, char *page)
{ {
struct se_dev_attrib *da = to_attrib(item); struct se_dev_attrib *da = to_attrib(item);
u8 flags = da->da_dev->transport->transport_flags; u8 flags = da->da_dev->transport_flags;
return snprintf(page, PAGE_SIZE, "%d\n", return snprintf(page, PAGE_SIZE, "%d\n",
flags & TRANSPORT_FLAG_PASSTHROUGH_PGR ? 0 : 1); flags & TRANSPORT_FLAG_PASSTHROUGH_PGR ? 0 : 1);
...@@ -1654,7 +1654,7 @@ static ssize_t target_pr_res_holder_show(struct config_item *item, char *page) ...@@ -1654,7 +1654,7 @@ static ssize_t target_pr_res_holder_show(struct config_item *item, char *page)
if (!dev->dev_attrib.emulate_pr) if (!dev->dev_attrib.emulate_pr)
return sprintf(page, "SPC_RESERVATIONS_DISABLED\n"); return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
return sprintf(page, "Passthrough\n"); return sprintf(page, "Passthrough\n");
spin_lock(&dev->dev_reservation_lock); spin_lock(&dev->dev_reservation_lock);
...@@ -1796,7 +1796,7 @@ static ssize_t target_pr_res_type_show(struct config_item *item, char *page) ...@@ -1796,7 +1796,7 @@ static ssize_t target_pr_res_type_show(struct config_item *item, char *page)
if (!dev->dev_attrib.emulate_pr) if (!dev->dev_attrib.emulate_pr)
return sprintf(page, "SPC_RESERVATIONS_DISABLED\n"); return sprintf(page, "SPC_RESERVATIONS_DISABLED\n");
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
return sprintf(page, "SPC_PASSTHROUGH\n"); return sprintf(page, "SPC_PASSTHROUGH\n");
if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
return sprintf(page, "SPC2_RESERVATIONS\n"); return sprintf(page, "SPC2_RESERVATIONS\n");
...@@ -1810,7 +1810,7 @@ static ssize_t target_pr_res_aptpl_active_show(struct config_item *item, ...@@ -1810,7 +1810,7 @@ static ssize_t target_pr_res_aptpl_active_show(struct config_item *item,
struct se_device *dev = pr_to_dev(item); struct se_device *dev = pr_to_dev(item);
if (!dev->dev_attrib.emulate_pr || if (!dev->dev_attrib.emulate_pr ||
(dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)) (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
return 0; return 0;
return sprintf(page, "APTPL Bit Status: %s\n", return sprintf(page, "APTPL Bit Status: %s\n",
...@@ -1823,7 +1823,7 @@ static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item, ...@@ -1823,7 +1823,7 @@ static ssize_t target_pr_res_aptpl_metadata_show(struct config_item *item,
struct se_device *dev = pr_to_dev(item); struct se_device *dev = pr_to_dev(item);
if (!dev->dev_attrib.emulate_pr || if (!dev->dev_attrib.emulate_pr ||
(dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)) (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
return 0; return 0;
return sprintf(page, "Ready to process PR APTPL metadata..\n"); return sprintf(page, "Ready to process PR APTPL metadata..\n");
...@@ -1870,7 +1870,7 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item, ...@@ -1870,7 +1870,7 @@ static ssize_t target_pr_res_aptpl_metadata_store(struct config_item *item,
u8 type = 0; u8 type = 0;
if (!dev->dev_attrib.emulate_pr || if (!dev->dev_attrib.emulate_pr ||
(dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)) (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR))
return count; return count;
if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS) if (dev->dev_reservation_flags & DRF_SPC2_RESERVATIONS)
return count; return count;
......
...@@ -732,6 +732,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name) ...@@ -732,6 +732,7 @@ struct se_device *target_alloc_device(struct se_hba *hba, const char *name)
dev->se_hba = hba; dev->se_hba = hba;
dev->transport = hba->backend->ops; dev->transport = hba->backend->ops;
dev->transport_flags = dev->transport->transport_flags_default;
dev->prot_length = sizeof(struct t10_pi_tuple); dev->prot_length = sizeof(struct t10_pi_tuple);
dev->hba_index = hba->hba_index; dev->hba_index = hba->hba_index;
...@@ -1100,7 +1101,7 @@ passthrough_parse_cdb(struct se_cmd *cmd, ...@@ -1100,7 +1101,7 @@ passthrough_parse_cdb(struct se_cmd *cmd,
* emulate the response, since tcmu does not have the information * emulate the response, since tcmu does not have the information
* required to process these commands. * required to process these commands.
*/ */
if (!(dev->transport->transport_flags & if (!(dev->transport_flags &
TRANSPORT_FLAG_PASSTHROUGH_PGR)) { TRANSPORT_FLAG_PASSTHROUGH_PGR)) {
if (cdb[0] == PERSISTENT_RESERVE_IN) { if (cdb[0] == PERSISTENT_RESERVE_IN) {
cmd->execute_cmd = target_scsi3_emulate_pr_in; cmd->execute_cmd = target_scsi3_emulate_pr_in;
......
...@@ -4086,7 +4086,7 @@ target_check_reservation(struct se_cmd *cmd) ...@@ -4086,7 +4086,7 @@ target_check_reservation(struct se_cmd *cmd)
return 0; return 0;
if (!dev->dev_attrib.emulate_pr) if (!dev->dev_attrib.emulate_pr)
return 0; return 0;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_PGR)
return 0; return 0;
spin_lock(&dev->dev_reservation_lock); spin_lock(&dev->dev_reservation_lock);
......
...@@ -1070,9 +1070,9 @@ static void pscsi_req_done(struct request *req, blk_status_t status) ...@@ -1070,9 +1070,9 @@ static void pscsi_req_done(struct request *req, blk_status_t status)
static const struct target_backend_ops pscsi_ops = { static const struct target_backend_ops pscsi_ops = {
.name = "pscsi", .name = "pscsi",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.transport_flags = TRANSPORT_FLAG_PASSTHROUGH | .transport_flags_default = TRANSPORT_FLAG_PASSTHROUGH |
TRANSPORT_FLAG_PASSTHROUGH_ALUA | TRANSPORT_FLAG_PASSTHROUGH_ALUA |
TRANSPORT_FLAG_PASSTHROUGH_PGR, TRANSPORT_FLAG_PASSTHROUGH_PGR,
.attach_hba = pscsi_attach_hba, .attach_hba = pscsi_attach_hba,
.detach_hba = pscsi_detach_hba, .detach_hba = pscsi_detach_hba,
.pmode_enable_hba = pscsi_pmode_enable_hba, .pmode_enable_hba = pscsi_pmode_enable_hba,
......
...@@ -582,8 +582,7 @@ int core_tpg_add_lun( ...@@ -582,8 +582,7 @@ int core_tpg_add_lun(
if (ret) if (ret)
goto out_kill_ref; goto out_kill_ref;
if (!(dev->transport->transport_flags & if (!(dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH_ALUA) &&
TRANSPORT_FLAG_PASSTHROUGH_ALUA) &&
!(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE)) !(dev->se_hba->hba_flags & HBA_FLAGS_INTERNAL_USE))
target_attach_tg_pt_gp(lun, dev->t10_alua.default_tg_pt_gp); target_attach_tg_pt_gp(lun, dev->t10_alua.default_tg_pt_gp);
......
...@@ -1397,7 +1397,7 @@ transport_check_alloc_task_attr(struct se_cmd *cmd) ...@@ -1397,7 +1397,7 @@ transport_check_alloc_task_attr(struct se_cmd *cmd)
* Check if SAM Task Attribute emulation is enabled for this * Check if SAM Task Attribute emulation is enabled for this
* struct se_device storage object * struct se_device storage object
*/ */
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
return 0; return 0;
if (cmd->sam_task_attr == TCM_ACA_TAG) { if (cmd->sam_task_attr == TCM_ACA_TAG) {
...@@ -2012,7 +2012,7 @@ static bool target_handle_task_attr(struct se_cmd *cmd) ...@@ -2012,7 +2012,7 @@ static bool target_handle_task_attr(struct se_cmd *cmd)
{ {
struct se_device *dev = cmd->se_dev; struct se_device *dev = cmd->se_dev;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
return false; return false;
cmd->se_cmd_flags |= SCF_TASK_ATTR_SET; cmd->se_cmd_flags |= SCF_TASK_ATTR_SET;
...@@ -2126,7 +2126,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd) ...@@ -2126,7 +2126,7 @@ static void transport_complete_task_attr(struct se_cmd *cmd)
{ {
struct se_device *dev = cmd->se_dev; struct se_device *dev = cmd->se_dev;
if (dev->transport->transport_flags & TRANSPORT_FLAG_PASSTHROUGH) if (dev->transport_flags & TRANSPORT_FLAG_PASSTHROUGH)
return; return;
if (!(cmd->se_cmd_flags & SCF_TASK_ATTR_SET)) if (!(cmd->se_cmd_flags & SCF_TASK_ATTR_SET))
......
...@@ -2616,7 +2616,7 @@ static struct configfs_attribute *tcmu_action_attrs[] = { ...@@ -2616,7 +2616,7 @@ static struct configfs_attribute *tcmu_action_attrs[] = {
static struct target_backend_ops tcmu_ops = { static struct target_backend_ops tcmu_ops = {
.name = "user", .name = "user",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.transport_flags = TRANSPORT_FLAG_PASSTHROUGH, .transport_flags_default = TRANSPORT_FLAG_PASSTHROUGH,
.attach_hba = tcmu_attach_hba, .attach_hba = tcmu_attach_hba,
.detach_hba = tcmu_detach_hba, .detach_hba = tcmu_detach_hba,
.alloc_device = tcmu_alloc_device, .alloc_device = tcmu_alloc_device,
......
...@@ -23,7 +23,7 @@ struct target_backend_ops { ...@@ -23,7 +23,7 @@ struct target_backend_ops {
char inquiry_rev[4]; char inquiry_rev[4];
struct module *owner; struct module *owner;
u8 transport_flags; u8 transport_flags_default;
int (*attach_hba)(struct se_hba *, u32); int (*attach_hba)(struct se_hba *, u32);
void (*detach_hba)(struct se_hba *); void (*detach_hba)(struct se_hba *);
......
...@@ -772,6 +772,7 @@ struct se_device { ...@@ -772,6 +772,7 @@ struct se_device {
#define DF_USING_UDEV_PATH 0x00000008 #define DF_USING_UDEV_PATH 0x00000008
#define DF_USING_ALIAS 0x00000010 #define DF_USING_ALIAS 0x00000010
#define DF_READ_ONLY 0x00000020 #define DF_READ_ONLY 0x00000020
u8 transport_flags;
/* Physical device queue depth */ /* Physical device queue depth */
u32 queue_depth; u32 queue_depth;
/* Used for SPC-2 reservations enforce of ISIDs */ /* Used for SPC-2 reservations enforce of ISIDs */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment