diff options
Diffstat (limited to 'drivers/ata/libata-scsi.c')
-rw-r--r-- | drivers/ata/libata-scsi.c | 21 |
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 | ||
1789 | static 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"); |