Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp241649pxf; Wed, 10 Mar 2021 05:28:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJxUx6fZuhyULPsm+kw1GVxHNReCwhxNzpZdjrtBD5PfS/Ae3vZRPl2PhfrL+NserBhd4G8E X-Received: by 2002:a17:906:4e91:: with SMTP id v17mr3636777eju.331.1615382902543; Wed, 10 Mar 2021 05:28:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1615382902; cv=none; d=google.com; s=arc-20160816; b=gvvfbiezOeY/BQ2Rt8VQeK0J+4ZT8axvK3bqqXkZDMI0ECoPkVPNz7+89uzA0GNsR3 TE28RwRDm6wbwOAbTRxdGbHgMCFXxZKb6LUOOs/WjvGFn/ghfpy5MqLWR1cOXHQAhZsW BkvKy7g6cmJL0DqdGy0EcONwt/IzvPhbqkpSndrvHBt/KV1BDzk/eZ6Puv/ONV+8+2Gq mBKksw2UqULvrvtflClHamJM8E6bwo+x7gD5bNV1Z3Bxb1KgUE0dvuucvlqXsp0PdO3B UQo4hfsaFauf03PDVv6iHF8WqTDChBFiV60HvvL83Lfd8uSTGPg1UDO2QVxmDmiQlKPr yo3Q== 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=G/ItbmTM95u/G59XS4WiPAcwSUXScemNubJvRyHpKlc=; b=Q5b6yo1GRWNwAUv+yK3nMOQust+eHKHEVGGPx99D2PqmcbN3TwNax10NjPEMtZNe4X 3PehFsZNajx1Hdz7YNMLRK+4wj1xV67Y9UuH7iJNJ3j6svvkLJSOCHIqXAtA2UjEsOnP 8FGizC9n0UF1W6/S5dWnPmlvujy/yJ8j+bsLBNwnKM3anIMppBNMjEFEEUYQg1RVFe+r 5bhVEhwUhQveIXZ7kZQcLvmlrmfmsxP+PdJ1SQKLVLVrxStmVQiOZeYxV7wYhBqbRhAv /NhmF+kdlLmPm7ljSgwcqPqJEgv8hXAVT0+L+1qk2DA9fl7PpRZNRK527r7lh1hEWkP6 NF/w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=iEpL1igk; 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 a9si11786396ejk.421.2021.03.10.05.27.59; Wed, 10 Mar 2021 05:28:22 -0800 (PST) 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=iEpL1igk; 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 S233767AbhCJN1F (ORCPT + 99 others); Wed, 10 Mar 2021 08:27:05 -0500 Received: from mail.kernel.org ([198.145.29.99]:46414 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233118AbhCJNY4 (ORCPT ); Wed, 10 Mar 2021 08:24:56 -0500 Received: by mail.kernel.org (Postfix) with ESMTPSA id B2D9364FD8; Wed, 10 Mar 2021 13:24:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1615382696; bh=A8IInkAO2MyI0Pf0OmXm/HXTY5d2ULqVX/zJjFxtRpc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=iEpL1igkd+CSnJ3D0qxFDAIfmeQuJBYn1hIcHDqgdPeMs7v7oxbjDkNggeKRmkfXE azXgORgvKYrAzs6DCQUXuzCpvwI5eF/v0slIWtl/G0ieVrDe8cf0wQHKnKynrq1Jrp E6jZc1oJJYGYfH+Xw+JbkWXqsDvNp7a+Y/pyco9U= From: gregkh@linuxfoundation.org To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ira Weiny , David Sterba Subject: [PATCH 4.19 02/39] btrfs: fix raid6 qstripe kmap Date: Wed, 10 Mar 2021 14:24:10 +0100 Message-Id: <20210310132319.794474496@linuxfoundation.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210310132319.708237392@linuxfoundation.org> References: <20210310132319.708237392@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: Greg Kroah-Hartman From: Ira Weiny commit d70cef0d46729808dc53f145372c02b145c92604 upstream. When a qstripe is required an extra page is allocated and mapped. There were 3 problems: 1) There is no corresponding call of kunmap() for the qstripe page. 2) There is no reason to map the qstripe page more than once if the number of bits set in rbio->dbitmap is greater than one. 3) There is no reason to map the parity page and unmap it each time through the loop. The page memory can continue to be reused with a single mapping on each iteration by raid6_call.gen_syndrome() without remapping. So map the page for the duration of the loop. Similarly, improve the algorithm by mapping the parity page just 1 time. Fixes: 5a6ac9eacb49 ("Btrfs, raid56: support parity scrub on raid56") CC: stable@vger.kernel.org # 4.4.x: c17af96554a8: btrfs: raid56: simplify tracking of Q stripe presence CC: stable@vger.kernel.org # 4.4.x Signed-off-by: Ira Weiny Reviewed-by: David Sterba Signed-off-by: David Sterba Signed-off-by: Greg Kroah-Hartman --- fs/btrfs/raid56.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) --- a/fs/btrfs/raid56.c +++ b/fs/btrfs/raid56.c @@ -2375,16 +2375,21 @@ static noinline void finish_parity_scrub SetPageUptodate(p_page); if (has_qstripe) { + /* RAID6, allocate and map temp space for the Q stripe */ q_page = alloc_page(GFP_NOFS | __GFP_HIGHMEM); if (!q_page) { __free_page(p_page); goto cleanup; } SetPageUptodate(q_page); + pointers[rbio->real_stripes - 1] = kmap(q_page); } atomic_set(&rbio->error, 0); + /* Map the parity stripe just once */ + pointers[nr_data] = kmap(p_page); + for_each_set_bit(pagenr, rbio->dbitmap, rbio->stripe_npages) { struct page *p; void *parity; @@ -2394,16 +2399,8 @@ static noinline void finish_parity_scrub pointers[stripe] = kmap(p); } - /* then add the parity stripe */ - pointers[stripe++] = kmap(p_page); - if (has_qstripe) { - /* - * raid6, add the qstripe and call the - * library function to fill in our p/q - */ - pointers[stripe++] = kmap(q_page); - + /* RAID6, call the library function to fill in our P/Q */ raid6_call.gen_syndrome(rbio->real_stripes, PAGE_SIZE, pointers); } else { @@ -2424,12 +2421,14 @@ static noinline void finish_parity_scrub for (stripe = 0; stripe < nr_data; stripe++) kunmap(page_in_rbio(rbio, stripe, pagenr, 0)); - kunmap(p_page); } + kunmap(p_page); __free_page(p_page); - if (q_page) + if (q_page) { + kunmap(q_page); __free_page(q_page); + } writeback: /*