From patchwork Tue Sep 16 20:32:15 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josef Bacik X-Patchwork-Id: 4920021 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.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 360BB9F349 for ; Tue, 16 Sep 2014 20:30:31 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id C7FA5201E4 for ; Tue, 16 Sep 2014 20:32:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C33D8201DD for ; Tue, 16 Sep 2014 20:32:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753558AbaIPUcT (ORCPT ); Tue, 16 Sep 2014 16:32:19 -0400 Received: from mx0a-00082601.pphosted.com ([67.231.145.42]:32706 "EHLO mx0a-00082601.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752198AbaIPUcS (ORCPT ); Tue, 16 Sep 2014 16:32:18 -0400 Received: from pps.filterd (m0004347 [127.0.0.1]) by m0004347.ppops.net (8.14.5/8.14.5) with SMTP id s8GKW8RY026582 for ; Tue, 16 Sep 2014 13:32:18 -0700 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=fb.com; h=from : to : subject : date : message-id : mime-version : content-type; s=facebook; bh=pSzD1leHD7FqrdVLw8QEHGA5XVmNiHAtNDcH+V8DtTU=; b=rM6rIH4AiK2/3Uyq/fyI/kBK/mysmN15x7GKospNw+zVAnmML0aWtifUh3ockCeNQfCu NJJi/u/EiacoB7f0Wsp6bKCtGNo0dWNMMbvgp6JTzORykXvkjoRGb9nUZmncllUyebXb D3Hk2oUNkG4K9iAegvHW/kKulnzhTbblrqk= Received: from mail.thefacebook.com (mailwest.thefacebook.com [173.252.71.148]) by m0004347.ppops.net with ESMTP id 1peevq9jma-1 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=OK) for ; Tue, 16 Sep 2014 13:32:18 -0700 Received: from localhost (192.168.57.29) by mail.thefacebook.com (192.168.16.21) with Microsoft SMTP Server (TLS) id 14.3.195.1; Tue, 16 Sep 2014 13:32:16 -0700 From: Josef Bacik To: Subject: [PATCH] Btrfs: try not to ENOSPC on log replay Date: Tue, 16 Sep 2014 16:32:15 -0400 Message-ID: <1410899535-20363-1-git-send-email-jbacik@fb.com> X-Mailer: git-send-email 1.8.3.1 MIME-Version: 1.0 X-Originating-IP: [192.168.57.29] X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:5.12.52, 1.0.28, 0.0.0000 definitions=2014-09-16_06:2014-09-16, 2014-09-16, 1970-01-01 signatures=0 X-Proofpoint-Spam-Details: rule=fb_default_notspam policy=fb_default score=0 spamscore=0 suspectscore=3 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=7.0.1-1402240000 definitions=main-1409160169 X-FB-Internal: deliver Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=ham 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 When doing log replay we may have to update inodes, which traditionally goes through our delayed inode stuff. This will try to move space over from the trans handle, but we don't reserve space in our trans handle on replay since we don't know how much we will need, so instead we try to flush. But because we have a trans handle open we won't flush anything, so if we are out of reserve space we will simply return ENOSPC. Since we know that if an operation made it into the log then we definitely had space before the box bought the farm then we don't need to worry about doing this space reservation. Just set a flag saying we are doing log replay and update the tree directly and bypass the reservation code altogether. This will keep us from ENOSP'ing during log replay. Thanks, Signed-off-by: Josef Bacik --- fs/btrfs/inode.c | 3 ++- fs/btrfs/transaction.c | 1 + fs/btrfs/transaction.h | 1 + fs/btrfs/tree-log.c | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 28e693e..dfdc656 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c @@ -3705,7 +3705,8 @@ noinline int btrfs_update_inode(struct btrfs_trans_handle *trans, * without delay */ if (!btrfs_is_free_space_inode(inode) - && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID) { + && root->root_key.objectid != BTRFS_DATA_RELOC_TREE_OBJECTID + && !trans->log_replay) { btrfs_update_root_times(trans, root); ret = btrfs_delayed_update_inode(trans, root, inode); diff --git a/fs/btrfs/transaction.c b/fs/btrfs/transaction.c index 16d0c1b..1676c5d 100644 --- a/fs/btrfs/transaction.c +++ b/fs/btrfs/transaction.c @@ -486,6 +486,7 @@ again: h->allocating_chunk = false; h->reloc_reserved = false; h->sync = false; + h->log_replay = false; INIT_LIST_HEAD(&h->qgroup_ref_list); INIT_LIST_HEAD(&h->new_bgs); diff --git a/fs/btrfs/transaction.h b/fs/btrfs/transaction.h index 579be51..924cd1f 100644 --- a/fs/btrfs/transaction.h +++ b/fs/btrfs/transaction.h @@ -97,6 +97,7 @@ struct btrfs_trans_handle { bool allocating_chunk; bool reloc_reserved; bool sync; + bool log_replay; unsigned int type; /* * this root is only needed to validate that the root passed to diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c index dce33b5..ba31dd9 100644 --- a/fs/btrfs/tree-log.c +++ b/fs/btrfs/tree-log.c @@ -4353,6 +4353,7 @@ int btrfs_recover_log_trees(struct btrfs_root *log_root_tree) ret = PTR_ERR(trans); goto error; } + trans->log_replay = true; wc.trans = trans; wc.pin = 1;