summaryrefslogtreecommitdiffstats
path: root/drivers/ata/libata-scsi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/libata-scsi.c')
-rw-r--r--drivers/ata/libata-scsi.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c
index 391ac0503dc0..76d0f9de767b 100644
--- a/drivers/ata/libata-scsi.c
+++ b/drivers/ata/libata-scsi.c
@@ -1786,6 +1786,21 @@ nothing_to_do:
1786 return 1; 1786 return 1;
1787} 1787}
1788 1788
1789static bool ata_check_nblocks(struct scsi_cmnd *scmd, u32 n_blocks)
1790{
1791 struct request *rq = scmd->request;
1792 u32 req_blocks;
1793
1794 if (!blk_rq_is_passthrough(rq))
1795 return true;
1796
1797 req_blocks = blk_rq_bytes(rq) / scmd->device->sector_size;
1798 if (n_blocks > req_blocks)
1799 return false;
1800
1801 return true;
1802}
1803
1789/** 1804/**
1790 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one 1805 * ata_scsi_rw_xlat - Translate SCSI r/w command into an ATA one
1791 * @qc: Storage for translated ATA taskfile 1806 * @qc: Storage for translated ATA taskfile
@@ -1830,6 +1845,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
1830 scsi_10_lba_len(cdb, &block, &n_block); 1845 scsi_10_lba_len(cdb, &block, &n_block);
1831 if (cdb[1] & (1 << 3)) 1846 if (cdb[1] & (1 << 3))
1832 tf_flags |= ATA_TFLAG_FUA; 1847 tf_flags |= ATA_TFLAG_FUA;
1848 if (!ata_check_nblocks(scmd, n_block))
1849 goto invalid_fld;
1833 break; 1850 break;
1834 case READ_6: 1851 case READ_6:
1835 case WRITE_6: 1852 case WRITE_6:
@@ -1844,6 +1861,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
1844 */ 1861 */
1845 if (!n_block) 1862 if (!n_block)
1846 n_block = 256; 1863 n_block = 256;
1864 if (!ata_check_nblocks(scmd, n_block))
1865 goto invalid_fld;
1847 break; 1866 break;
1848 case READ_16: 1867 case READ_16:
1849 case WRITE_16: 1868 case WRITE_16:
@@ -1854,6 +1873,8 @@ static unsigned int ata_scsi_rw_xlat(struct ata_queued_cmd *qc)
1854 scsi_16_lba_len(cdb, &block, &n_block); 1873 scsi_16_lba_len(cdb, &block, &n_block);
1855 if (cdb[1] & (1 << 3)) 1874 if (cdb[1] & (1 << 3))
1856 tf_flags |= ATA_TFLAG_FUA; 1875 tf_flags |= ATA_TFLAG_FUA;
1876 if (!ata_check_nblocks(scmd, n_block))
1877 goto invalid_fld;
1857 break; 1878 break;
1858 default: 1879 default:
1859 DPRINTK("no-byte command\n"); 1880 DPRINTK("no-byte command\n");