diff options
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 4 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_core.h | 1 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_login.c | 1 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_util.c | 22 | ||||
| -rw-r--r-- | drivers/target/iscsi/iscsi_target_util.h | 1 | ||||
| -rw-r--r-- | drivers/target/target_core_configfs.c | 3 | ||||
| -rw-r--r-- | drivers/target/target_core_device.c | 18 | ||||
| -rw-r--r-- | drivers/target/target_core_spc.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_tmr.c | 6 |
9 files changed, 42 insertions, 16 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index d6ce2182e672..035c2c762537 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -3719,7 +3719,9 @@ restart: | |||
| 3719 | */ | 3719 | */ |
| 3720 | iscsit_thread_check_cpumask(conn, current, 1); | 3720 | iscsit_thread_check_cpumask(conn, current, 1); |
| 3721 | 3721 | ||
| 3722 | schedule_timeout_interruptible(MAX_SCHEDULE_TIMEOUT); | 3722 | wait_event_interruptible(conn->queues_wq, |
| 3723 | !iscsit_conn_all_queues_empty(conn) || | ||
| 3724 | ts->status == ISCSI_THREAD_SET_RESET); | ||
| 3723 | 3725 | ||
| 3724 | if ((ts->status == ISCSI_THREAD_SET_RESET) || | 3726 | if ((ts->status == ISCSI_THREAD_SET_RESET) || |
| 3725 | signal_pending(current)) | 3727 | signal_pending(current)) |
diff --git a/drivers/target/iscsi/iscsi_target_core.h b/drivers/target/iscsi/iscsi_target_core.h index 2ba9f9b9435c..21048dbf7d13 100644 --- a/drivers/target/iscsi/iscsi_target_core.h +++ b/drivers/target/iscsi/iscsi_target_core.h | |||
| @@ -486,6 +486,7 @@ struct iscsi_tmr_req { | |||
| 486 | }; | 486 | }; |
| 487 | 487 | ||
| 488 | struct iscsi_conn { | 488 | struct iscsi_conn { |
| 489 | wait_queue_head_t queues_wq; | ||
| 489 | /* Authentication Successful for this connection */ | 490 | /* Authentication Successful for this connection */ |
| 490 | u8 auth_complete; | 491 | u8 auth_complete; |
| 491 | /* State connection is currently in */ | 492 | /* State connection is currently in */ |
diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c index cdc8a10939c3..f8dbec05d5e5 100644 --- a/drivers/target/iscsi/iscsi_target_login.c +++ b/drivers/target/iscsi/iscsi_target_login.c | |||
| @@ -41,6 +41,7 @@ | |||
| 41 | 41 | ||
| 42 | static int iscsi_login_init_conn(struct iscsi_conn *conn) | 42 | static int iscsi_login_init_conn(struct iscsi_conn *conn) |
| 43 | { | 43 | { |
| 44 | init_waitqueue_head(&conn->queues_wq); | ||
| 44 | INIT_LIST_HEAD(&conn->conn_list); | 45 | INIT_LIST_HEAD(&conn->conn_list); |
| 45 | INIT_LIST_HEAD(&conn->conn_cmd_list); | 46 | INIT_LIST_HEAD(&conn->conn_cmd_list); |
| 46 | INIT_LIST_HEAD(&conn->immed_queue_list); | 47 | INIT_LIST_HEAD(&conn->immed_queue_list); |
diff --git a/drivers/target/iscsi/iscsi_target_util.c b/drivers/target/iscsi/iscsi_target_util.c index afd98ccd40ae..1a91195ab619 100644 --- a/drivers/target/iscsi/iscsi_target_util.c +++ b/drivers/target/iscsi/iscsi_target_util.c | |||
| @@ -488,7 +488,7 @@ void iscsit_add_cmd_to_immediate_queue( | |||
| 488 | atomic_set(&conn->check_immediate_queue, 1); | 488 | atomic_set(&conn->check_immediate_queue, 1); |
| 489 | spin_unlock_bh(&conn->immed_queue_lock); | 489 | spin_unlock_bh(&conn->immed_queue_lock); |
| 490 | 490 | ||
| 491 | wake_up_process(conn->thread_set->tx_thread); | 491 | wake_up(&conn->queues_wq); |
| 492 | } | 492 | } |
| 493 | 493 | ||
| 494 | struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsi_conn *conn) | 494 | struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsi_conn *conn) |
| @@ -562,7 +562,7 @@ void iscsit_add_cmd_to_response_queue( | |||
| 562 | atomic_inc(&cmd->response_queue_count); | 562 | atomic_inc(&cmd->response_queue_count); |
| 563 | spin_unlock_bh(&conn->response_queue_lock); | 563 | spin_unlock_bh(&conn->response_queue_lock); |
| 564 | 564 | ||
| 565 | wake_up_process(conn->thread_set->tx_thread); | 565 | wake_up(&conn->queues_wq); |
| 566 | } | 566 | } |
| 567 | 567 | ||
| 568 | struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *conn) | 568 | struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *conn) |
| @@ -616,6 +616,24 @@ static void iscsit_remove_cmd_from_response_queue( | |||
| 616 | } | 616 | } |
| 617 | } | 617 | } |
| 618 | 618 | ||
| 619 | bool iscsit_conn_all_queues_empty(struct iscsi_conn *conn) | ||
| 620 | { | ||
| 621 | bool empty; | ||
| 622 | |||
| 623 | spin_lock_bh(&conn->immed_queue_lock); | ||
| 624 | empty = list_empty(&conn->immed_queue_list); | ||
| 625 | spin_unlock_bh(&conn->immed_queue_lock); | ||
| 626 | |||
| 627 | if (!empty) | ||
| 628 | return empty; | ||
| 629 | |||
| 630 | spin_lock_bh(&conn->response_queue_lock); | ||
| 631 | empty = list_empty(&conn->response_queue_list); | ||
| 632 | spin_unlock_bh(&conn->response_queue_lock); | ||
| 633 | |||
| 634 | return empty; | ||
| 635 | } | ||
| 636 | |||
| 619 | void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *conn) | 637 | void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *conn) |
| 620 | { | 638 | { |
| 621 | struct iscsi_queue_req *qr, *qr_tmp; | 639 | struct iscsi_queue_req *qr, *qr_tmp; |
diff --git a/drivers/target/iscsi/iscsi_target_util.h b/drivers/target/iscsi/iscsi_target_util.h index 44054bd35437..894d0f837924 100644 --- a/drivers/target/iscsi/iscsi_target_util.h +++ b/drivers/target/iscsi/iscsi_target_util.h | |||
| @@ -25,6 +25,7 @@ extern struct iscsi_queue_req *iscsit_get_cmd_from_immediate_queue(struct iscsi_ | |||
| 25 | extern void iscsit_add_cmd_to_response_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); | 25 | extern void iscsit_add_cmd_to_response_queue(struct iscsi_cmd *, struct iscsi_conn *, u8); |
| 26 | extern struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *); | 26 | extern struct iscsi_queue_req *iscsit_get_cmd_from_response_queue(struct iscsi_conn *); |
| 27 | extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_conn *); | 27 | extern void iscsit_remove_cmd_from_tx_queues(struct iscsi_cmd *, struct iscsi_conn *); |
| 28 | extern bool iscsit_conn_all_queues_empty(struct iscsi_conn *); | ||
| 28 | extern void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *); | 29 | extern void iscsit_free_queue_reqs_for_conn(struct iscsi_conn *); |
| 29 | extern void iscsit_release_cmd(struct iscsi_cmd *); | 30 | extern void iscsit_release_cmd(struct iscsi_cmd *); |
| 30 | extern void iscsit_free_cmd(struct iscsi_cmd *); | 31 | extern void iscsit_free_cmd(struct iscsi_cmd *); |
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c index 015f5be27bf6..c123327499a3 100644 --- a/drivers/target/target_core_configfs.c +++ b/drivers/target/target_core_configfs.c | |||
| @@ -3206,7 +3206,8 @@ static int __init target_core_init_configfs(void) | |||
| 3206 | if (ret < 0) | 3206 | if (ret < 0) |
| 3207 | goto out; | 3207 | goto out; |
| 3208 | 3208 | ||
| 3209 | if (core_dev_setup_virtual_lun0() < 0) | 3209 | ret = core_dev_setup_virtual_lun0(); |
| 3210 | if (ret < 0) | ||
| 3210 | goto out; | 3211 | goto out; |
| 3211 | 3212 | ||
| 3212 | return 0; | 3213 | return 0; |
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index 8d774da16320..9abef9f8eb76 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -850,20 +850,20 @@ int se_dev_check_shutdown(struct se_device *dev) | |||
| 850 | 850 | ||
| 851 | static u32 se_dev_align_max_sectors(u32 max_sectors, u32 block_size) | 851 | static u32 se_dev_align_max_sectors(u32 max_sectors, u32 block_size) |
| 852 | { | 852 | { |
| 853 | u32 tmp, aligned_max_sectors; | 853 | u32 aligned_max_sectors; |
| 854 | u32 alignment; | ||
| 854 | /* | 855 | /* |
| 855 | * Limit max_sectors to a PAGE_SIZE aligned value for modern | 856 | * Limit max_sectors to a PAGE_SIZE aligned value for modern |
| 856 | * transport_allocate_data_tasks() operation. | 857 | * transport_allocate_data_tasks() operation. |
| 857 | */ | 858 | */ |
| 858 | tmp = rounddown((max_sectors * block_size), PAGE_SIZE); | 859 | alignment = max(1ul, PAGE_SIZE / block_size); |
| 859 | aligned_max_sectors = (tmp / block_size); | 860 | aligned_max_sectors = rounddown(max_sectors, alignment); |
| 860 | if (max_sectors != aligned_max_sectors) { | 861 | |
| 861 | printk(KERN_INFO "Rounding down aligned max_sectors from %u" | 862 | if (max_sectors != aligned_max_sectors) |
| 862 | " to %u\n", max_sectors, aligned_max_sectors); | 863 | pr_info("Rounding down aligned max_sectors from %u to %u\n", |
| 863 | return aligned_max_sectors; | 864 | max_sectors, aligned_max_sectors); |
| 864 | } | ||
| 865 | 865 | ||
| 866 | return max_sectors; | 866 | return aligned_max_sectors; |
| 867 | } | 867 | } |
| 868 | 868 | ||
| 869 | void se_dev_set_default_attribs( | 869 | void se_dev_set_default_attribs( |
diff --git a/drivers/target/target_core_spc.c b/drivers/target/target_core_spc.c index 9229bd9ad61b..6fd434d3d7e4 100644 --- a/drivers/target/target_core_spc.c +++ b/drivers/target/target_core_spc.c | |||
| @@ -605,6 +605,8 @@ static int spc_emulate_inquiry(struct se_cmd *cmd) | |||
| 605 | unsigned char buf[SE_INQUIRY_BUF]; | 605 | unsigned char buf[SE_INQUIRY_BUF]; |
| 606 | int p, ret; | 606 | int p, ret; |
| 607 | 607 | ||
| 608 | memset(buf, 0, SE_INQUIRY_BUF); | ||
| 609 | |||
| 608 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) | 610 | if (dev == tpg->tpg_virt_lun0.lun_se_dev) |
| 609 | buf[0] = 0x3f; /* Not connected */ | 611 | buf[0] = 0x3f; /* Not connected */ |
| 610 | else | 612 | else |
diff --git a/drivers/target/target_core_tmr.c b/drivers/target/target_core_tmr.c index 1c59a3c23b2c..be75c4331a92 100644 --- a/drivers/target/target_core_tmr.c +++ b/drivers/target/target_core_tmr.c | |||
| @@ -140,15 +140,15 @@ void core_tmr_abort_task( | |||
| 140 | printk("ABORT_TASK: Found referenced %s task_tag: %u\n", | 140 | printk("ABORT_TASK: Found referenced %s task_tag: %u\n", |
| 141 | se_cmd->se_tfo->get_fabric_name(), ref_tag); | 141 | se_cmd->se_tfo->get_fabric_name(), ref_tag); |
| 142 | 142 | ||
| 143 | spin_lock_irq(&se_cmd->t_state_lock); | 143 | spin_lock(&se_cmd->t_state_lock); |
| 144 | if (se_cmd->transport_state & CMD_T_COMPLETE) { | 144 | if (se_cmd->transport_state & CMD_T_COMPLETE) { |
| 145 | printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag); | 145 | printk("ABORT_TASK: ref_tag: %u already complete, skipping\n", ref_tag); |
| 146 | spin_unlock_irq(&se_cmd->t_state_lock); | 146 | spin_unlock(&se_cmd->t_state_lock); |
| 147 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); | 147 | spin_unlock_irqrestore(&se_sess->sess_cmd_lock, flags); |
| 148 | goto out; | 148 | goto out; |
| 149 | } | 149 | } |
| 150 | se_cmd->transport_state |= CMD_T_ABORTED; | 150 | se_cmd->transport_state |= CMD_T_ABORTED; |
| 151 | spin_unlock_irq(&se_cmd->t_state_lock); | 151 | spin_unlock(&se_cmd->t_state_lock); |
| 152 | 152 | ||
| 153 | list_del_init(&se_cmd->se_cmd_list); | 153 | list_del_init(&se_cmd->se_cmd_list); |
| 154 | kref_get(&se_cmd->cmd_kref); | 154 | kref_get(&se_cmd->cmd_kref); |
