Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp520838yba; Mon, 1 Apr 2019 10:58:54 -0700 (PDT) X-Google-Smtp-Source: APXvYqy1GHYlnKKF0jK9QpfX+/2mQCiL56GkN+OAfoCI+780lTQNY7NufqYhkUasv0SYppWUTVMr X-Received: by 2002:a17:902:123:: with SMTP id 32mr65034527plb.187.1554141533957; Mon, 01 Apr 2019 10:58:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554141533; cv=none; d=google.com; s=arc-20160816; b=kfG/g6tRh2Ijq3R04/EKzBaf8vc5NpG6EZXNN0vCZcjJhjb243lEZYMHRnzM8V9kzw SrLIfGYSp9uMJOsW6f2p2uMPogewuyfb6snWhCqhpb2//JaQkr7B/8wAv5KfG5/lvuFW ZpVVRDA9Ub/HI7NzVJ86mXz8JB0OuVea+Cpy8Mz6ggfLqfcBLAAW71IJfXBrvxL8+/7b ES8Xg1X/Frm2yZmFYp3gUyuve8NTA3M5c8zEbPRmQ6bhjyUv1YfiEg/KxRoxk39Yov8W t7oWzFzem0oyI/0Twxt3ev+YYO85VyyyQBsJTnGEkJ6y/hWDlKTeOeoEzK2Kq2fIbe5G LkWA== 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=CbEoI1uR4eTiuFu4C6MyRJ8Xwu02eyeJSRbrYL6UaTA=; b=jSptxUiOF/x3xqjMO9Fc3ceepAgECYrL9Ncd79fIxNVnkCqFGoo/BojJt5B+zIL+2B +fGPI9dsV0zlLJEi5EmiVEwvSkT2AJ0zqwvpTPmiEP4IeIvAS1w0Qmu9uWv3ShcYXmDg jQnRLaga7eidfvH2IkptrCG8PY9hrS58KghYlW/1oQThzE6SOWOdM0RJSmy58pAC90Ut odSAoONorF5vX+wDl2yt86II3xk/7LfKkIoUgq+/5jR8AzpbMZF6nkCeqWapsI7KaX9Z kshKrbAIVyT/AuOr7UvbM9WFg76HAqdG3qJ4Oez0aPdp0bnGliHJ/ptUU7MPaLEl6QA5 60iA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b="T7uxSyM/"; 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 l10si9113969pfb.283.2019.04.01.10.58.38; Mon, 01 Apr 2019 10:58:53 -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="T7uxSyM/"; 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 S1731466AbfDARTF (ORCPT + 99 others); Mon, 1 Apr 2019 13:19:05 -0400 Received: from mail.kernel.org ([198.145.29.99]:46720 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731460AbfDARTC (ORCPT ); Mon, 1 Apr 2019 13:19:02 -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 A07CD206DD; Mon, 1 Apr 2019 17:19:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1554139141; bh=U/99LEtKOBrVUzBXZGmLjgVRCbt4xL98oiDgLg/IuZE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T7uxSyM/P/iTcvXOdy1nFi3TBJhrRTP79G4uQHaEJaSG+CzF0jQNZ8cGl98wJB0GY SXo8desvlAdl1vuPYIfYBNckNynjbMUQHDe0ttahPc7wtrmVNbDshNKznS5srCZjkR /TLZAcgr4gmQX/i5MLm/2p1U4gHnNo/UlkLmAAt0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Chao Yu , Gao Xiang Subject: [PATCH 4.19 126/134] staging: erofs: fix error handling when failed to read compresssed data Date: Mon, 1 Apr 2019 19:02:42 +0200 Message-Id: <20190401170056.032273815@linuxfoundation.org> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190401170044.243719205@linuxfoundation.org> References: <20190401170044.243719205@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 4.19-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 | 42 ++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 13 deletions(-) --- a/drivers/staging/erofs/unzip_vle.c +++ b/drivers/staging/erofs/unzip_vle.c @@ -885,6 +885,7 @@ repeat: overlapped = false; compressed_pages = grp->compressed_pages; + err = 0; for (i = 0; i < clusterpages; ++i) { unsigned pagenr; @@ -894,26 +895,39 @@ repeat: DBG_BUGON(page == NULL); DBG_BUGON(page->mapping == NULL); - if (z_erofs_is_stagingpage(page)) - continue; + if (!z_erofs_is_stagingpage(page)) { #ifdef EROFS_FS_HAS_MANAGED_CACHE - if (page->mapping == mngda) { - DBG_BUGON(!PageUptodate(page)); - continue; - } + if (page->mapping == mngda) { + 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) { @@ -1082,6 +1096,8 @@ static inline bool recover_managed_page( return true; lock_page(page); + ClearPageError(page); + if (unlikely(!PagePrivate(page))) { set_page_private(page, (unsigned long)grp); SetPagePrivate(page);