Commit c1529fa25e20f4c5d92d82165a8ff5fe27eae974

Authored by adam radford
Committed by James Bottomley
1 parent 5738f99643

[SCSI] megaraid_sas: Add fpRead/WriteCapable, fpRead/WriteAcrossStripe checks

The following patch for megaraid_sas fixes the fastpath code decision
logic to use fpRead/WriteCapable, fpRead/WriteAcrossStripe flags
instead of the old logic.  This fixes a bug where fastpath writes
could be sent to a read only LD.

Signed-off-by: Adam Radford <aradford@gmail.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

Showing 1 changed file with 13 additions and 8 deletions Side-by-side Diff

drivers/scsi/megaraid/megaraid_sas_fp.c
... ... @@ -362,15 +362,20 @@
362 362 /* assume this IO needs the full row - we'll adjust if not true */
363 363 regSize = stripSize;
364 364  
365   - /* If IO spans more than 1 strip, fp is not possible
366   - FP is not possible for writes on non-0 raid levels
367   - FP is not possible if LD is not capable */
368   - if (num_strips > 1 || (!isRead && raid->level != 0) ||
369   - !raid->capability.fpCapable) {
  365 + /* Check if we can send this I/O via FastPath */
  366 + if (raid->capability.fpCapable) {
  367 + if (isRead)
  368 + io_info->fpOkForIo = (raid->capability.fpReadCapable &&
  369 + ((num_strips == 1) ||
  370 + raid->capability.
  371 + fpReadAcrossStripe));
  372 + else
  373 + io_info->fpOkForIo = (raid->capability.fpWriteCapable &&
  374 + ((num_strips == 1) ||
  375 + raid->capability.
  376 + fpWriteAcrossStripe));
  377 + } else
370 378 io_info->fpOkForIo = FALSE;
371   - } else {
372   - io_info->fpOkForIo = TRUE;
373   - }
374 379  
375 380 if (numRows == 1) {
376 381 /* single-strip IOs can always lock only the data needed */