From be8ae807f81999b050a8f11eba39180edaad10e3 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Mon, 7 Aug 2023 09:15:35 +0200 Subject: [PATCH] 4.19-stable patches added patches: libceph-fix-potential-hang-in-ceph_osdc_notify.patch scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch usb-zaurus-add-id-for-a-300-b-500-c-700.patch --- ...x-potential-hang-in-ceph_osdc_notify.patch | 69 +++++++++++ ...-blocking-until-after-adisc-response.patch | 60 ++++++++++ queue-4.19/series | 3 + ...-zaurus-add-id-for-a-300-b-500-c-700.patch | 111 ++++++++++++++++++ 4 files changed, 243 insertions(+) create mode 100644 queue-4.19/libceph-fix-potential-hang-in-ceph_osdc_notify.patch create mode 100644 queue-4.19/scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch create mode 100644 queue-4.19/usb-zaurus-add-id-for-a-300-b-500-c-700.patch diff --git a/queue-4.19/libceph-fix-potential-hang-in-ceph_osdc_notify.patch b/queue-4.19/libceph-fix-potential-hang-in-ceph_osdc_notify.patch new file mode 100644 index 00000000000..884c3678374 --- /dev/null +++ b/queue-4.19/libceph-fix-potential-hang-in-ceph_osdc_notify.patch @@ -0,0 +1,69 @@ +From e6e2843230799230fc5deb8279728a7218b0d63c Mon Sep 17 00:00:00 2001 +From: Ilya Dryomov +Date: Tue, 1 Aug 2023 19:14:24 +0200 +Subject: libceph: fix potential hang in ceph_osdc_notify() + +From: Ilya Dryomov + +commit e6e2843230799230fc5deb8279728a7218b0d63c upstream. + +If the cluster becomes unavailable, ceph_osdc_notify() may hang even +with osd_request_timeout option set because linger_notify_finish_wait() +waits for MWatchNotify NOTIFY_COMPLETE message with no associated OSD +request in flight -- it's completely asynchronous. + +Introduce an additional timeout, derived from the specified notify +timeout. While at it, switch both waits to killable which is more +correct. + +Cc: stable@vger.kernel.org +Signed-off-by: Ilya Dryomov +Reviewed-by: Dongsheng Yang +Reviewed-by: Xiubo Li +Signed-off-by: Greg Kroah-Hartman +--- + net/ceph/osd_client.c | 20 ++++++++++++++------ + 1 file changed, 14 insertions(+), 6 deletions(-) + +--- a/net/ceph/osd_client.c ++++ b/net/ceph/osd_client.c +@@ -3137,17 +3137,24 @@ static int linger_reg_commit_wait(struct + int ret; + + dout("%s lreq %p linger_id %llu\n", __func__, lreq, lreq->linger_id); +- ret = wait_for_completion_interruptible(&lreq->reg_commit_wait); ++ ret = wait_for_completion_killable(&lreq->reg_commit_wait); + return ret ?: lreq->reg_commit_error; + } + +-static int linger_notify_finish_wait(struct ceph_osd_linger_request *lreq) ++static int linger_notify_finish_wait(struct ceph_osd_linger_request *lreq, ++ unsigned long timeout) + { +- int ret; ++ long left; + + dout("%s lreq %p linger_id %llu\n", __func__, lreq, lreq->linger_id); +- ret = wait_for_completion_interruptible(&lreq->notify_finish_wait); +- return ret ?: lreq->notify_finish_error; ++ left = wait_for_completion_killable_timeout(&lreq->notify_finish_wait, ++ ceph_timeout_jiffies(timeout)); ++ if (left <= 0) ++ left = left ?: -ETIMEDOUT; ++ else ++ left = lreq->notify_finish_error; /* completed */ ++ ++ return left; + } + + /* +@@ -4760,7 +4767,8 @@ int ceph_osdc_notify(struct ceph_osd_cli + + ret = linger_reg_commit_wait(lreq); + if (!ret) +- ret = linger_notify_finish_wait(lreq); ++ ret = linger_notify_finish_wait(lreq, ++ msecs_to_jiffies(2 * timeout * MSEC_PER_SEC)); + else + dout("lreq %p failed to initiate notify %d\n", lreq, ret); + diff --git a/queue-4.19/scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch b/queue-4.19/scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch new file mode 100644 index 00000000000..ef46422244a --- /dev/null +++ b/queue-4.19/scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch @@ -0,0 +1,60 @@ +From e65851989001c0c9ba9177564b13b38201c0854c Mon Sep 17 00:00:00 2001 +From: Steffen Maier +Date: Mon, 24 Jul 2023 16:51:56 +0200 +Subject: scsi: zfcp: Defer fc_rport blocking until after ADISC response + +From: Steffen Maier + +commit e65851989001c0c9ba9177564b13b38201c0854c upstream. + +Storage devices are free to send RSCNs, e.g. for internal state changes. If +this happens on all connected paths, zfcp risks temporarily losing all +paths at the same time. This has strong requirements on multipath +configuration such as "no_path_retry queue". + +Avoid such situations by deferring fc_rport blocking until after the ADISC +response, when any actual state change of the remote port became clear. +The already existing port recovery triggers explicitly block the fc_rport. +The triggers are: on ADISC reject or timeout (typical cable pull case), and +on ADISC indicating that the remote port has changed its WWPN or +the port is meanwhile no longer open. + +As a side effect, this also removes a confusing direct function call to +another work item function zfcp_scsi_rport_work() instead of scheduling +that other work item. It was probably done that way to have the rport block +side effect immediate and synchronous to the caller. + +Fixes: a2fa0aede07c ("[SCSI] zfcp: Block FC transport rports early on errors") +Cc: stable@vger.kernel.org #v2.6.30+ +Reviewed-by: Benjamin Block +Reviewed-by: Fedor Loshakov +Signed-off-by: Steffen Maier +Link: https://lore.kernel.org/r/20230724145156.3920244-1-maier@linux.ibm.com +Signed-off-by: Martin K. Petersen +Signed-off-by: Greg Kroah-Hartman +--- + drivers/s390/scsi/zfcp_fc.c | 6 +----- + 1 file changed, 1 insertion(+), 5 deletions(-) + +--- a/drivers/s390/scsi/zfcp_fc.c ++++ b/drivers/s390/scsi/zfcp_fc.c +@@ -534,8 +534,7 @@ static void zfcp_fc_adisc_handler(void * + + /* re-init to undo drop from zfcp_fc_adisc() */ + port->d_id = ntoh24(adisc_resp->adisc_port_id); +- /* port is good, unblock rport without going through erp */ +- zfcp_scsi_schedule_rport_register(port); ++ /* port is still good, nothing to do */ + out: + atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status); + put_device(&port->dev); +@@ -595,9 +594,6 @@ void zfcp_fc_link_test_work(struct work_ + int retval; + + set_worker_desc("zadisc%16llx", port->wwpn); /* < WORKER_DESC_LEN=24 */ +- get_device(&port->dev); +- port->rport_task = RPORT_DEL; +- zfcp_scsi_rport_work(&port->rport_work); + + /* only issue one test command at one time per port */ + if (atomic_read(&port->status) & ZFCP_STATUS_PORT_LINK_TEST) diff --git a/queue-4.19/series b/queue-4.19/series index 7fc6dcc2841..21e1516824a 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -302,3 +302,6 @@ tcp_metrics-annotate-data-races-around-tm-tcpm_lock.patch tcp_metrics-annotate-data-races-around-tm-tcpm_vals.patch tcp_metrics-annotate-data-races-around-tm-tcpm_net.patch tcp_metrics-fix-data-race-in-tcpm_suck_dst-vs-fastop.patch +scsi-zfcp-defer-fc_rport-blocking-until-after-adisc-response.patch +libceph-fix-potential-hang-in-ceph_osdc_notify.patch +usb-zaurus-add-id-for-a-300-b-500-c-700.patch diff --git a/queue-4.19/usb-zaurus-add-id-for-a-300-b-500-c-700.patch b/queue-4.19/usb-zaurus-add-id-for-a-300-b-500-c-700.patch new file mode 100644 index 00000000000..b779c70de1d --- /dev/null +++ b/queue-4.19/usb-zaurus-add-id-for-a-300-b-500-c-700.patch @@ -0,0 +1,111 @@ +From b99225b4fe297d07400f9e2332ecd7347b224f8d Mon Sep 17 00:00:00 2001 +From: Ross Maynard +Date: Mon, 31 Jul 2023 15:42:04 +1000 +Subject: USB: zaurus: Add ID for A-300/B-500/C-700 + +From: Ross Maynard + +commit b99225b4fe297d07400f9e2332ecd7347b224f8d upstream. + +The SL-A300, B500/5600, and C700 devices no longer auto-load because of +"usbnet: Remove over-broad module alias from zaurus." +This patch adds IDs for those 3 devices. + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=217632 +Fixes: 16adf5d07987 ("usbnet: Remove over-broad module alias from zaurus.") +Signed-off-by: Ross Maynard +Cc: stable@vger.kernel.org +Acked-by: Greg Kroah-Hartman +Reviewed-by: Andrew Lunn +Link: https://lore.kernel.org/r/69b5423b-2013-9fc9-9569-58e707d9bafb@bigpond.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Greg Kroah-Hartman +--- + drivers/net/usb/cdc_ether.c | 21 +++++++++++++++++++++ + drivers/net/usb/zaurus.c | 21 +++++++++++++++++++++ + 2 files changed, 42 insertions(+) + +--- a/drivers/net/usb/cdc_ether.c ++++ b/drivers/net/usb/cdc_ether.c +@@ -618,6 +618,13 @@ static const struct usb_device_id produc + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, ++ .idProduct = 0x8005, /* A-300 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = 0, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, + .idProduct = 0x8006, /* B-500/SL-5600 */ + ZAURUS_MASTER_INTERFACE, + .driver_info = 0, +@@ -625,11 +632,25 @@ static const struct usb_device_id produc + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, ++ .idProduct = 0x8006, /* B-500/SL-5600 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = 0, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, + .idProduct = 0x8007, /* C-700 */ + ZAURUS_MASTER_INTERFACE, + .driver_info = 0, + }, { + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, ++ .idProduct = 0x8007, /* C-700 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = 0, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x9031, /* C-750 C-760 */ +--- a/drivers/net/usb/zaurus.c ++++ b/drivers/net/usb/zaurus.c +@@ -301,11 +301,25 @@ static const struct usb_device_id produc + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, ++ .idProduct = 0x8005, /* A-300 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = (unsigned long)&bogus_mdlm_info, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, + .idProduct = 0x8006, /* B-500/SL-5600 */ + ZAURUS_MASTER_INTERFACE, + .driver_info = ZAURUS_PXA_INFO, + }, { + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, ++ .idProduct = 0x8006, /* B-500/SL-5600 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = (unsigned long)&bogus_mdlm_info, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x8007, /* C-700 */ +@@ -313,6 +327,13 @@ static const struct usb_device_id produc + .driver_info = ZAURUS_PXA_INFO, + }, { + .match_flags = USB_DEVICE_ID_MATCH_INT_INFO ++ | USB_DEVICE_ID_MATCH_DEVICE, ++ .idVendor = 0x04DD, ++ .idProduct = 0x8007, /* C-700 */ ++ ZAURUS_FAKE_INTERFACE, ++ .driver_info = (unsigned long)&bogus_mdlm_info, ++}, { ++ .match_flags = USB_DEVICE_ID_MATCH_INT_INFO + | USB_DEVICE_ID_MATCH_DEVICE, + .idVendor = 0x04DD, + .idProduct = 0x9031, /* C-750 C-760 */ -- 2.47.3