Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch '6.10/scsi-queue' into 6.10/scsi-fixes

Pull in remaining commits from 6.10/scsi-queue.

Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

+85 -20
+2 -2
Documentation/cdrom/cdrom-standard.rst
··· 217 217 int (*media_changed)(struct cdrom_device_info *, int); 218 218 int (*tray_move)(struct cdrom_device_info *, int); 219 219 int (*lock_door)(struct cdrom_device_info *, int); 220 - int (*select_speed)(struct cdrom_device_info *, int); 220 + int (*select_speed)(struct cdrom_device_info *, unsigned long); 221 221 int (*get_last_session) (struct cdrom_device_info *, 222 222 struct cdrom_multisession *); 223 223 int (*get_mcn)(struct cdrom_device_info *, struct cdrom_mcn *); ··· 396 396 397 397 :: 398 398 399 - int select_speed(struct cdrom_device_info *cdi, int speed) 399 + int select_speed(struct cdrom_device_info *cdi, unsigned long speed) 400 400 401 401 Some CD-ROM drives are capable of changing their head-speed. There 402 402 are several reasons for changing the speed of a CD-ROM drive. Badly
+22 -9
drivers/scsi/device_handler/scsi_dh_alua.c
··· 414 414 } 415 415 } 416 416 417 - static enum scsi_disposition alua_check_sense(struct scsi_device *sdev, 418 - struct scsi_sense_hdr *sense_hdr) 417 + static void alua_handle_state_transition(struct scsi_device *sdev) 419 418 { 420 419 struct alua_dh_data *h = sdev->handler_data; 421 420 struct alua_port_group *pg; 422 421 422 + rcu_read_lock(); 423 + pg = rcu_dereference(h->pg); 424 + if (pg) 425 + pg->state = SCSI_ACCESS_STATE_TRANSITIONING; 426 + rcu_read_unlock(); 427 + alua_check(sdev, false); 428 + } 429 + 430 + static enum scsi_disposition alua_check_sense(struct scsi_device *sdev, 431 + struct scsi_sense_hdr *sense_hdr) 432 + { 423 433 switch (sense_hdr->sense_key) { 424 434 case NOT_READY: 425 435 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) { 426 436 /* 427 437 * LUN Not Accessible - ALUA state transition 428 438 */ 429 - rcu_read_lock(); 430 - pg = rcu_dereference(h->pg); 431 - if (pg) 432 - pg->state = SCSI_ACCESS_STATE_TRANSITIONING; 433 - rcu_read_unlock(); 434 - alua_check(sdev, false); 439 + alua_handle_state_transition(sdev); 435 440 return NEEDS_RETRY; 436 441 } 437 442 break; 438 443 case UNIT_ATTENTION: 444 + if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x0a) { 445 + /* 446 + * LUN Not Accessible - ALUA state transition 447 + */ 448 + alua_handle_state_transition(sdev); 449 + return NEEDS_RETRY; 450 + } 439 451 if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00) { 440 452 /* 441 453 * Power On, Reset, or Bus Device Reset. ··· 514 502 515 503 retval = scsi_test_unit_ready(sdev, ALUA_FAILOVER_TIMEOUT * HZ, 516 504 ALUA_FAILOVER_RETRIES, &sense_hdr); 517 - if (sense_hdr.sense_key == NOT_READY && 505 + if ((sense_hdr.sense_key == NOT_READY || 506 + sense_hdr.sense_key == UNIT_ATTENTION) && 518 507 sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x0a) 519 508 return SCSI_DH_RETRY; 520 509 else if (retval)
+1 -1
drivers/scsi/mpi3mr/mpi3mr_transport.c
··· 1364 1364 continue; 1365 1365 1366 1366 if (i > sizeof(mr_sas_port->phy_mask) * 8) { 1367 - ioc_warn(mrioc, "skipping port %u, max allowed value is %lu\n", 1367 + ioc_warn(mrioc, "skipping port %u, max allowed value is %zu\n", 1368 1368 i, sizeof(mr_sas_port->phy_mask) * 8); 1369 1369 goto out_fail; 1370 1370 }
+2 -2
drivers/scsi/mpt3sas/mpt3sas_scsih.c
··· 302 302 303 303 /** 304 304 * _scsih_set_debug_level - global setting of ioc->logging_level. 305 - * @val: ? 306 - * @kp: ? 305 + * @val: value of the parameter to be set 306 + * @kp: pointer to kernel_param structure 307 307 * 308 308 * Note: The logging levels are defined in mpt3sas_debug.h. 309 309 */
+1
drivers/scsi/qedf/qedf.h
··· 363 363 #define QEDF_IN_RECOVERY 5 364 364 #define QEDF_DBG_STOP_IO 6 365 365 #define QEDF_PROBING 8 366 + #define QEDF_STAG_IN_PROGRESS 9 366 367 unsigned long flags; /* Miscellaneous state flags */ 367 368 int fipvlan_retries; 368 369 u8 num_queues;
+44 -3
drivers/scsi/qedf/qedf_main.c
··· 318 318 */ 319 319 if (resp == fc_lport_flogi_resp) { 320 320 qedf->flogi_cnt++; 321 + qedf->flogi_pending++; 322 + 323 + if (test_bit(QEDF_UNLOADING, &qedf->flags)) { 324 + QEDF_ERR(&qedf->dbg_ctx, "Driver unloading\n"); 325 + qedf->flogi_pending = 0; 326 + } 327 + 321 328 if (qedf->flogi_pending >= QEDF_FLOGI_RETRY_CNT) { 322 329 schedule_delayed_work(&qedf->stag_work, 2); 323 330 return NULL; 324 331 } 325 - qedf->flogi_pending++; 332 + 326 333 return fc_elsct_send(lport, did, fp, op, qedf_flogi_resp, 327 334 arg, timeout); 328 335 } ··· 919 912 struct qedf_ctx *qedf; 920 913 struct qed_link_output if_link; 921 914 915 + qedf = lport_priv(lport); 916 + 922 917 if (lport->vport) { 918 + clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags); 923 919 printk_ratelimited("Cannot issue host reset on NPIV port.\n"); 924 920 return; 925 921 } 926 - 927 - qedf = lport_priv(lport); 928 922 929 923 qedf->flogi_pending = 0; 930 924 /* For host reset, essentially do a soft link up/down */ ··· 946 938 if (!if_link.link_up) { 947 939 QEDF_INFO(&qedf->dbg_ctx, QEDF_LOG_DISC, 948 940 "Physical link is not up.\n"); 941 + clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags); 949 942 return; 950 943 } 951 944 /* Flush and wait to make sure link down is processed */ ··· 959 950 "Queue link up work.\n"); 960 951 queue_delayed_work(qedf->link_update_wq, &qedf->link_update, 961 952 0); 953 + clear_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags); 962 954 } 963 955 964 956 /* Reset the host by gracefully logging out and then logging back in */ ··· 3473 3463 } 3474 3464 3475 3465 /* Start the Slowpath-process */ 3466 + memset(&slowpath_params, 0, sizeof(struct qed_slowpath_params)); 3476 3467 slowpath_params.int_mode = QED_INT_MODE_MSIX; 3477 3468 slowpath_params.drv_major = QEDF_DRIVER_MAJOR_VER; 3478 3469 slowpath_params.drv_minor = QEDF_DRIVER_MINOR_VER; ··· 3732 3721 { 3733 3722 struct qedf_ctx *qedf; 3734 3723 int rc; 3724 + int cnt = 0; 3735 3725 3736 3726 if (!pdev) { 3737 3727 QEDF_ERR(NULL, "pdev is NULL.\n"); ··· 3748 3736 if (test_bit(QEDF_UNLOADING, &qedf->flags)) { 3749 3737 QEDF_ERR(&qedf->dbg_ctx, "Already removing PCI function.\n"); 3750 3738 return; 3739 + } 3740 + 3741 + stag_in_prog: 3742 + if (test_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags)) { 3743 + QEDF_ERR(&qedf->dbg_ctx, "Stag in progress, cnt=%d.\n", cnt); 3744 + cnt++; 3745 + 3746 + if (cnt < 5) { 3747 + msleep(500); 3748 + goto stag_in_prog; 3749 + } 3751 3750 } 3752 3751 3753 3752 if (mode != QEDF_MODE_RECOVERY) ··· 4019 3996 { 4020 3997 struct qedf_ctx *qedf = 4021 3998 container_of(work, struct qedf_ctx, stag_work.work); 3999 + 4000 + if (!qedf) { 4001 + QEDF_ERR(&qedf->dbg_ctx, "qedf is NULL"); 4002 + return; 4003 + } 4004 + 4005 + if (test_bit(QEDF_IN_RECOVERY, &qedf->flags)) { 4006 + QEDF_ERR(&qedf->dbg_ctx, 4007 + "Already is in recovery, hence not calling software context reset.\n"); 4008 + return; 4009 + } 4010 + 4011 + if (test_bit(QEDF_UNLOADING, &qedf->flags)) { 4012 + QEDF_ERR(&qedf->dbg_ctx, "Driver unloading\n"); 4013 + return; 4014 + } 4015 + 4016 + set_bit(QEDF_STAG_IN_PROGRESS, &qedf->flags); 4022 4017 4023 4018 printk_ratelimited("[%s]:[%s:%d]:%d: Performing software context reset.", 4024 4019 dev_name(&qedf->pdev->dev), __func__, __LINE__,
+7
drivers/scsi/scsi.c
··· 350 350 if (result < SCSI_VPD_HEADER_SIZE) 351 351 return 0; 352 352 353 + if (result > sizeof(vpd)) { 354 + dev_warn_once(&sdev->sdev_gendev, 355 + "%s: long VPD page 0 length: %d bytes\n", 356 + __func__, result); 357 + result = sizeof(vpd); 358 + } 359 + 353 360 result -= SCSI_VPD_HEADER_SIZE; 354 361 if (!memchr(&vpd[SCSI_VPD_HEADER_SIZE], page, result)) 355 362 return 0;
+1 -1
drivers/scsi/sr.h
··· 65 65 int sr_get_last_session(struct cdrom_device_info *, struct cdrom_multisession *); 66 66 int sr_get_mcn(struct cdrom_device_info *, struct cdrom_mcn *); 67 67 int sr_reset(struct cdrom_device_info *); 68 - int sr_select_speed(struct cdrom_device_info *cdi, int speed); 68 + int sr_select_speed(struct cdrom_device_info *cdi, unsigned long speed); 69 69 int sr_audio_ioctl(struct cdrom_device_info *, unsigned int, void *); 70 70 71 71 int sr_is_xa(Scsi_CD *);
+4 -1
drivers/scsi/sr_ioctl.c
··· 425 425 return 0; 426 426 } 427 427 428 - int sr_select_speed(struct cdrom_device_info *cdi, int speed) 428 + int sr_select_speed(struct cdrom_device_info *cdi, unsigned long speed) 429 429 { 430 430 Scsi_CD *cd = cdi->handle; 431 431 struct packet_command cgc; 432 + 433 + /* avoid exceeding the max speed or overflowing integer bounds */ 434 + speed = clamp(0, speed, 0xffff / 177); 432 435 433 436 if (speed == 0) 434 437 speed = 0xffff; /* set to max */
+1 -1
include/linux/cdrom.h
··· 77 77 unsigned int clearing, int slot); 78 78 int (*tray_move) (struct cdrom_device_info *, int); 79 79 int (*lock_door) (struct cdrom_device_info *, int); 80 - int (*select_speed) (struct cdrom_device_info *, int); 80 + int (*select_speed) (struct cdrom_device_info *, unsigned long); 81 81 int (*get_last_session) (struct cdrom_device_info *, 82 82 struct cdrom_multisession *); 83 83 int (*get_mcn) (struct cdrom_device_info *,