diff options
Diffstat (limited to 'drivers/target')
| -rw-r--r-- | drivers/target/iscsi/iscsi_target.c | 2 | ||||
| -rw-r--r-- | drivers/target/target_core_configfs.c | 8 | ||||
| -rw-r--r-- | drivers/target/target_core_user.c | 89 |
3 files changed, 70 insertions, 29 deletions
diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c index 984941e036c8..bd15a564fe24 100644 --- a/drivers/target/iscsi/iscsi_target.c +++ b/drivers/target/iscsi/iscsi_target.c | |||
| @@ -714,7 +714,7 @@ static int __init iscsi_target_init_module(void) | |||
| 714 | sizeof(struct iscsi_queue_req), | 714 | sizeof(struct iscsi_queue_req), |
| 715 | __alignof__(struct iscsi_queue_req), 0, NULL); | 715 | __alignof__(struct iscsi_queue_req), 0, NULL); |
| 716 | if (!lio_qr_cache) { | 716 | if (!lio_qr_cache) { |
| 717 | pr_err("nable to kmem_cache_create() for" | 717 | pr_err("Unable to kmem_cache_create() for" |
| 718 | " lio_qr_cache\n"); | 718 | " lio_qr_cache\n"); |
| 719 | goto bitmap_out; | 719 | goto bitmap_out; |
| 720 | } | 720 | } |
diff --git a/drivers/target/target_core_configfs.c b/drivers/target/target_core_configfs.c index 72016d0dfca5..8e7fffbb8802 100644 --- a/drivers/target/target_core_configfs.c +++ b/drivers/target/target_core_configfs.c | |||
| @@ -852,6 +852,12 @@ static ssize_t pi_prot_type_store(struct config_item *item, | |||
| 852 | return count; | 852 | return count; |
| 853 | } | 853 | } |
| 854 | 854 | ||
| 855 | /* always zero, but attr needs to remain RW to avoid userspace breakage */ | ||
| 856 | static ssize_t pi_prot_format_show(struct config_item *item, char *page) | ||
| 857 | { | ||
| 858 | return snprintf(page, PAGE_SIZE, "0\n"); | ||
| 859 | } | ||
| 860 | |||
| 855 | static ssize_t pi_prot_format_store(struct config_item *item, | 861 | static ssize_t pi_prot_format_store(struct config_item *item, |
| 856 | const char *page, size_t count) | 862 | const char *page, size_t count) |
| 857 | { | 863 | { |
| @@ -1132,7 +1138,7 @@ CONFIGFS_ATTR(, emulate_3pc); | |||
| 1132 | CONFIGFS_ATTR(, emulate_pr); | 1138 | CONFIGFS_ATTR(, emulate_pr); |
| 1133 | CONFIGFS_ATTR(, pi_prot_type); | 1139 | CONFIGFS_ATTR(, pi_prot_type); |
| 1134 | CONFIGFS_ATTR_RO(, hw_pi_prot_type); | 1140 | CONFIGFS_ATTR_RO(, hw_pi_prot_type); |
| 1135 | CONFIGFS_ATTR_WO(, pi_prot_format); | 1141 | CONFIGFS_ATTR(, pi_prot_format); |
| 1136 | CONFIGFS_ATTR(, pi_prot_verify); | 1142 | CONFIGFS_ATTR(, pi_prot_verify); |
| 1137 | CONFIGFS_ATTR(, enforce_pr_isids); | 1143 | CONFIGFS_ATTR(, enforce_pr_isids); |
| 1138 | CONFIGFS_ATTR(, is_nonrot); | 1144 | CONFIGFS_ATTR(, is_nonrot); |
diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c index 1e6d24943565..5831e0eecea1 100644 --- a/drivers/target/target_core_user.c +++ b/drivers/target/target_core_user.c | |||
| @@ -148,7 +148,7 @@ struct tcmu_dev { | |||
| 148 | size_t ring_size; | 148 | size_t ring_size; |
| 149 | 149 | ||
| 150 | struct mutex cmdr_lock; | 150 | struct mutex cmdr_lock; |
| 151 | struct list_head cmdr_queue; | 151 | struct list_head qfull_queue; |
| 152 | 152 | ||
| 153 | uint32_t dbi_max; | 153 | uint32_t dbi_max; |
| 154 | uint32_t dbi_thresh; | 154 | uint32_t dbi_thresh; |
| @@ -159,6 +159,7 @@ struct tcmu_dev { | |||
| 159 | 159 | ||
| 160 | struct timer_list cmd_timer; | 160 | struct timer_list cmd_timer; |
| 161 | unsigned int cmd_time_out; | 161 | unsigned int cmd_time_out; |
| 162 | struct list_head inflight_queue; | ||
| 162 | 163 | ||
| 163 | struct timer_list qfull_timer; | 164 | struct timer_list qfull_timer; |
| 164 | int qfull_time_out; | 165 | int qfull_time_out; |
| @@ -179,7 +180,7 @@ struct tcmu_dev { | |||
| 179 | struct tcmu_cmd { | 180 | struct tcmu_cmd { |
| 180 | struct se_cmd *se_cmd; | 181 | struct se_cmd *se_cmd; |
| 181 | struct tcmu_dev *tcmu_dev; | 182 | struct tcmu_dev *tcmu_dev; |
| 182 | struct list_head cmdr_queue_entry; | 183 | struct list_head queue_entry; |
| 183 | 184 | ||
| 184 | uint16_t cmd_id; | 185 | uint16_t cmd_id; |
| 185 | 186 | ||
| @@ -192,6 +193,7 @@ struct tcmu_cmd { | |||
| 192 | unsigned long deadline; | 193 | unsigned long deadline; |
| 193 | 194 | ||
| 194 | #define TCMU_CMD_BIT_EXPIRED 0 | 195 | #define TCMU_CMD_BIT_EXPIRED 0 |
| 196 | #define TCMU_CMD_BIT_INFLIGHT 1 | ||
| 195 | unsigned long flags; | 197 | unsigned long flags; |
| 196 | }; | 198 | }; |
| 197 | /* | 199 | /* |
| @@ -586,7 +588,7 @@ static struct tcmu_cmd *tcmu_alloc_cmd(struct se_cmd *se_cmd) | |||
| 586 | if (!tcmu_cmd) | 588 | if (!tcmu_cmd) |
| 587 | return NULL; | 589 | return NULL; |
| 588 | 590 | ||
| 589 | INIT_LIST_HEAD(&tcmu_cmd->cmdr_queue_entry); | 591 | INIT_LIST_HEAD(&tcmu_cmd->queue_entry); |
| 590 | tcmu_cmd->se_cmd = se_cmd; | 592 | tcmu_cmd->se_cmd = se_cmd; |
| 591 | tcmu_cmd->tcmu_dev = udev; | 593 | tcmu_cmd->tcmu_dev = udev; |
| 592 | 594 | ||
| @@ -915,11 +917,13 @@ setup_timer: | |||
| 915 | return 0; | 917 | return 0; |
| 916 | 918 | ||
| 917 | tcmu_cmd->deadline = round_jiffies_up(jiffies + msecs_to_jiffies(tmo)); | 919 | tcmu_cmd->deadline = round_jiffies_up(jiffies + msecs_to_jiffies(tmo)); |
| 918 | mod_timer(timer, tcmu_cmd->deadline); | 920 | if (!timer_pending(timer)) |
| 921 | mod_timer(timer, tcmu_cmd->deadline); | ||
| 922 | |||
| 919 | return 0; | 923 | return 0; |
| 920 | } | 924 | } |
| 921 | 925 | ||
| 922 | static int add_to_cmdr_queue(struct tcmu_cmd *tcmu_cmd) | 926 | static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) |
| 923 | { | 927 | { |
| 924 | struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; | 928 | struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; |
| 925 | unsigned int tmo; | 929 | unsigned int tmo; |
| @@ -942,7 +946,7 @@ static int add_to_cmdr_queue(struct tcmu_cmd *tcmu_cmd) | |||
| 942 | if (ret) | 946 | if (ret) |
| 943 | return ret; | 947 | return ret; |
| 944 | 948 | ||
| 945 | list_add_tail(&tcmu_cmd->cmdr_queue_entry, &udev->cmdr_queue); | 949 | list_add_tail(&tcmu_cmd->queue_entry, &udev->qfull_queue); |
| 946 | pr_debug("adding cmd %u on dev %s to ring space wait queue\n", | 950 | pr_debug("adding cmd %u on dev %s to ring space wait queue\n", |
| 947 | tcmu_cmd->cmd_id, udev->name); | 951 | tcmu_cmd->cmd_id, udev->name); |
| 948 | return 0; | 952 | return 0; |
| @@ -999,7 +1003,7 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) | |||
| 999 | base_command_size = tcmu_cmd_get_base_cmd_size(tcmu_cmd->dbi_cnt); | 1003 | base_command_size = tcmu_cmd_get_base_cmd_size(tcmu_cmd->dbi_cnt); |
| 1000 | command_size = tcmu_cmd_get_cmd_size(tcmu_cmd, base_command_size); | 1004 | command_size = tcmu_cmd_get_cmd_size(tcmu_cmd, base_command_size); |
| 1001 | 1005 | ||
| 1002 | if (!list_empty(&udev->cmdr_queue)) | 1006 | if (!list_empty(&udev->qfull_queue)) |
| 1003 | goto queue; | 1007 | goto queue; |
| 1004 | 1008 | ||
| 1005 | mb = udev->mb_addr; | 1009 | mb = udev->mb_addr; |
| @@ -1096,13 +1100,16 @@ static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) | |||
| 1096 | UPDATE_HEAD(mb->cmd_head, command_size, udev->cmdr_size); | 1100 | UPDATE_HEAD(mb->cmd_head, command_size, udev->cmdr_size); |
| 1097 | tcmu_flush_dcache_range(mb, sizeof(*mb)); | 1101 | tcmu_flush_dcache_range(mb, sizeof(*mb)); |
| 1098 | 1102 | ||
| 1103 | list_add_tail(&tcmu_cmd->queue_entry, &udev->inflight_queue); | ||
| 1104 | set_bit(TCMU_CMD_BIT_INFLIGHT, &tcmu_cmd->flags); | ||
| 1105 | |||
| 1099 | /* TODO: only if FLUSH and FUA? */ | 1106 | /* TODO: only if FLUSH and FUA? */ |
| 1100 | uio_event_notify(&udev->uio_info); | 1107 | uio_event_notify(&udev->uio_info); |
| 1101 | 1108 | ||
| 1102 | return 0; | 1109 | return 0; |
| 1103 | 1110 | ||
| 1104 | queue: | 1111 | queue: |
| 1105 | if (add_to_cmdr_queue(tcmu_cmd)) { | 1112 | if (add_to_qfull_queue(tcmu_cmd)) { |
| 1106 | *scsi_err = TCM_OUT_OF_RESOURCES; | 1113 | *scsi_err = TCM_OUT_OF_RESOURCES; |
| 1107 | return -1; | 1114 | return -1; |
| 1108 | } | 1115 | } |
| @@ -1145,6 +1152,8 @@ static void tcmu_handle_completion(struct tcmu_cmd *cmd, struct tcmu_cmd_entry * | |||
| 1145 | if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) | 1152 | if (test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) |
| 1146 | goto out; | 1153 | goto out; |
| 1147 | 1154 | ||
| 1155 | list_del_init(&cmd->queue_entry); | ||
| 1156 | |||
| 1148 | tcmu_cmd_reset_dbi_cur(cmd); | 1157 | tcmu_cmd_reset_dbi_cur(cmd); |
| 1149 | 1158 | ||
| 1150 | if (entry->hdr.uflags & TCMU_UFLAG_UNKNOWN_OP) { | 1159 | if (entry->hdr.uflags & TCMU_UFLAG_UNKNOWN_OP) { |
| @@ -1194,9 +1203,29 @@ out: | |||
| 1194 | tcmu_free_cmd(cmd); | 1203 | tcmu_free_cmd(cmd); |
| 1195 | } | 1204 | } |
| 1196 | 1205 | ||
| 1206 | static void tcmu_set_next_deadline(struct list_head *queue, | ||
| 1207 | struct timer_list *timer) | ||
| 1208 | { | ||
| 1209 | struct tcmu_cmd *tcmu_cmd, *tmp_cmd; | ||
| 1210 | unsigned long deadline = 0; | ||
| 1211 | |||
| 1212 | list_for_each_entry_safe(tcmu_cmd, tmp_cmd, queue, queue_entry) { | ||
| 1213 | if (!time_after(jiffies, tcmu_cmd->deadline)) { | ||
| 1214 | deadline = tcmu_cmd->deadline; | ||
| 1215 | break; | ||
| 1216 | } | ||
| 1217 | } | ||
| 1218 | |||
| 1219 | if (deadline) | ||
| 1220 | mod_timer(timer, deadline); | ||
| 1221 | else | ||
| 1222 | del_timer(timer); | ||
| 1223 | } | ||
| 1224 | |||
| 1197 | static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) | 1225 | static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) |
| 1198 | { | 1226 | { |
| 1199 | struct tcmu_mailbox *mb; | 1227 | struct tcmu_mailbox *mb; |
| 1228 | struct tcmu_cmd *cmd; | ||
| 1200 | int handled = 0; | 1229 | int handled = 0; |
| 1201 | 1230 | ||
| 1202 | if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) { | 1231 | if (test_bit(TCMU_DEV_BIT_BROKEN, &udev->flags)) { |
| @@ -1210,7 +1239,6 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) | |||
| 1210 | while (udev->cmdr_last_cleaned != READ_ONCE(mb->cmd_tail)) { | 1239 | while (udev->cmdr_last_cleaned != READ_ONCE(mb->cmd_tail)) { |
| 1211 | 1240 | ||
| 1212 | struct tcmu_cmd_entry *entry = (void *) mb + CMDR_OFF + udev->cmdr_last_cleaned; | 1241 | struct tcmu_cmd_entry *entry = (void *) mb + CMDR_OFF + udev->cmdr_last_cleaned; |
| 1213 | struct tcmu_cmd *cmd; | ||
| 1214 | 1242 | ||
| 1215 | tcmu_flush_dcache_range(entry, sizeof(*entry)); | 1243 | tcmu_flush_dcache_range(entry, sizeof(*entry)); |
| 1216 | 1244 | ||
| @@ -1243,7 +1271,7 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) | |||
| 1243 | /* no more pending commands */ | 1271 | /* no more pending commands */ |
| 1244 | del_timer(&udev->cmd_timer); | 1272 | del_timer(&udev->cmd_timer); |
| 1245 | 1273 | ||
| 1246 | if (list_empty(&udev->cmdr_queue)) { | 1274 | if (list_empty(&udev->qfull_queue)) { |
| 1247 | /* | 1275 | /* |
| 1248 | * no more pending or waiting commands so try to | 1276 | * no more pending or waiting commands so try to |
| 1249 | * reclaim blocks if needed. | 1277 | * reclaim blocks if needed. |
| @@ -1252,6 +1280,8 @@ static unsigned int tcmu_handle_completions(struct tcmu_dev *udev) | |||
| 1252 | tcmu_global_max_blocks) | 1280 | tcmu_global_max_blocks) |
| 1253 | schedule_delayed_work(&tcmu_unmap_work, 0); | 1281 | schedule_delayed_work(&tcmu_unmap_work, 0); |
| 1254 | } | 1282 | } |
| 1283 | } else if (udev->cmd_time_out) { | ||
| 1284 | tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); | ||
| 1255 | } | 1285 | } |
| 1256 | 1286 | ||
| 1257 | return handled; | 1287 | return handled; |
| @@ -1271,7 +1301,7 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data) | |||
| 1271 | if (!time_after(jiffies, cmd->deadline)) | 1301 | if (!time_after(jiffies, cmd->deadline)) |
| 1272 | return 0; | 1302 | return 0; |
| 1273 | 1303 | ||
| 1274 | is_running = list_empty(&cmd->cmdr_queue_entry); | 1304 | is_running = test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags); |
| 1275 | se_cmd = cmd->se_cmd; | 1305 | se_cmd = cmd->se_cmd; |
| 1276 | 1306 | ||
| 1277 | if (is_running) { | 1307 | if (is_running) { |
| @@ -1287,9 +1317,9 @@ static int tcmu_check_expired_cmd(int id, void *p, void *data) | |||
| 1287 | * target_complete_cmd will translate this to LUN COMM FAILURE | 1317 | * target_complete_cmd will translate this to LUN COMM FAILURE |
| 1288 | */ | 1318 | */ |
| 1289 | scsi_status = SAM_STAT_CHECK_CONDITION; | 1319 | scsi_status = SAM_STAT_CHECK_CONDITION; |
| 1320 | list_del_init(&cmd->queue_entry); | ||
| 1290 | } else { | 1321 | } else { |
| 1291 | list_del_init(&cmd->cmdr_queue_entry); | 1322 | list_del_init(&cmd->queue_entry); |
| 1292 | |||
| 1293 | idr_remove(&udev->commands, id); | 1323 | idr_remove(&udev->commands, id); |
| 1294 | tcmu_free_cmd(cmd); | 1324 | tcmu_free_cmd(cmd); |
| 1295 | scsi_status = SAM_STAT_TASK_SET_FULL; | 1325 | scsi_status = SAM_STAT_TASK_SET_FULL; |
| @@ -1372,7 +1402,8 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name) | |||
| 1372 | 1402 | ||
| 1373 | INIT_LIST_HEAD(&udev->node); | 1403 | INIT_LIST_HEAD(&udev->node); |
| 1374 | INIT_LIST_HEAD(&udev->timedout_entry); | 1404 | INIT_LIST_HEAD(&udev->timedout_entry); |
| 1375 | INIT_LIST_HEAD(&udev->cmdr_queue); | 1405 | INIT_LIST_HEAD(&udev->qfull_queue); |
| 1406 | INIT_LIST_HEAD(&udev->inflight_queue); | ||
| 1376 | idr_init(&udev->commands); | 1407 | idr_init(&udev->commands); |
| 1377 | 1408 | ||
| 1378 | timer_setup(&udev->qfull_timer, tcmu_qfull_timedout, 0); | 1409 | timer_setup(&udev->qfull_timer, tcmu_qfull_timedout, 0); |
| @@ -1383,7 +1414,7 @@ static struct se_device *tcmu_alloc_device(struct se_hba *hba, const char *name) | |||
| 1383 | return &udev->se_dev; | 1414 | return &udev->se_dev; |
| 1384 | } | 1415 | } |
| 1385 | 1416 | ||
| 1386 | static bool run_cmdr_queue(struct tcmu_dev *udev, bool fail) | 1417 | static bool run_qfull_queue(struct tcmu_dev *udev, bool fail) |
| 1387 | { | 1418 | { |
| 1388 | struct tcmu_cmd *tcmu_cmd, *tmp_cmd; | 1419 | struct tcmu_cmd *tcmu_cmd, *tmp_cmd; |
| 1389 | LIST_HEAD(cmds); | 1420 | LIST_HEAD(cmds); |
| @@ -1391,15 +1422,15 @@ static bool run_cmdr_queue(struct tcmu_dev *udev, bool fail) | |||
| 1391 | sense_reason_t scsi_ret; | 1422 | sense_reason_t scsi_ret; |
| 1392 | int ret; | 1423 | int ret; |
| 1393 | 1424 | ||
| 1394 | if (list_empty(&udev->cmdr_queue)) | 1425 | if (list_empty(&udev->qfull_queue)) |
| 1395 | return true; | 1426 | return true; |
| 1396 | 1427 | ||
| 1397 | pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail); | 1428 | pr_debug("running %s's cmdr queue forcefail %d\n", udev->name, fail); |
| 1398 | 1429 | ||
| 1399 | list_splice_init(&udev->cmdr_queue, &cmds); | 1430 | list_splice_init(&udev->qfull_queue, &cmds); |
| 1400 | 1431 | ||
| 1401 | list_for_each_entry_safe(tcmu_cmd, tmp_cmd, &cmds, cmdr_queue_entry) { | 1432 | list_for_each_entry_safe(tcmu_cmd, tmp_cmd, &cmds, queue_entry) { |
| 1402 | list_del_init(&tcmu_cmd->cmdr_queue_entry); | 1433 | list_del_init(&tcmu_cmd->queue_entry); |
| 1403 | 1434 | ||
| 1404 | pr_debug("removing cmd %u on dev %s from queue\n", | 1435 | pr_debug("removing cmd %u on dev %s from queue\n", |
| 1405 | tcmu_cmd->cmd_id, udev->name); | 1436 | tcmu_cmd->cmd_id, udev->name); |
| @@ -1437,14 +1468,13 @@ static bool run_cmdr_queue(struct tcmu_dev *udev, bool fail) | |||
| 1437 | * cmd was requeued, so just put all cmds back in | 1468 | * cmd was requeued, so just put all cmds back in |
| 1438 | * the queue | 1469 | * the queue |
| 1439 | */ | 1470 | */ |
| 1440 | list_splice_tail(&cmds, &udev->cmdr_queue); | 1471 | list_splice_tail(&cmds, &udev->qfull_queue); |
| 1441 | drained = false; | 1472 | drained = false; |
| 1442 | goto done; | 1473 | break; |
| 1443 | } | 1474 | } |
| 1444 | } | 1475 | } |
| 1445 | if (list_empty(&udev->cmdr_queue)) | 1476 | |
| 1446 | del_timer(&udev->qfull_timer); | 1477 | tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); |
| 1447 | done: | ||
| 1448 | return drained; | 1478 | return drained; |
| 1449 | } | 1479 | } |
| 1450 | 1480 | ||
| @@ -1454,7 +1484,7 @@ static int tcmu_irqcontrol(struct uio_info *info, s32 irq_on) | |||
| 1454 | 1484 | ||
| 1455 | mutex_lock(&udev->cmdr_lock); | 1485 | mutex_lock(&udev->cmdr_lock); |
| 1456 | tcmu_handle_completions(udev); | 1486 | tcmu_handle_completions(udev); |
| 1457 | run_cmdr_queue(udev, false); | 1487 | run_qfull_queue(udev, false); |
| 1458 | mutex_unlock(&udev->cmdr_lock); | 1488 | mutex_unlock(&udev->cmdr_lock); |
| 1459 | 1489 | ||
| 1460 | return 0; | 1490 | return 0; |
| @@ -1982,7 +2012,7 @@ static void tcmu_block_dev(struct tcmu_dev *udev) | |||
| 1982 | /* complete IO that has executed successfully */ | 2012 | /* complete IO that has executed successfully */ |
| 1983 | tcmu_handle_completions(udev); | 2013 | tcmu_handle_completions(udev); |
| 1984 | /* fail IO waiting to be queued */ | 2014 | /* fail IO waiting to be queued */ |
| 1985 | run_cmdr_queue(udev, true); | 2015 | run_qfull_queue(udev, true); |
| 1986 | 2016 | ||
| 1987 | unlock: | 2017 | unlock: |
| 1988 | mutex_unlock(&udev->cmdr_lock); | 2018 | mutex_unlock(&udev->cmdr_lock); |
| @@ -1997,7 +2027,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) | |||
| 1997 | mutex_lock(&udev->cmdr_lock); | 2027 | mutex_lock(&udev->cmdr_lock); |
| 1998 | 2028 | ||
| 1999 | idr_for_each_entry(&udev->commands, cmd, i) { | 2029 | idr_for_each_entry(&udev->commands, cmd, i) { |
| 2000 | if (!list_empty(&cmd->cmdr_queue_entry)) | 2030 | if (!test_bit(TCMU_CMD_BIT_INFLIGHT, &cmd->flags)) |
| 2001 | continue; | 2031 | continue; |
| 2002 | 2032 | ||
| 2003 | pr_debug("removing cmd %u on dev %s from ring (is expired %d)\n", | 2033 | pr_debug("removing cmd %u on dev %s from ring (is expired %d)\n", |
| @@ -2006,6 +2036,7 @@ static void tcmu_reset_ring(struct tcmu_dev *udev, u8 err_level) | |||
| 2006 | 2036 | ||
| 2007 | idr_remove(&udev->commands, i); | 2037 | idr_remove(&udev->commands, i); |
| 2008 | if (!test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) { | 2038 | if (!test_bit(TCMU_CMD_BIT_EXPIRED, &cmd->flags)) { |
| 2039 | list_del_init(&cmd->queue_entry); | ||
| 2009 | if (err_level == 1) { | 2040 | if (err_level == 1) { |
| 2010 | /* | 2041 | /* |
| 2011 | * Userspace was not able to start the | 2042 | * Userspace was not able to start the |
| @@ -2666,6 +2697,10 @@ static void check_timedout_devices(void) | |||
| 2666 | 2697 | ||
| 2667 | mutex_lock(&udev->cmdr_lock); | 2698 | mutex_lock(&udev->cmdr_lock); |
| 2668 | idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL); | 2699 | idr_for_each(&udev->commands, tcmu_check_expired_cmd, NULL); |
| 2700 | |||
| 2701 | tcmu_set_next_deadline(&udev->inflight_queue, &udev->cmd_timer); | ||
| 2702 | tcmu_set_next_deadline(&udev->qfull_queue, &udev->qfull_timer); | ||
| 2703 | |||
| 2669 | mutex_unlock(&udev->cmdr_lock); | 2704 | mutex_unlock(&udev->cmdr_lock); |
| 2670 | 2705 | ||
| 2671 | spin_lock_bh(&timed_out_udevs_lock); | 2706 | spin_lock_bh(&timed_out_udevs_lock); |
