Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3713525pxv; Mon, 26 Jul 2021 10:02:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwml0qr7vD/dbo/xq+uoJF0/OlLhJVD5hygHw67Ou3+PtOVtiACGMm37zKThaN0AQDMVHli X-Received: by 2002:a05:600c:2194:: with SMTP id e20mr3664523wme.77.1627318977247; Mon, 26 Jul 2021 10:02:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627318977; cv=none; d=google.com; s=arc-20160816; b=thJHC+GK4HH9UNR1sbgYmiFic3mU/iap6WB6xJkSQj9BmbEBrwdVYulqr2JfBlNG4/ 0k/WcN7W2Whf570XL8h+YvF860BhmC5+4Oax14HPNXeGJ2JADatE2vXUS94m11A88Biw FxDv8vOvNeu+XUiz6eVrBpaXvnt1iidCkQLcFkVyxw+j3pIYi0UjvdGSeVWWN9ysQMH0 9IJCkhk2idpUzruPDNtayxU6pVMTmVYgnFy3clrtiq6szKN9rlRCJPjs66D9qKai075j ZY0gZOcx2OwxXhetaDfL/u5sl0Hs9bGupeMMLh8b3MVxJQbOhNFN6IC8+Oy5Bra+SiqZ es9Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=KqZIu3sKS3CJogF0c6CZcuVY7v0MkfksXrFwqFb98lI=; b=jDnCoiMuzN7X8LbfuF6Gl6uAp9hylrXLbW6uUu98nryvPCcRw7QL9+DwVeZAOmeJ0f AF3oLk2KgUgEjZtyDKUcjV16rFrFt2SPAISCvKy84zXafE+xWLOh6pCKXZJNOTCBFkXa +ggeddURBhA40vVHpgxjL9yB9jsAihrURGCXQNN26+h4r12voqcufm9yehIi2OVWWNzz hV72OH7e9eyaSCLO2JB08MwJ1TSLzU6LifJRe7o9K+RIanNGysmGwUfCbtAQiXI2zoG5 rQWu76baHa1LVly8ras98WLaLcVnvtxqhaX2XFRjlRz52vYXbBTaH4TvVuh2ysVWN6PL 8jog== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Xc908gEF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ho6si398057ejc.635.2021.07.26.10.02.33; Mon, 26 Jul 2021 10:02:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=Xc908gEF; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S237457AbhGZPkf (ORCPT + 99 others); Mon, 26 Jul 2021 11:40:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:37940 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237471AbhGZPXE (ORCPT ); Mon, 26 Jul 2021 11:23:04 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 4876F60240; Mon, 26 Jul 2021 16:03:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315412; bh=jqklDH182WCZFaSyD0dixLPZ64j+3WVu55k7ZEa9Y9c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Xc908gEFWX6juHeFgDMo0a0L6C8yld/qoeiW1f1Oo2EnwFwTDHRtK43sKhDSYpNW+ sLNwiexDQjlpUBoEkOfStipE3qa7Xif0y0mtJsV75jq9aUC6qSKhifMetCGRkJyroF F1I1YzGNvr3HCB5B9OW0tbSuCLALmmEoqztJb0ho= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Yajun Deng , "David S. Miller" , Sasha Levin Subject: [PATCH 5.10 069/167] net: decnet: Fix sleeping inside in af_decnet Date: Mon, 26 Jul 2021 17:38:22 +0200 Message-Id: <20210726153841.710356568@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153839.371771838@linuxfoundation.org> References: <20210726153839.371771838@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Yajun Deng [ Upstream commit 5f119ba1d5771bbf46d57cff7417dcd84d3084ba ] The release_sock() is blocking function, it would change the state after sleeping. use wait_woken() instead. Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2") Signed-off-by: Yajun Deng Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- net/decnet/af_decnet.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index 5dbd45dc35ad..dc92a67baea3 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c @@ -816,7 +816,7 @@ static int dn_auto_bind(struct socket *sock) static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) { struct dn_scp *scp = DN_SK(sk); - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); int err; if (scp->state != DN_CR) @@ -826,11 +826,11 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) scp->segsize_loc = dst_metric_advmss(__sk_dst_get(sk)); dn_send_conn_conf(sk, allocation); - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); + add_wait_queue(sk_sleep(sk), &wait); for(;;) { release_sock(sk); if (scp->state == DN_CC) - *timeo = schedule_timeout(*timeo); + *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo); lock_sock(sk); err = 0; if (scp->state == DN_RUN) @@ -844,9 +844,8 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) err = -EAGAIN; if (!*timeo) break; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); } - finish_wait(sk_sleep(sk), &wait); + remove_wait_queue(sk_sleep(sk), &wait); if (err == 0) { sk->sk_socket->state = SS_CONNECTED; } else if (scp->state != DN_CC) { @@ -858,7 +857,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation) static int dn_wait_run(struct sock *sk, long *timeo) { struct dn_scp *scp = DN_SK(sk); - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); int err = 0; if (scp->state == DN_RUN) @@ -867,11 +866,11 @@ static int dn_wait_run(struct sock *sk, long *timeo) if (!*timeo) return -EALREADY; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); + add_wait_queue(sk_sleep(sk), &wait); for(;;) { release_sock(sk); if (scp->state == DN_CI || scp->state == DN_CC) - *timeo = schedule_timeout(*timeo); + *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo); lock_sock(sk); err = 0; if (scp->state == DN_RUN) @@ -885,9 +884,8 @@ static int dn_wait_run(struct sock *sk, long *timeo) err = -ETIMEDOUT; if (!*timeo) break; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); } - finish_wait(sk_sleep(sk), &wait); + remove_wait_queue(sk_sleep(sk), &wait); out: if (err == 0) { sk->sk_socket->state = SS_CONNECTED; @@ -1032,16 +1030,16 @@ static void dn_user_copy(struct sk_buff *skb, struct optdata_dn *opt) static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) { - DEFINE_WAIT(wait); + DEFINE_WAIT_FUNC(wait, woken_wake_function); struct sk_buff *skb = NULL; int err = 0; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); + add_wait_queue(sk_sleep(sk), &wait); for(;;) { release_sock(sk); skb = skb_dequeue(&sk->sk_receive_queue); if (skb == NULL) { - *timeo = schedule_timeout(*timeo); + *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo); skb = skb_dequeue(&sk->sk_receive_queue); } lock_sock(sk); @@ -1056,9 +1054,8 @@ static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo) err = -EAGAIN; if (!*timeo) break; - prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); } - finish_wait(sk_sleep(sk), &wait); + remove_wait_queue(sk_sleep(sk), &wait); return skb == NULL ? ERR_PTR(err) : skb; } -- 2.30.2