From patchwork Tue Feb 24 10:47:06 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Omar Sandoval X-Patchwork-Id: 5871971 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id EF5529F169 for ; Tue, 24 Feb 2015 10:48:40 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2BAAA2063B for ; Tue, 24 Feb 2015 10:48:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3D43B20630 for ; Tue, 24 Feb 2015 10:48:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932099AbbBXKrs (ORCPT ); Tue, 24 Feb 2015 05:47:48 -0500 Received: from mail-pd0-f169.google.com ([209.85.192.169]:45801 "EHLO mail-pd0-f169.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753575AbbBXKrb (ORCPT ); Tue, 24 Feb 2015 05:47:31 -0500 Received: by pdjz10 with SMTP id z10so32473589pdj.12 for ; Tue, 24 Feb 2015 02:47:30 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:in-reply-to:references; bh=fhs+LXBQr8dueq45qZx4HhINh3us5WSKaZGO/Ud8KCA=; b=BXz94HbvBaFbV8pf3IiBGq28IqgjfueDE1scsinsxZxZed56BOV9zfTnZzXVLX1lIi VCIcqIsB/aR3eajXPkbsRNfP6ZOCvHvGMhvujzLGCB6JIBwqe0MTzulo05RAolIB9JqH RQEV0uhp/Zr1GFR1ou6r4yesFfNtqte9D9BfA0RQHJTFv8g68YoF8JBzr5VkSSd90yxB uE2h8zZHeuQmuyq+vA/4+R3WT3hWAuILOXFdS8XHMre+KOW/yQYFh6ln/MNUBYb7Y96A rDRJPiLX+HkYlj5U03sHWaOZPyXV/4cUai32ilmwopXhO6DxIyY5tgaNaMMHvjlzyqnG 5fJQ== X-Gm-Message-State: ALoCoQlQbZ9GzUtac/STtTnCrM5ABxp28cPBNhQUN3HHVZqEMwucXloTPnrGPukOlkDHxTshKnVa X-Received: by 10.66.158.200 with SMTP id ww8mr18985505pab.45.1424774850653; Tue, 24 Feb 2015 02:47:30 -0800 (PST) Received: from mew.localdomain (c-76-104-211-44.hsd1.wa.comcast.net. [76.104.211.44]) by mx.google.com with ESMTPSA id gi3sm37695878pbc.83.2015.02.24.02.47.29 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 24 Feb 2015 02:47:29 -0800 (PST) From: Omar Sandoval To: Chris Mason , Josef Bacik , David Sterba Cc: linux-btrfs@vger.kernel.org, linux-kernel@vger.kernel.org, Omar Sandoval Subject: [PATCH v2 3/3] btrfs: check io_ctl_prepare_pages return in __btrfs_write_out_cache Date: Tue, 24 Feb 2015 02:47:06 -0800 Message-Id: <5aa522a2a863d3cf6805f331932e503a37eeae66.1424773781.git.osandov@osandov.com> X-Mailer: git-send-email 2.3.0 In-Reply-To: References: In-Reply-To: References: Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP If io_ctl_prepare_pages fails, the pages in io_ctl.pages are not valid. When we try to access them later, things will blow up in various ways. Also fix the comment about the return value, which is an errno on error, not -1, and update the cases where it was not. Reviewed-by: Liu Bo Signed-off-by: Omar Sandoval --- fs/btrfs/free-space-cache.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/fs/btrfs/free-space-cache.c b/fs/btrfs/free-space-cache.c index a719785..03dcda2 100644 --- a/fs/btrfs/free-space-cache.c +++ b/fs/btrfs/free-space-cache.c @@ -1112,7 +1112,7 @@ cleanup_write_cache_enospc(struct inode *inode, * * This function writes out a free space cache struct to disk for quick recovery * on mount. This will return 0 if it was successfull in writing the cache out, - * and -1 if it was not. + * or an errno if it was not. */ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, struct btrfs_free_space_ctl *ctl, @@ -1128,11 +1128,11 @@ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, int ret; if (!i_size_read(inode)) - return -1; + return -EIO; ret = io_ctl_init(&io_ctl, inode, root, 1); if (ret) - return -1; + return ret; if (block_group && (block_group->flags & BTRFS_BLOCK_GROUP_DATA)) { down_write(&block_group->data_rwsem); @@ -1149,7 +1149,9 @@ static int __btrfs_write_out_cache(struct btrfs_root *root, struct inode *inode, } /* Lock all pages first so we can lock the extent safely. */ - io_ctl_prepare_pages(&io_ctl, inode, 0); + ret = io_ctl_prepare_pages(&io_ctl, inode, 0); + if (ret) + goto out; lock_extent_bits(&BTRFS_I(inode)->io_tree, 0, i_size_read(inode) - 1, 0, &cached_state);