Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3672879pxv; Mon, 26 Jul 2021 09:08:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJztD24O9uvxdscIsSMHaKBpuRX9xpq14cnYdGkkLnTO4b6BwG3zlhmMyQVmMpw/nf/+MBnv X-Received: by 2002:a17:907:3d94:: with SMTP id he20mr17352291ejc.473.1627315701211; Mon, 26 Jul 2021 09:08:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627315701; cv=none; d=google.com; s=arc-20160816; b=WsoBD66dOxSp9J3ZUtQJHU8MJhZnVJ8HWPbLAk01WxMVL39/PIrUAtdpQbu+wyFjea 3r9fIG25DOHob7fSCtVnhUvqHSvHFo27A/eyf+N6qZx8VZof+q4phNFSGVNIsK51d3+M Wm6yZm3cZkpN6MHN1E1PgV/uL7pR9q0RRtQKsqHjNtNLWz5oTD3mgWXGmBSMceDrwjoc Gk6RCqyusayP/1mjnpitQHzt7qk+4ypSAcOdlR2szcbFEsx1mhkXn5LjqUH64TrGIOwQ FRibDftjR1QN+AfH3VAj/4G7XJFHKq+opsU8EVz+bbKROC7Zr7aCwI8cVdiJzX8YeMzC bOYA== 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=EC2D7lCF5oJraYyoNMemU13YeRgwXYKmAwJ/+ogVVgM=; b=Re1BzdmVHVxijwbIFMdtn6Me4V5zDqFB1DnCWfpRTXRd9AjDgL3tlK2G9beOSdeD9p y3kqzuIed9mr1+Ita9RQDnFANLDYsM2TrsBZIgc22aWh1tYu4I/PBsg7oe5gCBLe5fxc yZm8NFjfGx/yxytJurXsiB6wUdmXB3RfkQLplO/vzaE7yrANixWw57WwnqZl3AZd+fer vveSmUJrUrXegW4OhRSfxOghqOwz/dGFhMGrzoGbU+0mHW4oHPdFoZ5lk7Hu7Jxr4t9b LTvLjlt4+7PUKMwS7CpWpQsmJi33cbb+8NFBvvWgYn5YbTqLtnxjc7tKpxYMkBsYkTjM Ahkw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=eCgmDre5; 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 b26si294770edr.39.2021.07.26.09.07.55; Mon, 26 Jul 2021 09:08:21 -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=eCgmDre5; 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 S238076AbhGZPYi (ORCPT + 99 others); Mon, 26 Jul 2021 11:24:38 -0400 Received: from mail.kernel.org ([198.145.29.99]:52972 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S236639AbhGZPLy (ORCPT ); Mon, 26 Jul 2021 11:11:54 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id 35FC360F38; Mon, 26 Jul 2021 15:52:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627314742; bh=53BQTfdZFQdP56jbgWJq0znHDcAMrcu07M83k8BKfbQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eCgmDre5g5bWh8q6aKIAycEROWI42CD/K+eHV8f0wToDie2EHmm6vftbtYFqJIXcs rfJmD61pW1xL3K8tgKqil8zdA91ne104LEiaunYeWV2zNKwWGV6Db0YHndOcKKoG/B WmMomV0XzrEtP7YGuJbaCyBV5BSwyrJBunnw4CEo= 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 4.19 076/120] net: decnet: Fix sleeping inside in af_decnet Date: Mon, 26 Jul 2021 17:38:48 +0200 Message-Id: <20210726153834.825930830@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153832.339431936@linuxfoundation.org> References: <20210726153832.339431936@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 0e6f32defd67..cc7077105969 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c @@ -823,7 +823,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) @@ -833,11 +833,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) @@ -851,9 +851,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) { @@ -865,7 +864,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) @@ -874,11 +873,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) @@ -892,9 +891,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; @@ -1039,16 +1037,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); @@ -1063,9 +1061,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