.. | .. |
---|
1990 | 1990 | |
---|
1991 | 1991 | if (unlikely(rsp->flags & SRP_RSP_FLAG_DIUNDER)) |
---|
1992 | 1992 | scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt)); |
---|
1993 | | - else if (unlikely(rsp->flags & SRP_RSP_FLAG_DIOVER)) |
---|
1994 | | - scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_in_res_cnt)); |
---|
1995 | 1993 | else if (unlikely(rsp->flags & SRP_RSP_FLAG_DOUNDER)) |
---|
1996 | 1994 | scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt)); |
---|
1997 | | - else if (unlikely(rsp->flags & SRP_RSP_FLAG_DOOVER)) |
---|
1998 | | - scsi_set_resid(scmnd, -be32_to_cpu(rsp->data_out_res_cnt)); |
---|
1999 | 1995 | |
---|
2000 | 1996 | srp_free_req(ch, req, scmnd, |
---|
2001 | 1997 | be32_to_cpu(rsp->req_lim_delta)); |
---|
.. | .. |
---|
3397 | 3393 | break; |
---|
3398 | 3394 | |
---|
3399 | 3395 | case SRP_OPT_PKEY: |
---|
3400 | | - if (match_hex(args, &token)) { |
---|
| 3396 | + ret = match_hex(args, &token); |
---|
| 3397 | + if (ret) { |
---|
3401 | 3398 | pr_warn("bad P_Key parameter '%s'\n", p); |
---|
3402 | 3399 | goto out; |
---|
3403 | 3400 | } |
---|
.. | .. |
---|
3457 | 3454 | break; |
---|
3458 | 3455 | |
---|
3459 | 3456 | case SRP_OPT_MAX_SECT: |
---|
3460 | | - if (match_int(args, &token)) { |
---|
| 3457 | + ret = match_int(args, &token); |
---|
| 3458 | + if (ret) { |
---|
3461 | 3459 | pr_warn("bad max sect parameter '%s'\n", p); |
---|
3462 | 3460 | goto out; |
---|
3463 | 3461 | } |
---|
.. | .. |
---|
3465 | 3463 | break; |
---|
3466 | 3464 | |
---|
3467 | 3465 | case SRP_OPT_QUEUE_SIZE: |
---|
3468 | | - if (match_int(args, &token) || token < 1) { |
---|
| 3466 | + ret = match_int(args, &token); |
---|
| 3467 | + if (ret) { |
---|
| 3468 | + pr_warn("match_int() failed for queue_size parameter '%s', Error %d\n", |
---|
| 3469 | + p, ret); |
---|
| 3470 | + goto out; |
---|
| 3471 | + } |
---|
| 3472 | + if (token < 1) { |
---|
3469 | 3473 | pr_warn("bad queue_size parameter '%s'\n", p); |
---|
| 3474 | + ret = -EINVAL; |
---|
3470 | 3475 | goto out; |
---|
3471 | 3476 | } |
---|
3472 | 3477 | target->scsi_host->can_queue = token; |
---|
.. | .. |
---|
3477 | 3482 | break; |
---|
3478 | 3483 | |
---|
3479 | 3484 | case SRP_OPT_MAX_CMD_PER_LUN: |
---|
3480 | | - if (match_int(args, &token) || token < 1) { |
---|
| 3485 | + ret = match_int(args, &token); |
---|
| 3486 | + if (ret) { |
---|
| 3487 | + pr_warn("match_int() failed for max cmd_per_lun parameter '%s', Error %d\n", |
---|
| 3488 | + p, ret); |
---|
| 3489 | + goto out; |
---|
| 3490 | + } |
---|
| 3491 | + if (token < 1) { |
---|
3481 | 3492 | pr_warn("bad max cmd_per_lun parameter '%s'\n", |
---|
3482 | 3493 | p); |
---|
| 3494 | + ret = -EINVAL; |
---|
3483 | 3495 | goto out; |
---|
3484 | 3496 | } |
---|
3485 | 3497 | target->scsi_host->cmd_per_lun = token; |
---|
3486 | 3498 | break; |
---|
3487 | 3499 | |
---|
3488 | 3500 | case SRP_OPT_TARGET_CAN_QUEUE: |
---|
3489 | | - if (match_int(args, &token) || token < 1) { |
---|
| 3501 | + ret = match_int(args, &token); |
---|
| 3502 | + if (ret) { |
---|
| 3503 | + pr_warn("match_int() failed for max target_can_queue parameter '%s', Error %d\n", |
---|
| 3504 | + p, ret); |
---|
| 3505 | + goto out; |
---|
| 3506 | + } |
---|
| 3507 | + if (token < 1) { |
---|
3490 | 3508 | pr_warn("bad max target_can_queue parameter '%s'\n", |
---|
3491 | 3509 | p); |
---|
| 3510 | + ret = -EINVAL; |
---|
3492 | 3511 | goto out; |
---|
3493 | 3512 | } |
---|
3494 | 3513 | target->target_can_queue = token; |
---|
3495 | 3514 | break; |
---|
3496 | 3515 | |
---|
3497 | 3516 | case SRP_OPT_IO_CLASS: |
---|
3498 | | - if (match_hex(args, &token)) { |
---|
| 3517 | + ret = match_hex(args, &token); |
---|
| 3518 | + if (ret) { |
---|
3499 | 3519 | pr_warn("bad IO class parameter '%s'\n", p); |
---|
3500 | 3520 | goto out; |
---|
3501 | 3521 | } |
---|
.. | .. |
---|
3504 | 3524 | pr_warn("unknown IO class parameter value %x specified (use %x or %x).\n", |
---|
3505 | 3525 | token, SRP_REV10_IB_IO_CLASS, |
---|
3506 | 3526 | SRP_REV16A_IB_IO_CLASS); |
---|
| 3527 | + ret = -EINVAL; |
---|
3507 | 3528 | goto out; |
---|
3508 | 3529 | } |
---|
3509 | 3530 | target->io_class = token; |
---|
.. | .. |
---|
3526 | 3547 | break; |
---|
3527 | 3548 | |
---|
3528 | 3549 | case SRP_OPT_CMD_SG_ENTRIES: |
---|
3529 | | - if (match_int(args, &token) || token < 1 || token > 255) { |
---|
| 3550 | + ret = match_int(args, &token); |
---|
| 3551 | + if (ret) { |
---|
| 3552 | + pr_warn("match_int() failed for max cmd_sg_entries parameter '%s', Error %d\n", |
---|
| 3553 | + p, ret); |
---|
| 3554 | + goto out; |
---|
| 3555 | + } |
---|
| 3556 | + if (token < 1 || token > 255) { |
---|
3530 | 3557 | pr_warn("bad max cmd_sg_entries parameter '%s'\n", |
---|
3531 | 3558 | p); |
---|
| 3559 | + ret = -EINVAL; |
---|
3532 | 3560 | goto out; |
---|
3533 | 3561 | } |
---|
3534 | 3562 | target->cmd_sg_cnt = token; |
---|
3535 | 3563 | break; |
---|
3536 | 3564 | |
---|
3537 | 3565 | case SRP_OPT_ALLOW_EXT_SG: |
---|
3538 | | - if (match_int(args, &token)) { |
---|
| 3566 | + ret = match_int(args, &token); |
---|
| 3567 | + if (ret) { |
---|
3539 | 3568 | pr_warn("bad allow_ext_sg parameter '%s'\n", p); |
---|
3540 | 3569 | goto out; |
---|
3541 | 3570 | } |
---|
.. | .. |
---|
3543 | 3572 | break; |
---|
3544 | 3573 | |
---|
3545 | 3574 | case SRP_OPT_SG_TABLESIZE: |
---|
3546 | | - if (match_int(args, &token) || token < 1 || |
---|
3547 | | - token > SG_MAX_SEGMENTS) { |
---|
| 3575 | + ret = match_int(args, &token); |
---|
| 3576 | + if (ret) { |
---|
| 3577 | + pr_warn("match_int() failed for max sg_tablesize parameter '%s', Error %d\n", |
---|
| 3578 | + p, ret); |
---|
| 3579 | + goto out; |
---|
| 3580 | + } |
---|
| 3581 | + if (token < 1 || token > SG_MAX_SEGMENTS) { |
---|
3548 | 3582 | pr_warn("bad max sg_tablesize parameter '%s'\n", |
---|
3549 | 3583 | p); |
---|
| 3584 | + ret = -EINVAL; |
---|
3550 | 3585 | goto out; |
---|
3551 | 3586 | } |
---|
3552 | 3587 | target->sg_tablesize = token; |
---|
3553 | 3588 | break; |
---|
3554 | 3589 | |
---|
3555 | 3590 | case SRP_OPT_COMP_VECTOR: |
---|
3556 | | - if (match_int(args, &token) || token < 0) { |
---|
| 3591 | + ret = match_int(args, &token); |
---|
| 3592 | + if (ret) { |
---|
| 3593 | + pr_warn("match_int() failed for comp_vector parameter '%s', Error %d\n", |
---|
| 3594 | + p, ret); |
---|
| 3595 | + goto out; |
---|
| 3596 | + } |
---|
| 3597 | + if (token < 0) { |
---|
3557 | 3598 | pr_warn("bad comp_vector parameter '%s'\n", p); |
---|
| 3599 | + ret = -EINVAL; |
---|
3558 | 3600 | goto out; |
---|
3559 | 3601 | } |
---|
3560 | 3602 | target->comp_vector = token; |
---|
3561 | 3603 | break; |
---|
3562 | 3604 | |
---|
3563 | 3605 | case SRP_OPT_TL_RETRY_COUNT: |
---|
3564 | | - if (match_int(args, &token) || token < 2 || token > 7) { |
---|
| 3606 | + ret = match_int(args, &token); |
---|
| 3607 | + if (ret) { |
---|
| 3608 | + pr_warn("match_int() failed for tl_retry_count parameter '%s', Error %d\n", |
---|
| 3609 | + p, ret); |
---|
| 3610 | + goto out; |
---|
| 3611 | + } |
---|
| 3612 | + if (token < 2 || token > 7) { |
---|
3565 | 3613 | pr_warn("bad tl_retry_count parameter '%s' (must be a number between 2 and 7)\n", |
---|
3566 | 3614 | p); |
---|
| 3615 | + ret = -EINVAL; |
---|
3567 | 3616 | goto out; |
---|
3568 | 3617 | } |
---|
3569 | 3618 | target->tl_retry_count = token; |
---|
3570 | 3619 | break; |
---|
3571 | 3620 | |
---|
3572 | 3621 | case SRP_OPT_MAX_IT_IU_SIZE: |
---|
3573 | | - if (match_int(args, &token) || token < 0) { |
---|
| 3622 | + ret = match_int(args, &token); |
---|
| 3623 | + if (ret) { |
---|
| 3624 | + pr_warn("match_int() failed for max it_iu_size parameter '%s', Error %d\n", |
---|
| 3625 | + p, ret); |
---|
| 3626 | + goto out; |
---|
| 3627 | + } |
---|
| 3628 | + if (token < 0) { |
---|
3574 | 3629 | pr_warn("bad maximum initiator to target IU size '%s'\n", p); |
---|
| 3630 | + ret = -EINVAL; |
---|
3575 | 3631 | goto out; |
---|
3576 | 3632 | } |
---|
3577 | 3633 | target->max_it_iu_size = token; |
---|
3578 | 3634 | break; |
---|
3579 | 3635 | |
---|
3580 | 3636 | case SRP_OPT_CH_COUNT: |
---|
3581 | | - if (match_int(args, &token) || token < 1) { |
---|
| 3637 | + ret = match_int(args, &token); |
---|
| 3638 | + if (ret) { |
---|
| 3639 | + pr_warn("match_int() failed for channel count parameter '%s', Error %d\n", |
---|
| 3640 | + p, ret); |
---|
| 3641 | + goto out; |
---|
| 3642 | + } |
---|
| 3643 | + if (token < 1) { |
---|
3582 | 3644 | pr_warn("bad channel count %s\n", p); |
---|
| 3645 | + ret = -EINVAL; |
---|
3583 | 3646 | goto out; |
---|
3584 | 3647 | } |
---|
3585 | 3648 | target->ch_count = token; |
---|
.. | .. |
---|
3588 | 3651 | default: |
---|
3589 | 3652 | pr_warn("unknown parameter or missing value '%s' in target creation request\n", |
---|
3590 | 3653 | p); |
---|
| 3654 | + ret = -EINVAL; |
---|
3591 | 3655 | goto out; |
---|
3592 | 3656 | } |
---|
3593 | 3657 | } |
---|