diff options
| -rw-r--r-- | drivers/s390/scsi/zfcp_ccw.c | 6 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 33 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 88 | ||||
| -rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/Kconfig | 2 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_alua.c | 12 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_emc.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh_rdac.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/scsi_error.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/scsi_scan.c | 3 | ||||
| -rw-r--r-- | include/scsi/scsi.h | 14 |
11 files changed, 87 insertions, 85 deletions
diff --git a/drivers/s390/scsi/zfcp_ccw.c b/drivers/s390/scsi/zfcp_ccw.c index 391dd29749f8..51b6a05f4d12 100644 --- a/drivers/s390/scsi/zfcp_ccw.c +++ b/drivers/s390/scsi/zfcp_ccw.c | |||
| @@ -152,10 +152,8 @@ static int zfcp_ccw_set_offline(struct ccw_device *ccw_device) | |||
| 152 | */ | 152 | */ |
| 153 | static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event) | 153 | static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event) |
| 154 | { | 154 | { |
| 155 | struct zfcp_adapter *adapter; | 155 | struct zfcp_adapter *adapter = dev_get_drvdata(&ccw_device->dev); |
| 156 | 156 | ||
| 157 | down(&zfcp_data.config_sema); | ||
| 158 | adapter = dev_get_drvdata(&ccw_device->dev); | ||
| 159 | switch (event) { | 157 | switch (event) { |
| 160 | case CIO_GONE: | 158 | case CIO_GONE: |
| 161 | dev_warn(&adapter->ccw_device->dev, "device gone\n"); | 159 | dev_warn(&adapter->ccw_device->dev, "device gone\n"); |
| @@ -174,8 +172,6 @@ static int zfcp_ccw_notify(struct ccw_device *ccw_device, int event) | |||
| 174 | 89, NULL); | 172 | 89, NULL); |
| 175 | break; | 173 | break; |
| 176 | } | 174 | } |
| 177 | zfcp_erp_wait(adapter); | ||
| 178 | up(&zfcp_data.config_sema); | ||
| 179 | return 1; | 175 | return 1; |
| 180 | } | 176 | } |
| 181 | 177 | ||
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index e984469bb98b..56196c98c07b 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -39,18 +39,6 @@ struct zfcp_gpn_ft { | |||
| 39 | struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS]; | 39 | struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS]; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | static struct zfcp_port *zfcp_get_port_by_did(struct zfcp_adapter *adapter, | ||
| 43 | u32 d_id) | ||
| 44 | { | ||
| 45 | struct zfcp_port *port; | ||
| 46 | |||
| 47 | list_for_each_entry(port, &adapter->port_list_head, list) | ||
| 48 | if ((port->d_id == d_id) && | ||
| 49 | !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) | ||
| 50 | return port; | ||
| 51 | return NULL; | ||
| 52 | } | ||
| 53 | |||
| 54 | static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, | 42 | static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, |
| 55 | struct fcp_rscn_element *elem) | 43 | struct fcp_rscn_element *elem) |
| 56 | { | 44 | { |
| @@ -341,12 +329,13 @@ void zfcp_test_link(struct zfcp_port *port) | |||
| 341 | 329 | ||
| 342 | zfcp_port_get(port); | 330 | zfcp_port_get(port); |
| 343 | retval = zfcp_fc_adisc(port); | 331 | retval = zfcp_fc_adisc(port); |
| 344 | if (retval == 0 || retval == -EBUSY) | 332 | if (retval == 0) |
| 345 | return; | 333 | return; |
| 346 | 334 | ||
| 347 | /* send of ADISC was not possible */ | 335 | /* send of ADISC was not possible */ |
| 348 | zfcp_port_put(port); | 336 | zfcp_port_put(port); |
| 349 | zfcp_erp_port_forced_reopen(port, 0, 65, NULL); | 337 | if (retval != -EBUSY) |
| 338 | zfcp_erp_port_forced_reopen(port, 0, 65, NULL); | ||
| 350 | } | 339 | } |
| 351 | 340 | ||
| 352 | static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) | 341 | static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) |
| @@ -363,7 +352,6 @@ static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) | |||
| 363 | if (ret) | 352 | if (ret) |
| 364 | return ret; | 353 | return ret; |
| 365 | zfcp_erp_wait(adapter); | 354 | zfcp_erp_wait(adapter); |
| 366 | zfcp_port_put(adapter->nameserver_port); | ||
| 367 | } | 355 | } |
| 368 | return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, | 356 | return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, |
| 369 | &adapter->nameserver_port->status); | 357 | &adapter->nameserver_port->status); |
| @@ -475,7 +463,7 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 475 | struct zfcp_adapter *adapter = ct->port->adapter; | 463 | struct zfcp_adapter *adapter = ct->port->adapter; |
| 476 | struct zfcp_port *port, *tmp; | 464 | struct zfcp_port *port, *tmp; |
| 477 | u32 d_id; | 465 | u32 d_id; |
| 478 | int ret = 0, x; | 466 | int ret = 0, x, last = 0; |
| 479 | 467 | ||
| 480 | if (ct->status) | 468 | if (ct->status) |
| 481 | return -EIO; | 469 | return -EIO; |
| @@ -492,19 +480,24 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 492 | down(&zfcp_data.config_sema); | 480 | down(&zfcp_data.config_sema); |
| 493 | 481 | ||
| 494 | /* first entry is the header */ | 482 | /* first entry is the header */ |
| 495 | for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES; x++) { | 483 | for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES && !last; x++) { |
| 496 | if (x % (ZFCP_GPN_FT_ENTRIES + 1)) | 484 | if (x % (ZFCP_GPN_FT_ENTRIES + 1)) |
| 497 | acc++; | 485 | acc++; |
| 498 | else | 486 | else |
| 499 | acc = sg_virt(++sg); | 487 | acc = sg_virt(++sg); |
| 500 | 488 | ||
| 489 | last = acc->control & 0x80; | ||
| 501 | d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 | | 490 | d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 | |
| 502 | acc->port_id[2]; | 491 | acc->port_id[2]; |
| 503 | 492 | ||
| 504 | /* skip the adapter's port and known remote ports */ | 493 | /* skip the adapter's port and known remote ports */ |
| 505 | if (acc->wwpn == fc_host_port_name(adapter->scsi_host) || | 494 | if (acc->wwpn == fc_host_port_name(adapter->scsi_host)) |
| 506 | zfcp_get_port_by_did(adapter, d_id)) | 495 | continue; |
| 496 | port = zfcp_get_port_by_wwpn(adapter, acc->wwpn); | ||
| 497 | if (port) { | ||
| 498 | zfcp_port_get(port); | ||
| 507 | continue; | 499 | continue; |
| 500 | } | ||
| 508 | 501 | ||
| 509 | port = zfcp_port_enqueue(adapter, acc->wwpn, | 502 | port = zfcp_port_enqueue(adapter, acc->wwpn, |
| 510 | ZFCP_STATUS_PORT_DID_DID | | 503 | ZFCP_STATUS_PORT_DID_DID | |
| @@ -513,8 +506,6 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 513 | ret = PTR_ERR(port); | 506 | ret = PTR_ERR(port); |
| 514 | else | 507 | else |
| 515 | zfcp_erp_port_reopen(port, 0, 149, NULL); | 508 | zfcp_erp_port_reopen(port, 0, 149, NULL); |
| 516 | if (acc->control & 0x80) /* last entry */ | ||
| 517 | break; | ||
| 518 | } | 509 | } |
| 519 | 510 | ||
| 520 | zfcp_erp_wait(adapter); | 511 | zfcp_erp_wait(adapter); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 19c1ca913874..49dbeb754e5f 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
| @@ -710,10 +710,10 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req) | |||
| 710 | 710 | ||
| 711 | static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue) | 711 | static int zfcp_fsf_sbal_check(struct zfcp_qdio_queue *queue) |
| 712 | { | 712 | { |
| 713 | spin_lock(&queue->lock); | 713 | spin_lock_bh(&queue->lock); |
| 714 | if (atomic_read(&queue->count)) | 714 | if (atomic_read(&queue->count)) |
| 715 | return 1; | 715 | return 1; |
| 716 | spin_unlock(&queue->lock); | 716 | spin_unlock_bh(&queue->lock); |
| 717 | return 0; | 717 | return 0; |
| 718 | } | 718 | } |
| 719 | 719 | ||
| @@ -722,13 +722,13 @@ static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter) | |||
| 722 | long ret; | 722 | long ret; |
| 723 | struct zfcp_qdio_queue *req_q = &adapter->req_q; | 723 | struct zfcp_qdio_queue *req_q = &adapter->req_q; |
| 724 | 724 | ||
| 725 | spin_unlock(&req_q->lock); | 725 | spin_unlock_bh(&req_q->lock); |
| 726 | ret = wait_event_interruptible_timeout(adapter->request_wq, | 726 | ret = wait_event_interruptible_timeout(adapter->request_wq, |
| 727 | zfcp_fsf_sbal_check(req_q), 5 * HZ); | 727 | zfcp_fsf_sbal_check(req_q), 5 * HZ); |
| 728 | if (ret > 0) | 728 | if (ret > 0) |
| 729 | return 0; | 729 | return 0; |
| 730 | 730 | ||
| 731 | spin_lock(&req_q->lock); | 731 | spin_lock_bh(&req_q->lock); |
| 732 | return -EIO; | 732 | return -EIO; |
| 733 | } | 733 | } |
| 734 | 734 | ||
| @@ -870,14 +870,14 @@ int zfcp_fsf_status_read(struct zfcp_adapter *adapter) | |||
| 870 | volatile struct qdio_buffer_element *sbale; | 870 | volatile struct qdio_buffer_element *sbale; |
| 871 | int retval = -EIO; | 871 | int retval = -EIO; |
| 872 | 872 | ||
| 873 | spin_lock(&adapter->req_q.lock); | 873 | spin_lock_bh(&adapter->req_q.lock); |
| 874 | if (zfcp_fsf_req_sbal_get(adapter)) | 874 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 875 | goto out; | 875 | goto out; |
| 876 | 876 | ||
| 877 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_UNSOLICITED_STATUS, | 877 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_UNSOLICITED_STATUS, |
| 878 | ZFCP_REQ_NO_QTCB, | 878 | ZFCP_REQ_NO_QTCB, |
| 879 | adapter->pool.fsf_req_status_read); | 879 | adapter->pool.fsf_req_status_read); |
| 880 | if (unlikely(IS_ERR(req))) { | 880 | if (IS_ERR(req)) { |
| 881 | retval = PTR_ERR(req); | 881 | retval = PTR_ERR(req); |
| 882 | goto out; | 882 | goto out; |
| 883 | } | 883 | } |
| @@ -910,7 +910,7 @@ failed_buf: | |||
| 910 | zfcp_fsf_req_free(req); | 910 | zfcp_fsf_req_free(req); |
| 911 | zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL); | 911 | zfcp_hba_dbf_event_fsf_unsol("fail", adapter, NULL); |
| 912 | out: | 912 | out: |
| 913 | spin_unlock(&adapter->req_q.lock); | 913 | spin_unlock_bh(&adapter->req_q.lock); |
| 914 | return retval; | 914 | return retval; |
| 915 | } | 915 | } |
| 916 | 916 | ||
| @@ -988,7 +988,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
| 988 | goto out; | 988 | goto out; |
| 989 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND, | 989 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_ABORT_FCP_CMND, |
| 990 | req_flags, adapter->pool.fsf_req_abort); | 990 | req_flags, adapter->pool.fsf_req_abort); |
| 991 | if (unlikely(IS_ERR(req))) | 991 | if (IS_ERR(req)) |
| 992 | goto out; | 992 | goto out; |
| 993 | 993 | ||
| 994 | if (unlikely(!(atomic_read(&unit->status) & | 994 | if (unlikely(!(atomic_read(&unit->status) & |
| @@ -1106,13 +1106,13 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool, | |||
| 1106 | struct zfcp_fsf_req *req; | 1106 | struct zfcp_fsf_req *req; |
| 1107 | int ret = -EIO; | 1107 | int ret = -EIO; |
| 1108 | 1108 | ||
| 1109 | spin_lock(&adapter->req_q.lock); | 1109 | spin_lock_bh(&adapter->req_q.lock); |
| 1110 | if (zfcp_fsf_req_sbal_get(adapter)) | 1110 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1111 | goto out; | 1111 | goto out; |
| 1112 | 1112 | ||
| 1113 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_GENERIC, | 1113 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_GENERIC, |
| 1114 | ZFCP_REQ_AUTO_CLEANUP, pool); | 1114 | ZFCP_REQ_AUTO_CLEANUP, pool); |
| 1115 | if (unlikely(IS_ERR(req))) { | 1115 | if (IS_ERR(req)) { |
| 1116 | ret = PTR_ERR(req); | 1116 | ret = PTR_ERR(req); |
| 1117 | goto out; | 1117 | goto out; |
| 1118 | } | 1118 | } |
| @@ -1148,7 +1148,7 @@ failed_send: | |||
| 1148 | if (erp_action) | 1148 | if (erp_action) |
| 1149 | erp_action->fsf_req = NULL; | 1149 | erp_action->fsf_req = NULL; |
| 1150 | out: | 1150 | out: |
| 1151 | spin_unlock(&adapter->req_q.lock); | 1151 | spin_unlock_bh(&adapter->req_q.lock); |
| 1152 | return ret; | 1152 | return ret; |
| 1153 | } | 1153 | } |
| 1154 | 1154 | ||
| @@ -1223,7 +1223,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els) | |||
| 1223 | goto out; | 1223 | goto out; |
| 1224 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS, | 1224 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_SEND_ELS, |
| 1225 | ZFCP_REQ_AUTO_CLEANUP, NULL); | 1225 | ZFCP_REQ_AUTO_CLEANUP, NULL); |
| 1226 | if (unlikely(IS_ERR(req))) { | 1226 | if (IS_ERR(req)) { |
| 1227 | ret = PTR_ERR(req); | 1227 | ret = PTR_ERR(req); |
| 1228 | goto out; | 1228 | goto out; |
| 1229 | } | 1229 | } |
| @@ -1263,14 +1263,14 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
| 1263 | struct zfcp_adapter *adapter = erp_action->adapter; | 1263 | struct zfcp_adapter *adapter = erp_action->adapter; |
| 1264 | int retval = -EIO; | 1264 | int retval = -EIO; |
| 1265 | 1265 | ||
| 1266 | spin_lock(&adapter->req_q.lock); | 1266 | spin_lock_bh(&adapter->req_q.lock); |
| 1267 | if (!atomic_read(&adapter->req_q.count)) | 1267 | if (!atomic_read(&adapter->req_q.count)) |
| 1268 | goto out; | 1268 | goto out; |
| 1269 | req = zfcp_fsf_req_create(adapter, | 1269 | req = zfcp_fsf_req_create(adapter, |
| 1270 | FSF_QTCB_EXCHANGE_CONFIG_DATA, | 1270 | FSF_QTCB_EXCHANGE_CONFIG_DATA, |
| 1271 | ZFCP_REQ_AUTO_CLEANUP, | 1271 | ZFCP_REQ_AUTO_CLEANUP, |
| 1272 | adapter->pool.fsf_req_erp); | 1272 | adapter->pool.fsf_req_erp); |
| 1273 | if (unlikely(IS_ERR(req))) { | 1273 | if (IS_ERR(req)) { |
| 1274 | retval = PTR_ERR(req); | 1274 | retval = PTR_ERR(req); |
| 1275 | goto out; | 1275 | goto out; |
| 1276 | } | 1276 | } |
| @@ -1295,7 +1295,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
| 1295 | erp_action->fsf_req = NULL; | 1295 | erp_action->fsf_req = NULL; |
| 1296 | } | 1296 | } |
| 1297 | out: | 1297 | out: |
| 1298 | spin_unlock(&adapter->req_q.lock); | 1298 | spin_unlock_bh(&adapter->req_q.lock); |
| 1299 | return retval; | 1299 | return retval; |
| 1300 | } | 1300 | } |
| 1301 | 1301 | ||
| @@ -1306,13 +1306,13 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter, | |||
| 1306 | struct zfcp_fsf_req *req = NULL; | 1306 | struct zfcp_fsf_req *req = NULL; |
| 1307 | int retval = -EIO; | 1307 | int retval = -EIO; |
| 1308 | 1308 | ||
| 1309 | spin_lock(&adapter->req_q.lock); | 1309 | spin_lock_bh(&adapter->req_q.lock); |
| 1310 | if (zfcp_fsf_req_sbal_get(adapter)) | 1310 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1311 | goto out; | 1311 | goto out; |
| 1312 | 1312 | ||
| 1313 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA, | 1313 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA, |
| 1314 | 0, NULL); | 1314 | 0, NULL); |
| 1315 | if (unlikely(IS_ERR(req))) { | 1315 | if (IS_ERR(req)) { |
| 1316 | retval = PTR_ERR(req); | 1316 | retval = PTR_ERR(req); |
| 1317 | goto out; | 1317 | goto out; |
| 1318 | } | 1318 | } |
| @@ -1334,7 +1334,7 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter, | |||
| 1334 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); | 1334 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
| 1335 | retval = zfcp_fsf_req_send(req); | 1335 | retval = zfcp_fsf_req_send(req); |
| 1336 | out: | 1336 | out: |
| 1337 | spin_unlock(&adapter->req_q.lock); | 1337 | spin_unlock_bh(&adapter->req_q.lock); |
| 1338 | if (!retval) | 1338 | if (!retval) |
| 1339 | wait_event(req->completion_wq, | 1339 | wait_event(req->completion_wq, |
| 1340 | req->status & ZFCP_STATUS_FSFREQ_COMPLETED); | 1340 | req->status & ZFCP_STATUS_FSFREQ_COMPLETED); |
| @@ -1359,13 +1359,13 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) | |||
| 1359 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) | 1359 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) |
| 1360 | return -EOPNOTSUPP; | 1360 | return -EOPNOTSUPP; |
| 1361 | 1361 | ||
| 1362 | spin_lock(&adapter->req_q.lock); | 1362 | spin_lock_bh(&adapter->req_q.lock); |
| 1363 | if (!atomic_read(&adapter->req_q.count)) | 1363 | if (!atomic_read(&adapter->req_q.count)) |
| 1364 | goto out; | 1364 | goto out; |
| 1365 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, | 1365 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, |
| 1366 | ZFCP_REQ_AUTO_CLEANUP, | 1366 | ZFCP_REQ_AUTO_CLEANUP, |
| 1367 | adapter->pool.fsf_req_erp); | 1367 | adapter->pool.fsf_req_erp); |
| 1368 | if (unlikely(IS_ERR(req))) { | 1368 | if (IS_ERR(req)) { |
| 1369 | retval = PTR_ERR(req); | 1369 | retval = PTR_ERR(req); |
| 1370 | goto out; | 1370 | goto out; |
| 1371 | } | 1371 | } |
| @@ -1385,7 +1385,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) | |||
| 1385 | erp_action->fsf_req = NULL; | 1385 | erp_action->fsf_req = NULL; |
| 1386 | } | 1386 | } |
| 1387 | out: | 1387 | out: |
| 1388 | spin_unlock(&adapter->req_q.lock); | 1388 | spin_unlock_bh(&adapter->req_q.lock); |
| 1389 | return retval; | 1389 | return retval; |
| 1390 | } | 1390 | } |
| 1391 | 1391 | ||
| @@ -1405,13 +1405,13 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter, | |||
| 1405 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) | 1405 | if (!(adapter->adapter_features & FSF_FEATURE_HBAAPI_MANAGEMENT)) |
| 1406 | return -EOPNOTSUPP; | 1406 | return -EOPNOTSUPP; |
| 1407 | 1407 | ||
| 1408 | spin_lock(&adapter->req_q.lock); | 1408 | spin_lock_bh(&adapter->req_q.lock); |
| 1409 | if (!atomic_read(&adapter->req_q.count)) | 1409 | if (!atomic_read(&adapter->req_q.count)) |
| 1410 | goto out; | 1410 | goto out; |
| 1411 | 1411 | ||
| 1412 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0, | 1412 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0, |
| 1413 | NULL); | 1413 | NULL); |
| 1414 | if (unlikely(IS_ERR(req))) { | 1414 | if (IS_ERR(req)) { |
| 1415 | retval = PTR_ERR(req); | 1415 | retval = PTR_ERR(req); |
| 1416 | goto out; | 1416 | goto out; |
| 1417 | } | 1417 | } |
| @@ -1427,7 +1427,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter, | |||
| 1427 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); | 1427 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
| 1428 | retval = zfcp_fsf_req_send(req); | 1428 | retval = zfcp_fsf_req_send(req); |
| 1429 | out: | 1429 | out: |
| 1430 | spin_unlock(&adapter->req_q.lock); | 1430 | spin_unlock_bh(&adapter->req_q.lock); |
| 1431 | if (!retval) | 1431 | if (!retval) |
| 1432 | wait_event(req->completion_wq, | 1432 | wait_event(req->completion_wq, |
| 1433 | req->status & ZFCP_STATUS_FSFREQ_COMPLETED); | 1433 | req->status & ZFCP_STATUS_FSFREQ_COMPLETED); |
| @@ -1531,7 +1531,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
| 1531 | struct zfcp_fsf_req *req; | 1531 | struct zfcp_fsf_req *req; |
| 1532 | int retval = -EIO; | 1532 | int retval = -EIO; |
| 1533 | 1533 | ||
| 1534 | spin_lock(&adapter->req_q.lock); | 1534 | spin_lock_bh(&adapter->req_q.lock); |
| 1535 | if (zfcp_fsf_req_sbal_get(adapter)) | 1535 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1536 | goto out; | 1536 | goto out; |
| 1537 | 1537 | ||
| @@ -1539,7 +1539,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
| 1539 | FSF_QTCB_OPEN_PORT_WITH_DID, | 1539 | FSF_QTCB_OPEN_PORT_WITH_DID, |
| 1540 | ZFCP_REQ_AUTO_CLEANUP, | 1540 | ZFCP_REQ_AUTO_CLEANUP, |
| 1541 | adapter->pool.fsf_req_erp); | 1541 | adapter->pool.fsf_req_erp); |
| 1542 | if (unlikely(IS_ERR(req))) { | 1542 | if (IS_ERR(req)) { |
| 1543 | retval = PTR_ERR(req); | 1543 | retval = PTR_ERR(req); |
| 1544 | goto out; | 1544 | goto out; |
| 1545 | } | 1545 | } |
| @@ -1562,7 +1562,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
| 1562 | erp_action->fsf_req = NULL; | 1562 | erp_action->fsf_req = NULL; |
| 1563 | } | 1563 | } |
| 1564 | out: | 1564 | out: |
| 1565 | spin_unlock(&adapter->req_q.lock); | 1565 | spin_unlock_bh(&adapter->req_q.lock); |
| 1566 | return retval; | 1566 | return retval; |
| 1567 | } | 1567 | } |
| 1568 | 1568 | ||
| @@ -1603,14 +1603,14 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) | |||
| 1603 | struct zfcp_fsf_req *req; | 1603 | struct zfcp_fsf_req *req; |
| 1604 | int retval = -EIO; | 1604 | int retval = -EIO; |
| 1605 | 1605 | ||
| 1606 | spin_lock(&adapter->req_q.lock); | 1606 | spin_lock_bh(&adapter->req_q.lock); |
| 1607 | if (zfcp_fsf_req_sbal_get(adapter)) | 1607 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1608 | goto out; | 1608 | goto out; |
| 1609 | 1609 | ||
| 1610 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PORT, | 1610 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PORT, |
| 1611 | ZFCP_REQ_AUTO_CLEANUP, | 1611 | ZFCP_REQ_AUTO_CLEANUP, |
| 1612 | adapter->pool.fsf_req_erp); | 1612 | adapter->pool.fsf_req_erp); |
| 1613 | if (unlikely(IS_ERR(req))) { | 1613 | if (IS_ERR(req)) { |
| 1614 | retval = PTR_ERR(req); | 1614 | retval = PTR_ERR(req); |
| 1615 | goto out; | 1615 | goto out; |
| 1616 | } | 1616 | } |
| @@ -1633,7 +1633,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) | |||
| 1633 | erp_action->fsf_req = NULL; | 1633 | erp_action->fsf_req = NULL; |
| 1634 | } | 1634 | } |
| 1635 | out: | 1635 | out: |
| 1636 | spin_unlock(&adapter->req_q.lock); | 1636 | spin_unlock_bh(&adapter->req_q.lock); |
| 1637 | return retval; | 1637 | return retval; |
| 1638 | } | 1638 | } |
| 1639 | 1639 | ||
| @@ -1700,14 +1700,14 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) | |||
| 1700 | struct zfcp_fsf_req *req; | 1700 | struct zfcp_fsf_req *req; |
| 1701 | int retval = -EIO; | 1701 | int retval = -EIO; |
| 1702 | 1702 | ||
| 1703 | spin_lock(&adapter->req_q.lock); | 1703 | spin_lock_bh(&adapter->req_q.lock); |
| 1704 | if (zfcp_fsf_req_sbal_get(adapter)) | 1704 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1705 | goto out; | 1705 | goto out; |
| 1706 | 1706 | ||
| 1707 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PHYSICAL_PORT, | 1707 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_PHYSICAL_PORT, |
| 1708 | ZFCP_REQ_AUTO_CLEANUP, | 1708 | ZFCP_REQ_AUTO_CLEANUP, |
| 1709 | adapter->pool.fsf_req_erp); | 1709 | adapter->pool.fsf_req_erp); |
| 1710 | if (unlikely(IS_ERR(req))) { | 1710 | if (IS_ERR(req)) { |
| 1711 | retval = PTR_ERR(req); | 1711 | retval = PTR_ERR(req); |
| 1712 | goto out; | 1712 | goto out; |
| 1713 | } | 1713 | } |
| @@ -1731,7 +1731,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) | |||
| 1731 | erp_action->fsf_req = NULL; | 1731 | erp_action->fsf_req = NULL; |
| 1732 | } | 1732 | } |
| 1733 | out: | 1733 | out: |
| 1734 | spin_unlock(&adapter->req_q.lock); | 1734 | spin_unlock_bh(&adapter->req_q.lock); |
| 1735 | return retval; | 1735 | return retval; |
| 1736 | } | 1736 | } |
| 1737 | 1737 | ||
| @@ -1875,14 +1875,14 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | |||
| 1875 | struct zfcp_fsf_req *req; | 1875 | struct zfcp_fsf_req *req; |
| 1876 | int retval = -EIO; | 1876 | int retval = -EIO; |
| 1877 | 1877 | ||
| 1878 | spin_lock(&adapter->req_q.lock); | 1878 | spin_lock_bh(&adapter->req_q.lock); |
| 1879 | if (zfcp_fsf_req_sbal_get(adapter)) | 1879 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1880 | goto out; | 1880 | goto out; |
| 1881 | 1881 | ||
| 1882 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_OPEN_LUN, | 1882 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_OPEN_LUN, |
| 1883 | ZFCP_REQ_AUTO_CLEANUP, | 1883 | ZFCP_REQ_AUTO_CLEANUP, |
| 1884 | adapter->pool.fsf_req_erp); | 1884 | adapter->pool.fsf_req_erp); |
| 1885 | if (unlikely(IS_ERR(req))) { | 1885 | if (IS_ERR(req)) { |
| 1886 | retval = PTR_ERR(req); | 1886 | retval = PTR_ERR(req); |
| 1887 | goto out; | 1887 | goto out; |
| 1888 | } | 1888 | } |
| @@ -1910,7 +1910,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | |||
| 1910 | erp_action->fsf_req = NULL; | 1910 | erp_action->fsf_req = NULL; |
| 1911 | } | 1911 | } |
| 1912 | out: | 1912 | out: |
| 1913 | spin_unlock(&adapter->req_q.lock); | 1913 | spin_unlock_bh(&adapter->req_q.lock); |
| 1914 | return retval; | 1914 | return retval; |
| 1915 | } | 1915 | } |
| 1916 | 1916 | ||
| @@ -1965,13 +1965,13 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) | |||
| 1965 | struct zfcp_fsf_req *req; | 1965 | struct zfcp_fsf_req *req; |
| 1966 | int retval = -EIO; | 1966 | int retval = -EIO; |
| 1967 | 1967 | ||
| 1968 | spin_lock(&adapter->req_q.lock); | 1968 | spin_lock_bh(&adapter->req_q.lock); |
| 1969 | if (zfcp_fsf_req_sbal_get(adapter)) | 1969 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 1970 | goto out; | 1970 | goto out; |
| 1971 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN, | 1971 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_CLOSE_LUN, |
| 1972 | ZFCP_REQ_AUTO_CLEANUP, | 1972 | ZFCP_REQ_AUTO_CLEANUP, |
| 1973 | adapter->pool.fsf_req_erp); | 1973 | adapter->pool.fsf_req_erp); |
| 1974 | if (unlikely(IS_ERR(req))) { | 1974 | if (IS_ERR(req)) { |
| 1975 | retval = PTR_ERR(req); | 1975 | retval = PTR_ERR(req); |
| 1976 | goto out; | 1976 | goto out; |
| 1977 | } | 1977 | } |
| @@ -1995,7 +1995,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) | |||
| 1995 | erp_action->fsf_req = NULL; | 1995 | erp_action->fsf_req = NULL; |
| 1996 | } | 1996 | } |
| 1997 | out: | 1997 | out: |
| 1998 | spin_unlock(&adapter->req_q.lock); | 1998 | spin_unlock_bh(&adapter->req_q.lock); |
| 1999 | return retval; | 1999 | return retval; |
| 2000 | } | 2000 | } |
| 2001 | 2001 | ||
| @@ -2228,7 +2228,7 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_adapter *adapter, | |||
| 2228 | goto out; | 2228 | goto out; |
| 2229 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, | 2229 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, |
| 2230 | adapter->pool.fsf_req_scsi); | 2230 | adapter->pool.fsf_req_scsi); |
| 2231 | if (unlikely(IS_ERR(req))) { | 2231 | if (IS_ERR(req)) { |
| 2232 | retval = PTR_ERR(req); | 2232 | retval = PTR_ERR(req); |
| 2233 | goto out; | 2233 | goto out; |
| 2234 | } | 2234 | } |
| @@ -2351,7 +2351,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_adapter *adapter, | |||
| 2351 | goto out; | 2351 | goto out; |
| 2352 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, | 2352 | req = zfcp_fsf_req_create(adapter, FSF_QTCB_FCP_CMND, req_flags, |
| 2353 | adapter->pool.fsf_req_scsi); | 2353 | adapter->pool.fsf_req_scsi); |
| 2354 | if (unlikely(IS_ERR(req))) | 2354 | if (IS_ERR(req)) |
| 2355 | goto out; | 2355 | goto out; |
| 2356 | 2356 | ||
| 2357 | req->status |= ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT; | 2357 | req->status |= ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT; |
| @@ -2417,12 +2417,12 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, | |||
| 2417 | return ERR_PTR(-EINVAL); | 2417 | return ERR_PTR(-EINVAL); |
| 2418 | } | 2418 | } |
| 2419 | 2419 | ||
| 2420 | spin_lock(&adapter->req_q.lock); | 2420 | spin_lock_bh(&adapter->req_q.lock); |
| 2421 | if (zfcp_fsf_req_sbal_get(adapter)) | 2421 | if (zfcp_fsf_req_sbal_get(adapter)) |
| 2422 | goto out; | 2422 | goto out; |
| 2423 | 2423 | ||
| 2424 | req = zfcp_fsf_req_create(adapter, fsf_cfdc->command, 0, NULL); | 2424 | req = zfcp_fsf_req_create(adapter, fsf_cfdc->command, 0, NULL); |
| 2425 | if (unlikely(IS_ERR(req))) { | 2425 | if (IS_ERR(req)) { |
| 2426 | retval = -EPERM; | 2426 | retval = -EPERM; |
| 2427 | goto out; | 2427 | goto out; |
| 2428 | } | 2428 | } |
| @@ -2447,7 +2447,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, | |||
| 2447 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); | 2447 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
| 2448 | retval = zfcp_fsf_req_send(req); | 2448 | retval = zfcp_fsf_req_send(req); |
| 2449 | out: | 2449 | out: |
| 2450 | spin_unlock(&adapter->req_q.lock); | 2450 | spin_unlock_bh(&adapter->req_q.lock); |
| 2451 | 2451 | ||
| 2452 | if (!retval) { | 2452 | if (!retval) { |
| 2453 | wait_event(req->completion_wq, | 2453 | wait_event(req->completion_wq, |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index d6dbd653fde9..69d632d851d9 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
| @@ -423,9 +423,9 @@ void zfcp_qdio_close(struct zfcp_adapter *adapter) | |||
| 423 | 423 | ||
| 424 | /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */ | 424 | /* clear QDIOUP flag, thus do_QDIO is not called during qdio_shutdown */ |
| 425 | req_q = &adapter->req_q; | 425 | req_q = &adapter->req_q; |
| 426 | spin_lock(&req_q->lock); | 426 | spin_lock_bh(&req_q->lock); |
| 427 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); | 427 | atomic_clear_mask(ZFCP_STATUS_ADAPTER_QDIOUP, &adapter->status); |
| 428 | spin_unlock(&req_q->lock); | 428 | spin_unlock_bh(&req_q->lock); |
| 429 | 429 | ||
| 430 | qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR); | 430 | qdio_shutdown(adapter->ccw_device, QDIO_FLAG_CLEANUP_USING_CLEAR); |
| 431 | 431 | ||
diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig index c7f06298bd3c..4e0322b1c1ea 100644 --- a/drivers/scsi/Kconfig +++ b/drivers/scsi/Kconfig | |||
| @@ -63,7 +63,7 @@ comment "SCSI support type (disk, tape, CD-ROM)" | |||
| 63 | config BLK_DEV_SD | 63 | config BLK_DEV_SD |
| 64 | tristate "SCSI disk support" | 64 | tristate "SCSI disk support" |
| 65 | depends on SCSI | 65 | depends on SCSI |
| 66 | select CRC_T10DIF | 66 | select CRC_T10DIF if BLK_DEV_INTEGRITY |
| 67 | ---help--- | 67 | ---help--- |
| 68 | If you want to use SCSI hard disks, Fibre Channel disks, | 68 | If you want to use SCSI hard disks, Fibre Channel disks, |
| 69 | Serial ATA (SATA) or Parallel ATA (PATA) hard disks, | 69 | Serial ATA (SATA) or Parallel ATA (PATA) hard disks, |
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c index 994da56fffed..708e475896b9 100644 --- a/drivers/scsi/device_handler/scsi_dh_alua.c +++ b/drivers/scsi/device_handler/scsi_dh_alua.c | |||
| @@ -425,7 +425,7 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
| 425 | /* | 425 | /* |
| 426 | * LUN Not Accessible - ALUA state transition | 426 | * LUN Not Accessible - ALUA state transition |
| 427 | */ | 427 | */ |
| 428 | return NEEDS_RETRY; | 428 | return ADD_TO_MLQUEUE; |
| 429 | if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b) | 429 | if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0b) |
| 430 | /* | 430 | /* |
| 431 | * LUN Not Accessible -- Target port in standby state | 431 | * LUN Not Accessible -- Target port in standby state |
| @@ -447,18 +447,18 @@ static int alua_check_sense(struct scsi_device *sdev, | |||
| 447 | /* | 447 | /* |
| 448 | * Power On, Reset, or Bus Device Reset, just retry. | 448 | * Power On, Reset, or Bus Device Reset, just retry. |
| 449 | */ | 449 | */ |
| 450 | return NEEDS_RETRY; | 450 | return ADD_TO_MLQUEUE; |
| 451 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) { | 451 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x06) { |
| 452 | /* | 452 | /* |
| 453 | * ALUA state changed | 453 | * ALUA state changed |
| 454 | */ | 454 | */ |
| 455 | return NEEDS_RETRY; | 455 | return ADD_TO_MLQUEUE; |
| 456 | } | 456 | } |
| 457 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) { | 457 | if (sense_hdr->asc == 0x2a && sense_hdr->ascq == 0x07) { |
| 458 | /* | 458 | /* |
| 459 | * Implicit ALUA state transition failed | 459 | * Implicit ALUA state transition failed |
| 460 | */ | 460 | */ |
| 461 | return NEEDS_RETRY; | 461 | return ADD_TO_MLQUEUE; |
| 462 | } | 462 | } |
| 463 | break; | 463 | break; |
| 464 | } | 464 | } |
| @@ -490,7 +490,7 @@ static int alua_stpg(struct scsi_device *sdev, int state, | |||
| 490 | if (!err) | 490 | if (!err) |
| 491 | return SCSI_DH_IO; | 491 | return SCSI_DH_IO; |
| 492 | err = alua_check_sense(sdev, &sense_hdr); | 492 | err = alua_check_sense(sdev, &sense_hdr); |
| 493 | if (retry > 0 && err == NEEDS_RETRY) { | 493 | if (retry > 0 && err == ADD_TO_MLQUEUE) { |
| 494 | retry--; | 494 | retry--; |
| 495 | goto retry; | 495 | goto retry; |
| 496 | } | 496 | } |
| @@ -535,7 +535,7 @@ static int alua_rtpg(struct scsi_device *sdev, struct alua_dh_data *h) | |||
| 535 | return SCSI_DH_IO; | 535 | return SCSI_DH_IO; |
| 536 | 536 | ||
| 537 | err = alua_check_sense(sdev, &sense_hdr); | 537 | err = alua_check_sense(sdev, &sense_hdr); |
| 538 | if (err == NEEDS_RETRY) | 538 | if (err == ADD_TO_MLQUEUE) |
| 539 | goto retry; | 539 | goto retry; |
| 540 | sdev_printk(KERN_INFO, sdev, | 540 | sdev_printk(KERN_INFO, sdev, |
| 541 | "%s: rtpg sense code %02x/%02x/%02x\n", | 541 | "%s: rtpg sense code %02x/%02x/%02x\n", |
diff --git a/drivers/scsi/device_handler/scsi_dh_emc.c b/drivers/scsi/device_handler/scsi_dh_emc.c index b9d23e9e9a44..ef693e8412e9 100644 --- a/drivers/scsi/device_handler/scsi_dh_emc.c +++ b/drivers/scsi/device_handler/scsi_dh_emc.c | |||
| @@ -439,7 +439,7 @@ static int clariion_check_sense(struct scsi_device *sdev, | |||
| 439 | * Unit Attention Code. This is the first IO | 439 | * Unit Attention Code. This is the first IO |
| 440 | * to the new path, so just retry. | 440 | * to the new path, so just retry. |
| 441 | */ | 441 | */ |
| 442 | return NEEDS_RETRY; | 442 | return ADD_TO_MLQUEUE; |
| 443 | break; | 443 | break; |
| 444 | } | 444 | } |
| 445 | 445 | ||
| @@ -514,7 +514,7 @@ retry: | |||
| 514 | return SCSI_DH_IO; | 514 | return SCSI_DH_IO; |
| 515 | 515 | ||
| 516 | err = clariion_check_sense(sdev, &sshdr); | 516 | err = clariion_check_sense(sdev, &sshdr); |
| 517 | if (retry > 0 && err == NEEDS_RETRY) { | 517 | if (retry > 0 && err == ADD_TO_MLQUEUE) { |
| 518 | retry--; | 518 | retry--; |
| 519 | goto retry; | 519 | goto retry; |
| 520 | } | 520 | } |
diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c index 2dee69da35cf..6e2f130d56de 100644 --- a/drivers/scsi/device_handler/scsi_dh_rdac.c +++ b/drivers/scsi/device_handler/scsi_dh_rdac.c | |||
| @@ -551,7 +551,7 @@ static int rdac_check_sense(struct scsi_device *sdev, | |||
| 551 | * | 551 | * |
| 552 | * Just retry and wait. | 552 | * Just retry and wait. |
| 553 | */ | 553 | */ |
| 554 | return NEEDS_RETRY; | 554 | return ADD_TO_MLQUEUE; |
| 555 | break; | 555 | break; |
| 556 | case ILLEGAL_REQUEST: | 556 | case ILLEGAL_REQUEST: |
| 557 | if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) { | 557 | if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) { |
| @@ -568,7 +568,7 @@ static int rdac_check_sense(struct scsi_device *sdev, | |||
| 568 | /* | 568 | /* |
| 569 | * Power On, Reset, or Bus Device Reset, just retry. | 569 | * Power On, Reset, or Bus Device Reset, just retry. |
| 570 | */ | 570 | */ |
| 571 | return NEEDS_RETRY; | 571 | return ADD_TO_MLQUEUE; |
| 572 | break; | 572 | break; |
| 573 | } | 573 | } |
| 574 | /* success just means we do not care what scsi-ml does */ | 574 | /* success just means we do not care what scsi-ml does */ |
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c index 880051c89bde..39ce3aba1dac 100644 --- a/drivers/scsi/scsi_error.c +++ b/drivers/scsi/scsi_error.c | |||
| @@ -391,7 +391,7 @@ static int scsi_check_sense(struct scsi_cmnd *scmd) | |||
| 391 | 391 | ||
| 392 | case HARDWARE_ERROR: | 392 | case HARDWARE_ERROR: |
| 393 | if (scmd->device->retry_hwerror) | 393 | if (scmd->device->retry_hwerror) |
| 394 | return NEEDS_RETRY; | 394 | return ADD_TO_MLQUEUE; |
| 395 | else | 395 | else |
| 396 | return SUCCESS; | 396 | return SUCCESS; |
| 397 | 397 | ||
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 84b4879cff11..34d0de6cd511 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
| @@ -1080,7 +1080,8 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
| 1080 | * PDT=1Fh none (no FDD connected to the requested logical unit) | 1080 | * PDT=1Fh none (no FDD connected to the requested logical unit) |
| 1081 | */ | 1081 | */ |
| 1082 | if (((result[0] >> 5) == 1 || starget->pdt_1f_for_no_lun) && | 1082 | if (((result[0] >> 5) == 1 || starget->pdt_1f_for_no_lun) && |
| 1083 | (result[0] & 0x1f) == 0x1f) { | 1083 | (result[0] & 0x1f) == 0x1f && |
| 1084 | !scsi_is_wlun(lun)) { | ||
| 1084 | SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO | 1085 | SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO |
| 1085 | "scsi scan: peripheral device type" | 1086 | "scsi scan: peripheral device type" |
| 1086 | " of 31, no device added\n")); | 1087 | " of 31, no device added\n")); |
diff --git a/include/scsi/scsi.h b/include/scsi/scsi.h index 5c40cc537d4c..192f8716aa9e 100644 --- a/include/scsi/scsi.h +++ b/include/scsi/scsi.h | |||
| @@ -309,6 +309,20 @@ struct scsi_lun { | |||
| 309 | }; | 309 | }; |
| 310 | 310 | ||
| 311 | /* | 311 | /* |
| 312 | * The Well Known LUNS (SAM-3) in our int representation of a LUN | ||
| 313 | */ | ||
| 314 | #define SCSI_W_LUN_BASE 0xc100 | ||
| 315 | #define SCSI_W_LUN_REPORT_LUNS (SCSI_W_LUN_BASE + 1) | ||
| 316 | #define SCSI_W_LUN_ACCESS_CONTROL (SCSI_W_LUN_BASE + 2) | ||
| 317 | #define SCSI_W_LUN_TARGET_LOG_PAGE (SCSI_W_LUN_BASE + 3) | ||
| 318 | |||
| 319 | static inline int scsi_is_wlun(unsigned int lun) | ||
| 320 | { | ||
| 321 | return (lun & 0xff00) == SCSI_W_LUN_BASE; | ||
| 322 | } | ||
| 323 | |||
| 324 | |||
| 325 | /* | ||
| 312 | * MESSAGE CODES | 326 | * MESSAGE CODES |
| 313 | */ | 327 | */ |
| 314 | 328 | ||
