Commit 592be758 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'libata-5.8-2020-06-19' of git://git.kernel.dk/linux-block

Pull libata fixes from Jens Axboe:
 "A few minor changes that should go into this release"

* tag 'libata-5.8-2020-06-19' of git://git.kernel.dk/linux-block:
  libata: Use per port sync for detach
  ata/libata: Fix usage of page address by page_address in ata_scsi_mode_select_xlat function
  sata_rcar: handle pm_runtime_get_sync failure cases
parents 62c91ead b5292111
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/async.h>
#include <linux/log2.h> #include <linux/log2.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/glob.h> #include <linux/glob.h>
...@@ -5778,7 +5777,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht) ...@@ -5778,7 +5777,7 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
/* perform each probe asynchronously */ /* perform each probe asynchronously */
for (i = 0; i < host->n_ports; i++) { for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i]; struct ata_port *ap = host->ports[i];
async_schedule(async_port_probe, ap); ap->cookie = async_schedule(async_port_probe, ap);
} }
return 0; return 0;
...@@ -5920,11 +5919,11 @@ void ata_host_detach(struct ata_host *host) ...@@ -5920,11 +5919,11 @@ void ata_host_detach(struct ata_host *host)
{ {
int i; int i;
for (i = 0; i < host->n_ports; i++) {
/* Ensure ata_port probe has completed */ /* Ensure ata_port probe has completed */
async_synchronize_full(); async_synchronize_cookie(host->ports[i]->cookie + 1);
for (i = 0; i < host->n_ports; i++)
ata_port_detach(host->ports[i]); ata_port_detach(host->ports[i]);
}
/* the host is dead now, dissociate ACPI */ /* the host is dead now, dissociate ACPI */
ata_acpi_dissociate(host); ata_acpi_dissociate(host);
......
...@@ -3684,12 +3684,13 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc) ...@@ -3684,12 +3684,13 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc)
{ {
struct scsi_cmnd *scmd = qc->scsicmd; struct scsi_cmnd *scmd = qc->scsicmd;
const u8 *cdb = scmd->cmnd; const u8 *cdb = scmd->cmnd;
const u8 *p;
u8 pg, spg; u8 pg, spg;
unsigned six_byte, pg_len, hdr_len, bd_len; unsigned six_byte, pg_len, hdr_len, bd_len;
int len; int len;
u16 fp = (u16)-1; u16 fp = (u16)-1;
u8 bp = 0xff; u8 bp = 0xff;
u8 buffer[64];
const u8 *p = buffer;
VPRINTK("ENTER\n"); VPRINTK("ENTER\n");
...@@ -3723,12 +3724,14 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc) ...@@ -3723,12 +3724,14 @@ static unsigned int ata_scsi_mode_select_xlat(struct ata_queued_cmd *qc)
if (!scsi_sg_count(scmd) || scsi_sglist(scmd)->length < len) if (!scsi_sg_count(scmd) || scsi_sglist(scmd)->length < len)
goto invalid_param_len; goto invalid_param_len;
p = page_address(sg_page(scsi_sglist(scmd)));
/* Move past header and block descriptors. */ /* Move past header and block descriptors. */
if (len < hdr_len) if (len < hdr_len)
goto invalid_param_len; goto invalid_param_len;
if (!sg_copy_to_buffer(scsi_sglist(scmd), scsi_sg_count(scmd),
buffer, sizeof(buffer)))
goto invalid_param_len;
if (six_byte) if (six_byte)
bd_len = p[3]; bd_len = p[3];
else else
......
...@@ -907,7 +907,7 @@ static int sata_rcar_probe(struct platform_device *pdev) ...@@ -907,7 +907,7 @@ static int sata_rcar_probe(struct platform_device *pdev)
pm_runtime_enable(dev); pm_runtime_enable(dev);
ret = pm_runtime_get_sync(dev); ret = pm_runtime_get_sync(dev);
if (ret < 0) if (ret < 0)
goto err_pm_disable; goto err_pm_put;
host = ata_host_alloc(dev, 1); host = ata_host_alloc(dev, 1);
if (!host) { if (!host) {
...@@ -937,7 +937,6 @@ static int sata_rcar_probe(struct platform_device *pdev) ...@@ -937,7 +937,6 @@ static int sata_rcar_probe(struct platform_device *pdev)
err_pm_put: err_pm_put:
pm_runtime_put(dev); pm_runtime_put(dev);
err_pm_disable:
pm_runtime_disable(dev); pm_runtime_disable(dev);
return ret; return ret;
} }
...@@ -991,8 +990,10 @@ static int sata_rcar_resume(struct device *dev) ...@@ -991,8 +990,10 @@ static int sata_rcar_resume(struct device *dev)
int ret; int ret;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_get_sync(dev);
if (ret < 0) if (ret < 0) {
pm_runtime_put(dev);
return ret; return ret;
}
if (priv->type == RCAR_GEN3_SATA) { if (priv->type == RCAR_GEN3_SATA) {
sata_rcar_init_module(priv); sata_rcar_init_module(priv);
...@@ -1017,8 +1018,10 @@ static int sata_rcar_restore(struct device *dev) ...@@ -1017,8 +1018,10 @@ static int sata_rcar_restore(struct device *dev)
int ret; int ret;
ret = pm_runtime_get_sync(dev); ret = pm_runtime_get_sync(dev);
if (ret < 0) if (ret < 0) {
pm_runtime_put(dev);
return ret; return ret;
}
sata_rcar_setup_port(host); sata_rcar_setup_port(host);
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/acpi.h> #include <linux/acpi.h>
#include <linux/cdrom.h> #include <linux/cdrom.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/async.h>
/* /*
* Define if arch has non-standard setup. This is a _PCI_ standard * Define if arch has non-standard setup. This is a _PCI_ standard
...@@ -872,6 +873,8 @@ struct ata_port { ...@@ -872,6 +873,8 @@ struct ata_port {
struct timer_list fastdrain_timer; struct timer_list fastdrain_timer;
unsigned long fastdrain_cnt; unsigned long fastdrain_cnt;
async_cookie_t cookie;
int em_message_type; int em_message_type;
void *private_data; void *private_data;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment