summaryrefslogtreecommitdiff
path: root/include/scsi
diff options
context:
space:
mode:
authorBoaz Harrosh <bharrosh@panasas.com>2013-11-21 17:58:08 +0200
committerBoaz Harrosh <bharrosh@panasas.com>2014-01-23 10:55:03 +0200
commitaad560b7f63b495f48a7232fd086c5913a676e6f (patch)
tree8287f6fac8cb1cb5d74b090fafe8a8f4531e5fdd /include/scsi
parent5e01dc7b26d9f24f39abace5da98ccbd6a5ceb52 (diff)
downloadrenesas_kernel-aad560b7f63b495f48a7232fd086c5913a676e6f.tar.gz
renesas_kernel-aad560b7f63b495f48a7232fd086c5913a676e6f.tar.bz2
renesas_kernel-aad560b7f63b495f48a7232fd086c5913a676e6f.zip
ore: Fix wrong math in allocation of per device BIO
At IO preparation we calculate the max pages at each device and allocate a BIO per device of that size. The calculation was wrong on some unaligned corner cases offset/length combination and would make prepare return with -ENOMEM. This would be bad for pnfs-objects that would in that case IO through MDS. And fatal for exofs were it would fail writes with EIO. Fix it by doing the proper math, that will work in all cases. (I ran a test with all possible offset/length combinations this time round). Also when reading we do not need to allocate for the parity units since we jump over them. Also lower the max_io_length to take into account the parity pages so not to allocate BIOs bigger than PAGE_SIZE CC: Stable Kernel <stable@vger.kernel.org> Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Diffstat (limited to 'include/scsi')
-rw-r--r--include/scsi/osd_ore.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/scsi/osd_ore.h b/include/scsi/osd_ore.h
index a5f9b960dfc..6ca3265a4dc 100644
--- a/include/scsi/osd_ore.h
+++ b/include/scsi/osd_ore.h
@@ -102,6 +102,7 @@ struct ore_striping_info {
unsigned unit_off;
unsigned cur_pg;
unsigned cur_comp;
+ unsigned maxdevUnits;
};
struct ore_io_state;