Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp529625yba; Mon, 1 Apr 2019 11:09:01 -0700 (PDT) X-Google-Smtp-Source: APXvYqwbuamH5Lbnw6jvQIuvs78OLgdb1XQB6mCmHoZwqLzt/MN/Zd3ZmiNg7liqChx3boBRRiFl X-Received: by 2002:a17:902:e60e:: with SMTP id cm14mr65635536plb.192.1554142141914; Mon, 01 Apr 2019 11:09:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554142141; cv=none; d=google.com; s=arc-20160816; b=lVnGaA42R+5Clq9f5ANpGFw7Bo5+Dblv2ZfCobJa9lt3uJFhBhy+JBCHT+tU9z3f/V FIZzvDPzXHnmMnzHzjagV3rHQon6KFu1q1jRgGxdNQ1dpz1rGEziBf1/jy5q0iFxOHog DvSN1L3tvhJhkxzTTcpSEeuSRftwTEUstziguvVMmTxRZt5z5ahbm5ujO2JqzX90GPiS 2fJRb+gzFEdhKhTdTXiVMNeQmrIYihWV2Txs7TUX9rljO6t+V+YJrjoYOZdEUaLDpee3 JbG6dcWvDlrT+zcMeQeGSVB1F/dHkFAU2A8lUZKEpN5PeO84kKSibE6r4cZUxQX3vqi0 RdXg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=9TxL2ZT/kluEXKjV6LugQNLHUEDs3vBGEU6IuXNu8fY=; b=AYm9al+8OXcWlTVhMjOjk1vRGz8g1nuDbubg+02gFqj9Esfohs+9or9CpCxQyVcxQp AH88BHz3bAZX/ZmxTjYlYZM9yghZRw3yLXy1B/iHPxb1oKYVhHn1d03aCZwrPiB+YUmb RKp1gzUjhw+UEZ+mDHPrqajSlG5J0loyUBD/UVH3t+3m6LGnoMF8SgnIJYdRGCFSsOEp JvLe+cjICNjiA2GnHwD/qT/JYJ7uRWGWyB/zmY9OOoujKvFO7rqb9Q/HcCTUfO5K+9pM c4VjBoa8aylm706URLI5x5z78wcVnplfchnhcloOpdRdCMxv/33z7Bt5U6SubF5EnTUp okIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=2t+Nm7St; 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 d2si10995460pfm.253.2019.04.01.11.08.46; Mon, 01 Apr 2019 11:09:01 -0700 (PDT) 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; dkim=pass header.i=@kernel.org header.s=default header.b=2t+Nm7St; 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 S1729677AbfDARKs (ORCPT + 99 others); Mon, 1 Apr 2019 13:10:48 -0400 Received: from mail.kernel.org ([198.145.29.99]:58754 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728931AbfDARKr (ORCPT ); Mon, 1 Apr 2019 13:10:47 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D33982192C; Mon, 1 Apr 2019 17:10:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554138646; bh=TBC3SizQ6f3AHiZwTr/ExnAdJk+ZvcvNTaprb7p7ts8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=2t+Nm7St5F7D/szHFGJrSy4TkOHsJmpIVHKMLUS4QryTj51qDRt/5xB3ggFJnS0t+ HaFAgUAGsRS3dbJFzGHsmNA2lrLnc69IidxKCOZCzoWP0izcJSiSXJQJZS7asf9QTK jkUTEaa6w/eB+UCET7GPtYt46xh+2QmS0eOJw2ro= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chao Yu , Gao Xiang Subject: [PATCH 5.0 088/146] staging: erofs: fix error handling when failed to read compresssed data Date: Mon, 1 Apr 2019 19:01:40 +0200 Message-Id: <20190401170056.262028451@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190401170048.449559024@linuxfoundation.org> References: <20190401170048.449559024@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 5.0-stable review patch. If anyone has any objections, please let me know. ------------------ From: Gao Xiang commit b6391ac73400eff38377a4a7364bd3df5efb5178 upstream. Complete read error handling paths for all three kinds of compressed pages: 1) For cache-managed pages, PG_uptodate will be checked since read_endio will unlock and SetPageUptodate for these pages; 2) For inplaced pages, read_endio cannot SetPageUptodate directly since it should be used to mark the final decompressed data, PG_error will be set with page locked for IO error instead; 3) For staging pages, PG_error is used, which is similar to what we do for inplaced pages. Fixes: 3883a79abd02 ("staging: erofs: introduce VLE decompression support") Cc: # 4.19+ Reviewed-by: Chao Yu Signed-off-by: Gao Xiang Signed-off-by: Greg Kroah-Hartman --- drivers/staging/erofs/unzip_vle.c | 41 +++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) --- a/drivers/staging/erofs/unzip_vle.c +++ b/drivers/staging/erofs/unzip_vle.c @@ -977,6 +977,7 @@ repeat: overlapped = false; compressed_pages = grp->compressed_pages; + err = 0; for (i = 0; i < clusterpages; ++i) { unsigned int pagenr; @@ -986,26 +987,39 @@ repeat: DBG_BUGON(!page); DBG_BUGON(!page->mapping); - if (z_erofs_is_stagingpage(page)) - continue; + if (!z_erofs_is_stagingpage(page)) { #ifdef EROFS_FS_HAS_MANAGED_CACHE - if (page->mapping == MNGD_MAPPING(sbi)) { - DBG_BUGON(!PageUptodate(page)); - continue; - } + if (page->mapping == MNGD_MAPPING(sbi)) { + if (unlikely(!PageUptodate(page))) + err = -EIO; + continue; + } #endif - /* only non-head page could be reused as a compressed page */ - pagenr = z_erofs_onlinepage_index(page); + /* + * only if non-head page can be selected + * for inplace decompression + */ + pagenr = z_erofs_onlinepage_index(page); + + DBG_BUGON(pagenr >= nr_pages); + DBG_BUGON(pages[pagenr]); + ++sparsemem_pages; + pages[pagenr] = page; - DBG_BUGON(pagenr >= nr_pages); - DBG_BUGON(pages[pagenr]); - ++sparsemem_pages; - pages[pagenr] = page; + overlapped = true; + } - overlapped = true; + /* PG_error needs checking for inplaced and staging pages */ + if (unlikely(PageError(page))) { + DBG_BUGON(PageUptodate(page)); + err = -EIO; + } } + if (unlikely(err)) + goto out; + llen = (nr_pages << PAGE_SHIFT) - work->pageofs; if (z_erofs_vle_workgrp_fmt(grp) == Z_EROFS_VLE_WORKGRP_FMT_PLAIN) { @@ -1203,6 +1217,7 @@ repeat: if (page->mapping == mc) { WRITE_ONCE(grp->compressed_pages[nr], page); + ClearPageError(page); if (!PagePrivate(page)) { /* * impossible to be !PagePrivate(page) for