|
@@ -370,17 +370,24 @@ static inline int iscsi_sw_tcp_xmit_qlen(struct iscsi_conn *conn)
|
|
|
static int iscsi_sw_tcp_pdu_xmit(struct iscsi_task *task)
|
|
|
{
|
|
|
struct iscsi_conn *conn = task->conn;
|
|
|
- int rc;
|
|
|
+ unsigned long pflags = current->flags;
|
|
|
+ int rc = 0;
|
|
|
+
|
|
|
+ current->flags |= PF_MEMALLOC;
|
|
|
|
|
|
while (iscsi_sw_tcp_xmit_qlen(conn)) {
|
|
|
rc = iscsi_sw_tcp_xmit(conn);
|
|
|
- if (rc == 0)
|
|
|
- return -EAGAIN;
|
|
|
+ if (rc == 0) {
|
|
|
+ rc = -EAGAIN;
|
|
|
+ break;
|
|
|
+ }
|
|
|
if (rc < 0)
|
|
|
- return rc;
|
|
|
+ break;
|
|
|
+ rc = 0;
|
|
|
}
|
|
|
|
|
|
- return 0;
|
|
|
+ tsk_restore_flags(current, pflags, PF_MEMALLOC);
|
|
|
+ return rc;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -665,6 +672,7 @@ iscsi_sw_tcp_conn_bind(struct iscsi_cls_session *cls_session,
|
|
|
sk->sk_reuse = SK_CAN_REUSE;
|
|
|
sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
|
|
|
sk->sk_allocation = GFP_ATOMIC;
|
|
|
+ sk_set_memalloc(sk);
|
|
|
|
|
|
iscsi_sw_tcp_conn_set_callbacks(conn);
|
|
|
tcp_sw_conn->sendpage = tcp_sw_conn->sock->ops->sendpage;
|