diff mbox series

[v2] ata: libata-scsi: fix SYNCHRONIZE CACHE (16) command failure

Message ID 20221107040229.1548793-1-shinichiro.kawasaki@wdc.com
State New
Headers show
Series [v2] ata: libata-scsi: fix SYNCHRONIZE CACHE (16) command failure | expand

Commit Message

Shinichiro Kawasaki Nov. 7, 2022, 4:02 a.m. UTC
SAT SCSI/ATA Translation specification requires SCSI SYNCHRONIZE CACHE
(10) and (16) commands both shall be translated to ATA flush command.
Also, ZBC Zoned Block Commands specification mandates SYNCHRONIZE CACHE
(16) command support. However, libata translates only SYNCHRONIZE CACHE
(10). This results in SYNCHRONIZE CACHE (16) command failures on SATA
drives and then libata translation does not conform to ZBC. To avoid the
failure, add support for SYNCHRONIZE CACHE (16).

Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Cc: stable@vger.kernel.org
---
Changes from v1:
* Improved commit message per comments on the list

 drivers/ata/libata-scsi.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Christoph Hellwig Nov. 7, 2022, 9:21 a.m. UTC | #1
Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
Martin K. Petersen Nov. 7, 2022, 2:17 p.m. UTC | #2
Shin'ichiro,

> SAT SCSI/ATA Translation specification requires SCSI SYNCHRONIZE CACHE
> (10) and (16) commands both shall be translated to ATA flush command.
> Also, ZBC Zoned Block Commands specification mandates SYNCHRONIZE
> CACHE (16) command support. However, libata translates only
> SYNCHRONIZE CACHE (10). This results in SYNCHRONIZE CACHE (16) command
> failures on SATA drives and then libata translation does not conform
> to ZBC. To avoid the failure, add support for SYNCHRONIZE CACHE (16).

Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Damien Le Moal Nov. 8, 2022, 6:11 a.m. UTC | #3
On 11/7/22 13:02, Shin'ichiro Kawasaki wrote:
> SAT SCSI/ATA Translation specification requires SCSI SYNCHRONIZE CACHE
> (10) and (16) commands both shall be translated to ATA flush command.
> Also, ZBC Zoned Block Commands specification mandates SYNCHRONIZE CACHE
> (16) command support. However, libata translates only SYNCHRONIZE CACHE
> (10). This results in SYNCHRONIZE CACHE (16) command failures on SATA
> drives and then libata translation does not conform to ZBC. To avoid the
> failure, add support for SYNCHRONIZE CACHE (16).
> 
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
> Cc: stable@vger.kernel.org

Applied to for-6.1-fixes. Thanks !

> ---
> Changes from v1:
> * Improved commit message per comments on the list
> 
>  drivers/ata/libata-scsi.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
> index e2ebb0b065e2..61cd4e90e4e7 100644
> --- a/drivers/ata/libata-scsi.c
> +++ b/drivers/ata/libata-scsi.c
> @@ -3264,6 +3264,7 @@ static unsigned int ata_scsiop_maint_in(struct ata_scsi_args *args, u8 *rbuf)
>  	case REPORT_LUNS:
>  	case REQUEST_SENSE:
>  	case SYNCHRONIZE_CACHE:
> +	case SYNCHRONIZE_CACHE_16:
>  	case REZERO_UNIT:
>  	case SEEK_6:
>  	case SEEK_10:
> @@ -3922,6 +3923,7 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
>  		return ata_scsi_write_same_xlat;
>  
>  	case SYNCHRONIZE_CACHE:
> +	case SYNCHRONIZE_CACHE_16:
>  		if (ata_try_flush_cache(dev))
>  			return ata_scsi_flush_xlat;
>  		break;
> @@ -4145,6 +4147,7 @@ void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
>  	 * turning this into a no-op.
>  	 */
>  	case SYNCHRONIZE_CACHE:
> +	case SYNCHRONIZE_CACHE_16:
>  		fallthrough;
>  
>  	/* no-op's, complete with success */
diff mbox series

Patch

diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index e2ebb0b065e2..61cd4e90e4e7 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -3264,6 +3264,7 @@  static unsigned int ata_scsiop_maint_in(struct ata_scsi_args *args, u8 *rbuf)
 	case REPORT_LUNS:
 	case REQUEST_SENSE:
 	case SYNCHRONIZE_CACHE:
+	case SYNCHRONIZE_CACHE_16:
 	case REZERO_UNIT:
 	case SEEK_6:
 	case SEEK_10:
@@ -3922,6 +3923,7 @@  static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
 		return ata_scsi_write_same_xlat;
 
 	case SYNCHRONIZE_CACHE:
+	case SYNCHRONIZE_CACHE_16:
 		if (ata_try_flush_cache(dev))
 			return ata_scsi_flush_xlat;
 		break;
@@ -4145,6 +4147,7 @@  void ata_scsi_simulate(struct ata_device *dev, struct scsi_cmnd *cmd)
 	 * turning this into a no-op.
 	 */
 	case SYNCHRONIZE_CACHE:
+	case SYNCHRONIZE_CACHE_16:
 		fallthrough;
 
 	/* no-op's, complete with success */