FAILED: patch "[PATCH] scsi: libsas: Fix disk not being scanned in after being" failed to apply to 4.19-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.19-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-4.19.y
git checkout FETCH_HEAD
git cherry-pick -x 8e68a458bcf5b5cb9c3624598bae28f08251601f
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2024040152-bobtail-animate-4d38@gregkh' --subject-prefix 'PATCH 4.19.y' HEAD^..
Possible dependencies:
8e68a458bcf5 ("scsi: libsas: Fix disk not being scanned in after being removed") d8649fc1c5e4 ("scsi: libsas: Do discovery on empty PHY to update PHY info") 7b27c5fe247b ("scsi: libsas: Stop hardcoding SAS address length") 15ba7806c316 ("scsi: libsas: Drop SAS_DPRINTK() and revise logs levels") 71a4a9923122 ("scsi: libsas: Drop sas_printk()")d188e5db9d27 ("scsi: libsas: Use pr_fmt(fmt)")32c850bf587f ("scsi: libsas: always unregister the old device if going to discover new")
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 8e68a458bcf5b5cb9c3624598bae28f08251601f Mon Sep 17 00:00:00 2001
From: Xingui Yang <[email protected]>
Date: Thu, 7 Mar 2024 14:14:13 +0000
Subject: [PATCH] scsi: libsas: Fix disk not being scanned in after being
removed
As of commit d8649fc1c5e4 ("scsi: libsas: Do discovery on empty PHY to update PHY info"), do discovery will send a new SMP_DISCOVER and update phy->phy_change_count. We found that if the disk is reconnected and phy change_count changes at this time, the disk scanning process will not be triggered.
Therefore, call sas_set_ex_phy() to update the PHY info with the results of the last query. And because the previous phy info will be used when calling sas_unregister_devs_sas_addr(), sas_unregister_devs_sas_addr() should be called before sas_set_ex_phy().
drivers/scsi/libsas/sas_expander.c +22 -10
@@ -1945,6 +1945,7 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id,struct expander_device *ex = &dev->ex_dev;struct ex_phy *phy = &ex->ex_phy[phy_id];enum sas_device_type type =SAS_PHY_UNUSED ; +struct smp_disc_resp *disc_resp;u8 sas_addr[SAS_ADDR_SIZE ];char msg[80 ] ="" ;int res;
@@ -1956,33 +1957,41 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, SAS_ADDR(dev->sas_addr), phy_id, msg);memset (sas_addr,0 ,SAS_ADDR_SIZE ); - res =sas_get_phy_attached_dev (dev, phy_id, sas_addr, &type); + disc_resp =alloc_smp_resp (DISCOVER_RESP_SIZE ); +if (!disc_resp) +return -ENOMEM ; + + res =sas_get_phy_discover (dev, phy_id, disc_resp);switch (res) {case SMP_RESP_NO_PHY : phy->phy_state =PHY_NOT_PRESENT ;sas_unregister_devs_sas_addr (dev, phy_id, last); -return res; + goto out_free_resp;case SMP_RESP_PHY_VACANT : phy->phy_state =PHY_VACANT ;sas_unregister_devs_sas_addr (dev, phy_id, last); -return res; + goto out_free_resp;case SMP_RESP_FUNC_ACC :break ;case -ECOMM :break ;default : -return res; + goto out_free_resp; } +if (res ==0 ) +sas_get_sas_addr_and_dev_type (disc_resp, sas_addr, &type); +if ((SAS_ADDR (sas_addr) ==0 ) || (res == -ECOMM )) { phy->phy_state =PHY_EMPTY ;sas_unregister_devs_sas_addr (dev, phy_id, last);/* -* Even though the PHY is empty, for convenience we discover -* the PHY to update the PHY info, like negotiated linkrate. +* Even though the PHY is empty, for convenience we update +* the PHY info, like negotiated linkrate. */ -sas_ex_phy_discover (dev, phy_id); -return res; +if (res ==0 ) +sas_set_ex_phy (dev, phy_id, disc_resp); + goto out_free_resp; }else if (SAS_ADDR (sas_addr) ==SAS_ADDR (phy->attached_sas_addr) &&dev_type_flutter (type, phy->attached_dev_type)) {struct domain_device *ata_dev =sas_ex_to_ata (dev, phy_id);
@@ -1994,7 +2003,7 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, action =", needs recovery" ;pr_debug ("ex %016llx phy%02d broadcast flutter%s\n" ,SAS_ADDR (dev->sas_addr), phy_id, action); -return res; + goto out_free_resp; }/* we always have to delete the old device when we went here */
@@ -2003,7 +2012,10 @@ static int sas_rediscover_dev(struct domain_device *dev, int phy_id, SAS_ADDR(phy->attached_sas_addr));sas_unregister_devs_sas_addr (dev, phy_id, last); -return sas_discover_new (dev, phy_id); + res =sas_discover_new (dev, phy_id); +out_free_resp: +kfree (disc_resp); +return res; }/**