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