[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <1404149467-17856-1-git-send-email-cascardo@linux.vnet.ibm.com>
Date: Mon, 30 Jun 2014 14:31:07 -0300
From: Thadeu Lima de Souza Cascardo <cascardo@...ux.vnet.ibm.com>
To: pjk1939@...ux.vnet.ibm.com
Cc: josh.h.morris@...ibm.com, linux-kernel@...r.kernel.org,
axboe@...nel.dk,
Thadeu Lima de Souza Cascardo <cascardo@...ux.vnet.ibm.com>,
stable@...r.kernel.org
Subject: [PATCH] rsxx: fix discard with length smaller than hw blksize
When the discard length is not a multiple of RSXX_HW_BLK_SIZE, the
discard code will get into an infinite loop, even discarding data it is
not supposed to. This will also hang the system.
This can be reproduced by doing an ioctl BLKDISCARD to /dev/rsxx0 with
range from 0 to 1024.
Signed-off-by: Thadeu Lima de Souza Cascardo <cascardo@...ux.vnet.ibm.com>
Cc: stable@...r.kernel.org
---
drivers/block/rsxx/dma.c | 4 +++-
1 files changed, 3 insertions(+), 1 deletions(-)
diff --git a/drivers/block/rsxx/dma.c b/drivers/block/rsxx/dma.c
index cf8cd29..d105a4a 100644
--- a/drivers/block/rsxx/dma.c
+++ b/drivers/block/rsxx/dma.c
@@ -708,7 +708,9 @@ int rsxx_dma_queue_bio(struct rsxx_cardinfo *card,
if (bio->bi_rw & REQ_DISCARD) {
bv_len = bio->bi_iter.bi_size;
- while (bv_len > 0) {
+ if (bv_len < RSXX_HW_BLK_SIZE)
+ bio_endio(bio, 0);
+ while (bv_len >= RSXX_HW_BLK_SIZE) {
tgt = rsxx_get_dma_tgt(card, addr8);
laddr = rsxx_addr8_to_laddr(addr8, card);
--
1.7.1
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists