ore: Fix wrong math in allocation of per device BIO
authorBoaz Harrosh <bharrosh@panasas.com>
Thu, 21 Nov 2013 15:58:08 +0000 (17:58 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Feb 2014 21:50:14 +0000 (13:50 -0800)
commitf149f695629d395117d3de473b05fe71937491af
tree6c2b281caebac737b86cfad22cccacd3c57e7d5a
parent9af6a8e68fd7c2469cfe50d1c982a8b8194259e8
ore: Fix wrong math in allocation of per device BIO

commit aad560b7f63b495f48a7232fd086c5913a676e6f upstream.

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

Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
fs/exofs/ore.c
include/scsi/osd_ore.h