提交 3e03989b 编写于 作者: R Roland Dreier 提交者: Nicholas Bellinger

target: Avoid integer overflow in se_dev_align_max_sectors()

The expression (max_sectors * block_size) might overflow a u32
(indeed, since iblock sets max_hw_sectors to UINT_MAX, it is
guaranteed to overflow and end up with a much-too-small result in many
common cases).  Fix this by doing an equivalent calculation that
doesn't require multiplication.

While we're touching this code, avoid splitting a printk format across
two lines and use pr_info(...) instead of printk(KERN_INFO ...).
Signed-off-by: NRoland Dreier <roland@purestorage.com>
Cc: stable@vger.kernel.org
Signed-off-by: NNicholas Bellinger <nab@linux-iscsi.org>
上级 0d0f9dfb
...@@ -850,20 +850,20 @@ int se_dev_check_shutdown(struct se_device *dev) ...@@ -850,20 +850,20 @@ int se_dev_check_shutdown(struct se_device *dev)
static u32 se_dev_align_max_sectors(u32 max_sectors, u32 block_size) static u32 se_dev_align_max_sectors(u32 max_sectors, u32 block_size)
{ {
u32 tmp, aligned_max_sectors; u32 aligned_max_sectors;
u32 alignment;
/* /*
* Limit max_sectors to a PAGE_SIZE aligned value for modern * Limit max_sectors to a PAGE_SIZE aligned value for modern
* transport_allocate_data_tasks() operation. * transport_allocate_data_tasks() operation.
*/ */
tmp = rounddown((max_sectors * block_size), PAGE_SIZE); alignment = max(1ul, PAGE_SIZE / block_size);
aligned_max_sectors = (tmp / block_size); aligned_max_sectors = rounddown(max_sectors, alignment);
if (max_sectors != aligned_max_sectors) {
printk(KERN_INFO "Rounding down aligned max_sectors from %u" if (max_sectors != aligned_max_sectors)
" to %u\n", max_sectors, aligned_max_sectors); pr_info("Rounding down aligned max_sectors from %u to %u\n",
return aligned_max_sectors; max_sectors, aligned_max_sectors);
}
return max_sectors; return aligned_max_sectors;
} }
void se_dev_set_default_attribs( void se_dev_set_default_attribs(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册