Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi

Pull SCSI fixes from James Bottomley:
"Two patches in driver frameworks. The iscsi one corrects a bug induced
by a BPF change to network locking and the other is a regression we
introduced"

* tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi:
scsi: iscsi: iscsi_tcp: Avoid holding spinlock while calling getpeername()
scsi: target: Fix lun lookup for TARGET_SCF_LOOKUP_LUN_FROM_TAG case

+18 -9
+16 -8
drivers/scsi/iscsi_tcp.c
··· 736 736 struct iscsi_tcp_conn *tcp_conn = conn->dd_data; 737 737 struct iscsi_sw_tcp_conn *tcp_sw_conn = tcp_conn->dd_data; 738 738 struct sockaddr_in6 addr; 739 + struct socket *sock; 739 740 int rc; 740 741 741 742 switch(param) { ··· 748 747 spin_unlock_bh(&conn->session->frwd_lock); 749 748 return -ENOTCONN; 750 749 } 750 + sock = tcp_sw_conn->sock; 751 + sock_hold(sock->sk); 752 + spin_unlock_bh(&conn->session->frwd_lock); 753 + 751 754 if (param == ISCSI_PARAM_LOCAL_PORT) 752 - rc = kernel_getsockname(tcp_sw_conn->sock, 755 + rc = kernel_getsockname(sock, 753 756 (struct sockaddr *)&addr); 754 757 else 755 - rc = kernel_getpeername(tcp_sw_conn->sock, 758 + rc = kernel_getpeername(sock, 756 759 (struct sockaddr *)&addr); 757 - spin_unlock_bh(&conn->session->frwd_lock); 760 + sock_put(sock->sk); 758 761 if (rc < 0) 759 762 return rc; 760 763 ··· 780 775 struct iscsi_tcp_conn *tcp_conn; 781 776 struct iscsi_sw_tcp_conn *tcp_sw_conn; 782 777 struct sockaddr_in6 addr; 778 + struct socket *sock; 783 779 int rc; 784 780 785 781 switch (param) { ··· 795 789 return -ENOTCONN; 796 790 } 797 791 tcp_conn = conn->dd_data; 798 - 799 792 tcp_sw_conn = tcp_conn->dd_data; 800 - if (!tcp_sw_conn->sock) { 793 + sock = tcp_sw_conn->sock; 794 + if (!sock) { 801 795 spin_unlock_bh(&session->frwd_lock); 802 796 return -ENOTCONN; 803 797 } 804 - 805 - rc = kernel_getsockname(tcp_sw_conn->sock, 806 - (struct sockaddr *)&addr); 798 + sock_hold(sock->sk); 807 799 spin_unlock_bh(&session->frwd_lock); 800 + 801 + rc = kernel_getsockname(sock, 802 + (struct sockaddr *)&addr); 803 + sock_put(sock->sk); 808 804 if (rc < 0) 809 805 return rc; 810 806
+2 -1
drivers/target/target_core_transport.c
··· 1840 1840 * out unpacked_lun for the original se_cmd. 1841 1841 */ 1842 1842 if (tm_type == TMR_ABORT_TASK && (flags & TARGET_SCF_LOOKUP_LUN_FROM_TAG)) { 1843 - if (!target_lookup_lun_from_tag(se_sess, tag, &unpacked_lun)) 1843 + if (!target_lookup_lun_from_tag(se_sess, tag, 1844 + &se_cmd->orig_fe_lun)) 1844 1845 goto failure; 1845 1846 } 1846 1847