Received: by 10.223.185.116 with SMTP id b49csp626883wrg; Fri, 16 Feb 2018 04:45:17 -0800 (PST) X-Google-Smtp-Source: AH8x226d2qeTB1bDmBvD6jfENjpc1oIcl88Au3tMFMg1VUta0Zh4lvyWjy1B/iJELr6OsS//zwjx X-Received: by 10.98.245.18 with SMTP id n18mr5895128pfh.25.1518785117234; Fri, 16 Feb 2018 04:45:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518785117; cv=none; d=google.com; s=arc-20160816; b=IHglciYbbkubUmfx59JXrvhzTSkkfqKTyKOPlts9KIi34Hdk4gMAdzN01aqVNvmyp2 g/7g31VCCL0BhXsH+OL+IL/48Or94wV9dbZzLSA2+E2ZzGiorrh1gg7g/9beQKUbUafN ZNINbxYPsd0EBisMJcN3xC5ybb9l5vzlsxd19yStVVplFAby2HipVCM+RCTM9DXl59Vl KIL9rRfgTVlUp9e4TxDjflQThiWSnxUjMyRpDi83kwvQCIwwu96mkEerA+Ppgl1cbXcT 8RhH2L3dVtLvEH7RAxGEEEH+DCVM7UHki4sL8k2vrKpXwTuCCBj4Bn5TZ69G2XeMrh2n ONRA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=j27L/KH08fJyWyxIumVUBE6/ETjmwUW0XIFvx2SX5fo=; b=cHEpu8O+YpTrm33tfHAtNr+UuySkIbVHyjVfH9w4JvD6s7pP8iFY95Fo9X6CJlC3p4 qRuPbOC2vgxMyJjwhJRbdLYeFqGrk72jOLGkJKLIJG9e60LNG727EWt7F0cCOypaZd0A rNPk/JmpAw3dkF6RvBUTcbEonV4pZM+CkK2o8z8Ie9YYEzJQGK2Rv8LARNVYg1vUQRGm rnsed6SmBEwnf9+/i4YBKbZ2To/KQbYPyLA9/Y14lI1JZlHLdAxd2aHaXyrLCctgQmlb vo8stgCT1t+yRnSX+g6ZbTUD0r4IoY1/AsUmz0FwlijtQ8c/Dz8Srb+HUIiCrfhwEcQY S9Mg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h1-v6si6040743pln.138.2018.02.16.04.45.01; Fri, 16 Feb 2018 04:45:17 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1166246AbeBOSSt (ORCPT + 99 others); Thu, 15 Feb 2018 13:18:49 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:53294 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1163505AbeBOP1A (ORCPT ); Thu, 15 Feb 2018 10:27:00 -0500 Received: from localhost (LFbn-1-12258-90.w90-92.abo.wanadoo.fr [90.92.71.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 69673360; Thu, 15 Feb 2018 15:26:59 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sascha Hauer , Richard Weinberger Subject: [PATCH 4.9 19/88] ubi: fastmap: Erase outdated anchor PEBs during attach Date: Thu, 15 Feb 2018 16:16:46 +0100 Message-Id: <20180215151225.399051475@linuxfoundation.org> X-Mailer: git-send-email 2.16.1 In-Reply-To: <20180215151222.437136975@linuxfoundation.org> References: <20180215151222.437136975@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.9-stable review patch. If anyone has any objections, please let me know. ------------------ From: Sascha Hauer commit f78e5623f45bab2b726eec29dc5cefbbab2d0b1c upstream. The fastmap update code might erase the current fastmap anchor PEB in case it doesn't find any new free PEB. When a power cut happens in this situation we must not have any outdated fastmap anchor PEB on the device, because that would be used to attach during next boot. The easiest way to make that sure is to erase all outdated fastmap anchor PEBs synchronously during attach. Signed-off-by: Sascha Hauer Reviewed-by: Richard Weinberger Fixes: dbb7d2a88d2a ("UBI: Add fastmap core") Signed-off-by: Richard Weinberger Signed-off-by: Greg Kroah-Hartman --- drivers/mtd/ubi/wl.c | 77 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 57 insertions(+), 20 deletions(-) --- a/drivers/mtd/ubi/wl.c +++ b/drivers/mtd/ubi/wl.c @@ -1529,6 +1529,46 @@ static void shutdown_work(struct ubi_dev } /** + * erase_aeb - erase a PEB given in UBI attach info PEB + * @ubi: UBI device description object + * @aeb: UBI attach info PEB + * @sync: If true, erase synchronously. Otherwise schedule for erasure + */ +static int erase_aeb(struct ubi_device *ubi, struct ubi_ainf_peb *aeb, bool sync) +{ + struct ubi_wl_entry *e; + int err; + + e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL); + if (!e) + return -ENOMEM; + + e->pnum = aeb->pnum; + e->ec = aeb->ec; + ubi->lookuptbl[e->pnum] = e; + + if (sync) { + err = sync_erase(ubi, e, false); + if (err) + goto out_free; + + wl_tree_add(e, &ubi->free); + ubi->free_count++; + } else { + err = schedule_erase(ubi, e, aeb->vol_id, aeb->lnum, 0, false); + if (err) + goto out_free; + } + + return 0; + +out_free: + wl_entry_destroy(ubi, e); + + return err; +} + +/** * ubi_wl_init - initialize the WL sub-system using attaching information. * @ubi: UBI device description object * @ai: attaching information @@ -1566,17 +1606,9 @@ int ubi_wl_init(struct ubi_device *ubi, list_for_each_entry_safe(aeb, tmp, &ai->erase, u.list) { cond_resched(); - e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL); - if (!e) - goto out_free; - - e->pnum = aeb->pnum; - e->ec = aeb->ec; - ubi->lookuptbl[e->pnum] = e; - if (schedule_erase(ubi, e, aeb->vol_id, aeb->lnum, 0, false)) { - wl_entry_destroy(ubi, e); + err = erase_aeb(ubi, aeb, false); + if (err) goto out_free; - } found_pebs++; } @@ -1635,6 +1667,8 @@ int ubi_wl_init(struct ubi_device *ubi, ubi_assert(!ubi->lookuptbl[e->pnum]); ubi->lookuptbl[e->pnum] = e; } else { + bool sync = false; + /* * Usually old Fastmap PEBs are scheduled for erasure * and we don't have to care about them but if we face @@ -1644,18 +1678,21 @@ int ubi_wl_init(struct ubi_device *ubi, if (ubi->lookuptbl[aeb->pnum]) continue; - e = kmem_cache_alloc(ubi_wl_entry_slab, GFP_KERNEL); - if (!e) - goto out_free; + /* + * The fastmap update code might not find a free PEB for + * writing the fastmap anchor to and then reuses the + * current fastmap anchor PEB. When this PEB gets erased + * and a power cut happens before it is written again we + * must make sure that the fastmap attach code doesn't + * find any outdated fastmap anchors, hence we erase the + * outdated fastmap anchor PEBs synchronously here. + */ + if (aeb->vol_id == UBI_FM_SB_VOLUME_ID) + sync = true; - e->pnum = aeb->pnum; - e->ec = aeb->ec; - ubi_assert(!ubi->lookuptbl[e->pnum]); - ubi->lookuptbl[e->pnum] = e; - if (schedule_erase(ubi, e, aeb->vol_id, aeb->lnum, 0, false)) { - wl_entry_destroy(ubi, e); + err = erase_aeb(ubi, aeb, sync); + if (err) goto out_free; - } } found_pebs++;