Received: by 2002:a05:6a10:1287:0:0:0:0 with SMTP id d7csp3693718pxv; Mon, 26 Jul 2021 09:32:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwsF1E2bxxnpfmZbXrhXHEhOjoj2+9UuISvVxoEW+bhbkHD603CsQncAYuBXuRygmm95jKT X-Received: by 2002:a02:9582:: with SMTP id b2mr17361762jai.131.1627317164970; Mon, 26 Jul 2021 09:32:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1627317164; cv=none; d=google.com; s=arc-20160816; b=KRyzubvOwxe1HsfAm6SKm2r8Dw4DghJYwBc89GW0P87Gx1d6KBVChRJrOWL9y3O+WM wSI5FjBvZJwmBgL6lvW+lOOsu6p9/2amkezEUywFcwDkZlG2R4VRW1lHOGSyPuTVTIaj jHyA5qBeRjLOuYA3UBJ82IKn1Nia56ZRGSdDNAdIW15KgaMfDKhogC9GLK4FPhziyMho tW0lchnDTwifjWXcCDCwl7QvbRQaIb8VP+YxVtDQz/AWcu/hlioCIyPeh6Hk7T80938t bOls3ZyEqfd4c2209kQj7KStLqB2gGCYLq7mVJtIy7dfL/OwAgDIld+EHPUNT5FKpd/Z 4SvA== 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=MEWQPmGGKa43vHweLL8fAGhDd/h6J4f5i6mZ0cOO9Dn3mAky7BSzJ/W4g175Yown6M WfHiaqjwhcYYNMCqW2cVOW/xHj0AooeW7a7H2uPCQ2sF7HEyQrFdxPQwJqB2pSbyubHa 7uIqOXJpPuUtS5LDECZ03YG1SBywcKcDsCXj0HTSImY6Ubp1arZpoNj8dXoNTXUmXZYB XOdxLjxc8u4ChVpaDvSraTwx0ZcBvluQwteOGAde4TTAgiwBWo8uknqsirmXvZYAiWTe nT0Czeaz7ZPXPdSJUNluM1VndZorsVcti13lgNQriwawARVYpKfaoDn4nZV2Vv0uc0y3 apQA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=eFUpoPJO; 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 q15si360641jaj.14.2021.07.26.09.32.25; Mon, 26 Jul 2021 09:32:44 -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=eFUpoPJO; 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 S238651AbhGZPtq (ORCPT + 99 others); Mon, 26 Jul 2021 11:49:46 -0400 Received: from mail.kernel.org ([198.145.29.99]:45896 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231795AbhGZPaY (ORCPT ); Mon, 26 Jul 2021 11:30:24 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id CDC6C60C40; Mon, 26 Jul 2021 16:10:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1627315852; bh=jqklDH182WCZFaSyD0dixLPZ64j+3WVu55k7ZEa9Y9c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=eFUpoPJO41pchs8CbsnNUNZSCc6AIi0zTJ+H395HL1JgWn4x6TVsaZbO42oN27+oA M+TcKM7wxs2dB0MV5Od/iAeqgaZPwMpw/TezmrqDZ8wnlw/1sFtqt4vbJui04IHA3m xY4a5Ba4FqyCnDimf55M0yapkC0MLRnSysvPUV7A= 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.13 092/223] net: decnet: Fix sleeping inside in af_decnet Date: Mon, 26 Jul 2021 17:38:04 +0200 Message-Id: <20210726153849.256040055@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210726153846.245305071@linuxfoundation.org> References: <20210726153846.245305071@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