| .. | .. |
|---|
| 570 | 570 | struct fcloop_fcpreq *tfcp_req = |
|---|
| 571 | 571 | container_of(work, struct fcloop_fcpreq, fcp_rcv_work); |
|---|
| 572 | 572 | struct nvmefc_fcp_req *fcpreq = tfcp_req->fcpreq; |
|---|
| 573 | + unsigned long flags; |
|---|
| 573 | 574 | int ret = 0; |
|---|
| 574 | 575 | bool aborted = false; |
|---|
| 575 | 576 | |
|---|
| 576 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 577 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 577 | 578 | switch (tfcp_req->inistate) { |
|---|
| 578 | 579 | case INI_IO_START: |
|---|
| 579 | 580 | tfcp_req->inistate = INI_IO_ACTIVE; |
|---|
| .. | .. |
|---|
| 582 | 583 | aborted = true; |
|---|
| 583 | 584 | break; |
|---|
| 584 | 585 | default: |
|---|
| 585 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 586 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 586 | 587 | WARN_ON(1); |
|---|
| 587 | 588 | return; |
|---|
| 588 | 589 | } |
|---|
| 589 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 590 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 590 | 591 | |
|---|
| 591 | 592 | if (unlikely(aborted)) |
|---|
| 592 | 593 | ret = -ECANCELED; |
|---|
| .. | .. |
|---|
| 607 | 608 | container_of(work, struct fcloop_fcpreq, abort_rcv_work); |
|---|
| 608 | 609 | struct nvmefc_fcp_req *fcpreq; |
|---|
| 609 | 610 | bool completed = false; |
|---|
| 611 | + unsigned long flags; |
|---|
| 610 | 612 | |
|---|
| 611 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 613 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 612 | 614 | fcpreq = tfcp_req->fcpreq; |
|---|
| 613 | 615 | switch (tfcp_req->inistate) { |
|---|
| 614 | 616 | case INI_IO_ABORTED: |
|---|
| .. | .. |
|---|
| 617 | 619 | completed = true; |
|---|
| 618 | 620 | break; |
|---|
| 619 | 621 | default: |
|---|
| 620 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 622 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 621 | 623 | WARN_ON(1); |
|---|
| 622 | 624 | return; |
|---|
| 623 | 625 | } |
|---|
| 624 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 626 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 625 | 627 | |
|---|
| 626 | 628 | if (unlikely(completed)) { |
|---|
| 627 | 629 | /* remove reference taken in original abort downcall */ |
|---|
| .. | .. |
|---|
| 633 | 635 | nvmet_fc_rcv_fcp_abort(tfcp_req->tport->targetport, |
|---|
| 634 | 636 | &tfcp_req->tgt_fcp_req); |
|---|
| 635 | 637 | |
|---|
| 636 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 638 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 637 | 639 | tfcp_req->fcpreq = NULL; |
|---|
| 638 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 640 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 639 | 641 | |
|---|
| 640 | 642 | fcloop_call_host_done(fcpreq, tfcp_req, -ECANCELED); |
|---|
| 641 | 643 | /* call_host_done releases reference for abort downcall */ |
|---|
| .. | .. |
|---|
| 651 | 653 | struct fcloop_fcpreq *tfcp_req = |
|---|
| 652 | 654 | container_of(work, struct fcloop_fcpreq, tio_done_work); |
|---|
| 653 | 655 | struct nvmefc_fcp_req *fcpreq; |
|---|
| 656 | + unsigned long flags; |
|---|
| 654 | 657 | |
|---|
| 655 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 658 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 656 | 659 | fcpreq = tfcp_req->fcpreq; |
|---|
| 657 | 660 | tfcp_req->inistate = INI_IO_COMPLETED; |
|---|
| 658 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 661 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 659 | 662 | |
|---|
| 660 | 663 | fcloop_call_host_done(fcpreq, tfcp_req, tfcp_req->status); |
|---|
| 661 | 664 | } |
|---|
| .. | .. |
|---|
| 759 | 762 | u32 rsplen = 0, xfrlen = 0; |
|---|
| 760 | 763 | int fcp_err = 0, active, aborted; |
|---|
| 761 | 764 | u8 op = tgt_fcpreq->op; |
|---|
| 765 | + unsigned long flags; |
|---|
| 762 | 766 | |
|---|
| 763 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 767 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 764 | 768 | fcpreq = tfcp_req->fcpreq; |
|---|
| 765 | 769 | active = tfcp_req->active; |
|---|
| 766 | 770 | aborted = tfcp_req->aborted; |
|---|
| 767 | 771 | tfcp_req->active = true; |
|---|
| 768 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 772 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 769 | 773 | |
|---|
| 770 | 774 | if (unlikely(active)) |
|---|
| 771 | 775 | /* illegal - call while i/o active */ |
|---|
| .. | .. |
|---|
| 773 | 777 | |
|---|
| 774 | 778 | if (unlikely(aborted)) { |
|---|
| 775 | 779 | /* target transport has aborted i/o prior */ |
|---|
| 776 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 780 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 777 | 781 | tfcp_req->active = false; |
|---|
| 778 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 782 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 779 | 783 | tgt_fcpreq->transferred_length = 0; |
|---|
| 780 | 784 | tgt_fcpreq->fcp_error = -ECANCELED; |
|---|
| 781 | 785 | tgt_fcpreq->done(tgt_fcpreq); |
|---|
| .. | .. |
|---|
| 832 | 836 | break; |
|---|
| 833 | 837 | } |
|---|
| 834 | 838 | |
|---|
| 835 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 839 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 836 | 840 | tfcp_req->active = false; |
|---|
| 837 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 841 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 838 | 842 | |
|---|
| 839 | 843 | tgt_fcpreq->transferred_length = xfrlen; |
|---|
| 840 | 844 | tgt_fcpreq->fcp_error = fcp_err; |
|---|
| .. | .. |
|---|
| 848 | 852 | struct nvmefc_tgt_fcp_req *tgt_fcpreq) |
|---|
| 849 | 853 | { |
|---|
| 850 | 854 | struct fcloop_fcpreq *tfcp_req = tgt_fcp_req_to_fcpreq(tgt_fcpreq); |
|---|
| 855 | + unsigned long flags; |
|---|
| 851 | 856 | |
|---|
| 852 | 857 | /* |
|---|
| 853 | 858 | * mark aborted only in case there were 2 threads in transport |
|---|
| 854 | 859 | * (one doing io, other doing abort) and only kills ops posted |
|---|
| 855 | 860 | * after the abort request |
|---|
| 856 | 861 | */ |
|---|
| 857 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 862 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 858 | 863 | tfcp_req->aborted = true; |
|---|
| 859 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 864 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 860 | 865 | |
|---|
| 861 | 866 | tfcp_req->status = NVME_SC_INTERNAL; |
|---|
| 862 | 867 | |
|---|
| .. | .. |
|---|
| 898 | 903 | struct fcloop_ini_fcpreq *inireq = fcpreq->private; |
|---|
| 899 | 904 | struct fcloop_fcpreq *tfcp_req; |
|---|
| 900 | 905 | bool abortio = true; |
|---|
| 906 | + unsigned long flags; |
|---|
| 901 | 907 | |
|---|
| 902 | 908 | spin_lock(&inireq->inilock); |
|---|
| 903 | 909 | tfcp_req = inireq->tfcp_req; |
|---|
| .. | .. |
|---|
| 910 | 916 | return; |
|---|
| 911 | 917 | |
|---|
| 912 | 918 | /* break initiator/target relationship for io */ |
|---|
| 913 | | - spin_lock_irq(&tfcp_req->reqlock); |
|---|
| 919 | + spin_lock_irqsave(&tfcp_req->reqlock, flags); |
|---|
| 914 | 920 | switch (tfcp_req->inistate) { |
|---|
| 915 | 921 | case INI_IO_START: |
|---|
| 916 | 922 | case INI_IO_ACTIVE: |
|---|
| .. | .. |
|---|
| 920 | 926 | abortio = false; |
|---|
| 921 | 927 | break; |
|---|
| 922 | 928 | default: |
|---|
| 923 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 929 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 924 | 930 | WARN_ON(1); |
|---|
| 925 | 931 | return; |
|---|
| 926 | 932 | } |
|---|
| 927 | | - spin_unlock_irq(&tfcp_req->reqlock); |
|---|
| 933 | + spin_unlock_irqrestore(&tfcp_req->reqlock, flags); |
|---|
| 928 | 934 | |
|---|
| 929 | 935 | if (abortio) |
|---|
| 930 | 936 | /* leave the reference while the work item is scheduled */ |
|---|