diff options
| author | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-01-31 18:05:48 -0500 |
|---|---|---|
| committer | Nicholas Bellinger <nab@linux-iscsi.org> | 2013-01-31 18:22:53 -0500 |
| commit | 7a3cf6ca1ab2a2f7161c6dec5a787fc7a5de864e (patch) | |
| tree | 3d902302f0b9f4b9e76bd8230f88bcd9d8eea686 | |
| parent | faa06ab9aed22f0ad0e15bbf3f80463b5dd7cbe0 (diff) | |
target: Fix divide by zero bug in fabric_max_sectors for unconfigured devices
This patch fixes a possible divide by zero bug when the fabric_max_sectors
device attribute is written and backend se_device failed to be successfully
configured -> enabled.
Go ahead and use block_size=512 within se_dev_set_fabric_max_sectors()
in the event of a target_configure_device() failure case, as no valid
dev->dev_attrib.block_size value will have been setup yet.
Cc: stable@vger.kernel.org
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
| -rw-r--r-- | drivers/target/target_core_device.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c index e2695101bb99..f2aa7543d20a 100644 --- a/drivers/target/target_core_device.c +++ b/drivers/target/target_core_device.c | |||
| @@ -941,6 +941,8 @@ int se_dev_set_queue_depth(struct se_device *dev, u32 queue_depth) | |||
| 941 | 941 | ||
| 942 | int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) | 942 | int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) |
| 943 | { | 943 | { |
| 944 | int block_size = dev->dev_attrib.block_size; | ||
| 945 | |||
| 944 | if (dev->export_count) { | 946 | if (dev->export_count) { |
| 945 | pr_err("dev[%p]: Unable to change SE Device" | 947 | pr_err("dev[%p]: Unable to change SE Device" |
| 946 | " fabric_max_sectors while export_count is %d\n", | 948 | " fabric_max_sectors while export_count is %d\n", |
| @@ -978,8 +980,12 @@ int se_dev_set_fabric_max_sectors(struct se_device *dev, u32 fabric_max_sectors) | |||
| 978 | /* | 980 | /* |
| 979 | * Align max_sectors down to PAGE_SIZE to follow transport_allocate_data_tasks() | 981 | * Align max_sectors down to PAGE_SIZE to follow transport_allocate_data_tasks() |
| 980 | */ | 982 | */ |
| 983 | if (!block_size) { | ||
| 984 | block_size = 512; | ||
| 985 | pr_warn("Defaulting to 512 for zero block_size\n"); | ||
| 986 | } | ||
| 981 | fabric_max_sectors = se_dev_align_max_sectors(fabric_max_sectors, | 987 | fabric_max_sectors = se_dev_align_max_sectors(fabric_max_sectors, |
| 982 | dev->dev_attrib.block_size); | 988 | block_size); |
| 983 | 989 | ||
| 984 | dev->dev_attrib.fabric_max_sectors = fabric_max_sectors; | 990 | dev->dev_attrib.fabric_max_sectors = fabric_max_sectors; |
| 985 | pr_debug("dev[%p]: SE Device max_sectors changed to %u\n", | 991 | pr_debug("dev[%p]: SE Device max_sectors changed to %u\n", |
