From patchwork Wed Sep 25 21:32:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11161393 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 8491A13BD for ; Wed, 25 Sep 2019 21:32:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6361721D81 for ; Wed, 25 Sep 2019 21:32:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="ZOKoKQAn" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726804AbfIYVcP (ORCPT ); Wed, 25 Sep 2019 17:32:15 -0400 Received: from aserp2120.oracle.com ([141.146.126.78]:40728 "EHLO aserp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726807AbfIYVcO (ORCPT ); Wed, 25 Sep 2019 17:32:14 -0400 Received: from pps.filterd (aserp2120.oracle.com [127.0.0.1]) by aserp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTAoQ005782; Wed, 25 Sep 2019 21:32:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=X03hFLjB8Ecj9SdiHH3fnLrb2/OlmDrVBacZeh7VE0M=; b=ZOKoKQAnrieeRxwjiQtOekFipnf6r09FkSGGqBH1KDPxSBIfzzEdPSMOdzkgeSdXBc4E HDML7hSneFAz9dGCGrQD7kMqHDeMkUhvi/SsO469uTrXHaoLlx4SY7hFeQ+1TfiJFndw lOrMXvogSP+5KbpN3nHa3QvrlRgG9wYO3t/Fk7nzbk7xoHuXOKdjPeR6gbVPNG8sk/mr DP0IorwaOPzBNHT2DqPHqgrEYRhOq0CRAZH5K6RqMYPUkq+lqtXNsRYyYRMjPSZGBgq+ R4xXPU/MVg0zYOOnBPqC8lO35nw9Ixcga/TFmMPHiyikwSuPHgJW/xwkyXOzuO3Prn6M ZA== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by aserp2120.oracle.com with ESMTP id 2v5btq7hd4-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:09 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTNTL194334; Wed, 25 Sep 2019 21:32:09 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3030.oracle.com with ESMTP id 2v829w4us8-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:09 +0000 Received: from abhmp0010.oracle.com (abhmp0010.oracle.com [141.146.116.16]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x8PLW8Fc013731; Wed, 25 Sep 2019 21:32:08 GMT Received: from localhost (/10.145.178.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2019 14:32:07 -0700 Subject: [PATCH 1/4] libxfs: fix uncached buffer refcounting From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig Date: Wed, 25 Sep 2019 14:32:06 -0700 Message-ID: <156944712636.296397.6579640879501932501.stgit@magnolia> In-Reply-To: <156944712040.296397.10216531793013990772.stgit@magnolia> References: <156944712040.296397.10216531793013990772.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Currently, uncached buffers in userspace are created with zero refcount and are fed to cache_node_put when they're released. This is totally broken -- the refcount should be 1 (because the caller now holds a reference) and we should never be dumping uncached buffers into the cache. Fix both of these problems. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_io.h | 18 ++++++++++++++++++ libxfs/libxfs_priv.h | 2 -- libxfs/rdwr.c | 5 ++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h index 0b8d9774..7dcb4bff 100644 --- a/libxfs/libxfs_io.h +++ b/libxfs/libxfs_io.h @@ -227,4 +227,22 @@ xfs_buf_associate_memory(struct xfs_buf *bp, void *mem, size_t len) return 0; } +/* + * Allocate an uncached buffer that points nowhere. The refcount will be 1, + * and the cache node hash list will be empty to indicate that it's uncached. + */ +static inline struct xfs_buf * +xfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags) +{ + struct xfs_buf *bp; + + bp = libxfs_getbufr(targ, XFS_BUF_DADDR_NULL, bblen); + if (!bp) + return NULL; + + INIT_LIST_HEAD(&bp->b_node.cn_hash); + bp->b_node.cn_count = 1; + return bp; +} + #endif /* __LIBXFS_IO_H__ */ diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 96d74bfa..b05e082a 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -379,8 +379,6 @@ roundup_64(uint64_t x, uint32_t y) (len) = __bar; /* no set-but-unused warning */ \ NULL; \ }) -#define xfs_buf_get_uncached(t,n,f) \ - libxfs_getbufr((t), XFS_BUF_DADDR_NULL, (n)); #define xfs_buf_relse(bp) libxfs_putbuf(bp) #define xfs_buf_get(devp,blkno,len) (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(bp) libxfs_writebuf((bp), 0) diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 1f2c129b..3282f6de 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -867,7 +867,10 @@ libxfs_putbuf(xfs_buf_t *bp) } } - cache_node_put(libxfs_bcache, (struct cache_node *)bp); + if (!list_empty(&bp->b_node.cn_hash)) + cache_node_put(libxfs_bcache, (struct cache_node *)bp); + else if (--bp->b_node.cn_count == 0) + libxfs_putbufr(bp); } void From patchwork Wed Sep 25 21:32:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11161395 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id CF18E14DB for ; Wed, 25 Sep 2019 21:32:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id AE3C021E6F for ; Wed, 25 Sep 2019 21:32:20 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="rL/cU/V1" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726817AbfIYVcU (ORCPT ); Wed, 25 Sep 2019 17:32:20 -0400 Received: from userp2120.oracle.com ([156.151.31.85]:56198 "EHLO userp2120.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726808AbfIYVcU (ORCPT ); Wed, 25 Sep 2019 17:32:20 -0400 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTG6k050686; Wed, 25 Sep 2019 21:32:15 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=49tm2aKcDFlLPoWd3aYMcNWLlMIIeQl9xfm45RAks24=; b=rL/cU/V10cSmmOg55WUblzlDbHSbxiDXUmGLlCG00OkBnhctG3R6x5Z7NRyhRuq2lc3Z XSnu/LoE6BAoarI4e6oe6vNzfrQ0ZBxsG0mIQw/9hl2OyzJ2srWNdk7+MFEz3JqtmqUS pV9oGXA889SpdbXvRy9s2/MsmejrAO6YrRYusgMNZZFUNJm9xcwTbXzSoRNk8pZXx/9l XutRmQSMuTqBAESBmfYExURwoWqzu5Zd0xr3a04bA1uZjqFuVT+zEDEtmdMh1M2XqLcI Xpp97BU6hZafpt10OMnWdWY4gKedJXTe5CDeVaneXDF9EVe19ozvjwNTvRo/aDNJ/WF9 6g== Received: from userp3030.oracle.com (userp3030.oracle.com [156.151.31.80]) by userp2120.oracle.com with ESMTP id 2v5cgr7ej5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:15 +0000 Received: from pps.filterd (userp3030.oracle.com [127.0.0.1]) by userp3030.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTNSC194323; Wed, 25 Sep 2019 21:32:14 GMT Received: from userv0122.oracle.com (userv0122.oracle.com [156.151.31.75]) by userp3030.oracle.com with ESMTP id 2v829w4uxd-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:14 +0000 Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by userv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x8PLWEAH013866; Wed, 25 Sep 2019 21:32:14 GMT Received: from localhost (/10.145.178.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2019 14:32:13 -0700 Subject: [PATCH 2/4] libxfs: fix buffer refcounting in delwri_queue From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig Date: Wed, 25 Sep 2019 14:32:12 -0700 Message-ID: <156944713252.296397.10857029102757641618.stgit@magnolia> In-Reply-To: <156944712040.296397.10216531793013990772.stgit@magnolia> References: <156944712040.296397.10216531793013990772.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong In the kernel, xfs_buf_delwri_queue increments the buffer reference count before putting the buffer on the buffer list, and the refcount is decremented after the io completes for a net refcount change of zero. In userspace, delwri_queue calls libxfs_writebuf, which puts the buffer. delwri_queue is a no-op, for a net refcount change of -1. This creates problems for any callers that expect a net change of zero, so increment the buffer refcount before calling writebuf. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_io.h | 7 +++++++ libxfs/libxfs_priv.h | 1 - 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h index 7dcb4bff..09ed043b 100644 --- a/libxfs/libxfs_io.h +++ b/libxfs/libxfs_io.h @@ -245,4 +245,11 @@ xfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags) return bp; } +static inline void +xfs_buf_delwri_queue(struct xfs_buf *bp, struct list_head *buffer_list) +{ + bp->b_node.cn_count++; + libxfs_writebuf(bp, 0); +} + #endif /* __LIBXFS_IO_H__ */ diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index b05e082a..13dab58a 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -382,7 +382,6 @@ roundup_64(uint64_t x, uint32_t y) #define xfs_buf_relse(bp) libxfs_putbuf(bp) #define xfs_buf_get(devp,blkno,len) (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(bp) libxfs_writebuf((bp), 0) -#define xfs_buf_delwri_queue(bp, bl) libxfs_writebuf((bp), 0) #define xfs_buf_delwri_submit(bl) (0) #define xfs_buf_oneshot(bp) ((void) 0) From patchwork Wed Sep 25 21:32:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11161419 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id C8ABA14E5 for ; Wed, 25 Sep 2019 21:34:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 9DFE821D80 for ; Wed, 25 Sep 2019 21:34:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="OT2CNjgI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727395AbfIYVe2 (ORCPT ); Wed, 25 Sep 2019 17:34:28 -0400 Received: from userp2130.oracle.com ([156.151.31.86]:36974 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727058AbfIYVe1 (ORCPT ); Wed, 25 Sep 2019 17:34:27 -0400 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLYNU1057952; Wed, 25 Sep 2019 21:34:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=uP4IyuRfuHCEAChnI0vS0qLm57WFRpeJa8Q+yl7RFu4=; b=OT2CNjgI8w+cXYTSIUd9Skr7WhhBfkzxX3vS3hoC3Yy0VDycBanckSh47bXBtPM3xyts JuIMeTHizhq3r08z4mDVL+B5Yq1TORtVdcVeoDQDk5jldB68gs8YRto3ug6AfJEZpvtL ZOCI3xh9hIw/SP5CEzV+6tIWkuDdaepYDkB93qXMB1qX48hFrHsMvqniVlcMUHuYk1FU zqbwSw9UreG9NTlW/VCWmVlxV/qJ1Nl5JUjSZViwXmrhj+3ExEzgLdLXl90IIFWZcVyV l4tWJ1jHk63xsgOZj/8p7KZ42N3oKNKeeCpqVVj3gIG066zzVJOZq/iYQIR6sPW3PkzR /g== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by userp2130.oracle.com with ESMTP id 2v5b9tygwm-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:34:23 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTESK011719; Wed, 25 Sep 2019 21:32:21 GMT Received: from userv0121.oracle.com (userv0121.oracle.com [156.151.31.72]) by aserp3020.oracle.com with ESMTP id 2v7vnyuk3n-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:21 +0000 Received: from abhmp0004.oracle.com (abhmp0004.oracle.com [141.146.116.10]) by userv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x8PLWKXZ013196; Wed, 25 Sep 2019 21:32:20 GMT Received: from localhost (/10.145.178.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2019 14:32:19 -0700 Subject: [PATCH 3/4] libxfs: make xfs_buf_delwri_submit actually do something From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig Date: Wed, 25 Sep 2019 14:32:18 -0700 Message-ID: <156944713860.296397.552937074569500727.stgit@magnolia> In-Reply-To: <156944712040.296397.10216531793013990772.stgit@magnolia> References: <156944712040.296397.10216531793013990772.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=2 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250174 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong xfs_buf_delwri_queue doesn't report errors, which means that if the buffer write fails we have no way of knowing that something bad happened. In the kernel we queue and then submit buffers, and the submit call communicates errors to callers. Do the same here since we're going to start using the AG header initialization functions, which use delwri_{queue,submit} heavily. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- libxfs/libxfs_io.h | 6 +++++- libxfs/libxfs_priv.h | 1 - libxfs/rdwr.c | 25 +++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 2 deletions(-) diff --git a/libxfs/libxfs_io.h b/libxfs/libxfs_io.h index 09ed043b..579df52b 100644 --- a/libxfs/libxfs_io.h +++ b/libxfs/libxfs_io.h @@ -71,6 +71,7 @@ typedef struct xfs_buf { struct xfs_buf_map *b_maps; struct xfs_buf_map __b_map; int b_nmaps; + struct list_head b_list; #ifdef XFS_BUF_TRACING struct list_head b_lock_list; const char *b_func; @@ -245,11 +246,14 @@ xfs_buf_get_uncached(struct xfs_buftarg *targ, size_t bblen, int flags) return bp; } +/* Push a single buffer on a delwri queue. */ static inline void xfs_buf_delwri_queue(struct xfs_buf *bp, struct list_head *buffer_list) { bp->b_node.cn_count++; - libxfs_writebuf(bp, 0); + list_add_tail(&bp->b_list, buffer_list); } +int xfs_buf_delwri_submit(struct list_head *buffer_list); + #endif /* __LIBXFS_IO_H__ */ diff --git a/libxfs/libxfs_priv.h b/libxfs/libxfs_priv.h index 13dab58a..ff35c51e 100644 --- a/libxfs/libxfs_priv.h +++ b/libxfs/libxfs_priv.h @@ -382,7 +382,6 @@ roundup_64(uint64_t x, uint32_t y) #define xfs_buf_relse(bp) libxfs_putbuf(bp) #define xfs_buf_get(devp,blkno,len) (libxfs_getbuf((devp), (blkno), (len))) #define xfs_bwrite(bp) libxfs_writebuf((bp), 0) -#define xfs_buf_delwri_submit(bl) (0) #define xfs_buf_oneshot(bp) ((void) 0) #define XBRW_READ LIBXFS_BREAD diff --git a/libxfs/rdwr.c b/libxfs/rdwr.c index 3282f6de..0d3e6089 100644 --- a/libxfs/rdwr.c +++ b/libxfs/rdwr.c @@ -1473,3 +1473,28 @@ libxfs_irele( libxfs_idestroy(ip); kmem_zone_free(xfs_inode_zone, ip); } + +/* + * Write out a buffer list synchronously. + * + * This will take the @buffer_list, write all buffers out and wait for I/O + * completion on all of the buffers. @buffer_list is consumed by the function, + * so callers must have some other way of tracking buffers if they require such + * functionality. + */ +int +xfs_buf_delwri_submit( + struct list_head *buffer_list) +{ + struct xfs_buf *bp, *n; + int error = 0, error2; + + list_for_each_entry_safe(bp, n, buffer_list, b_list) { + list_del_init(&bp->b_list); + error2 = libxfs_writebuf(bp, 0); + if (!error) + error = error2; + } + + return error; +} From patchwork Wed Sep 25 21:32:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Darrick J. Wong" X-Patchwork-Id: 11161399 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id F042113BD for ; Wed, 25 Sep 2019 21:32:34 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id BD67921E6F for ; Wed, 25 Sep 2019 21:32:34 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=oracle.com header.i=@oracle.com header.b="KJnPuaYu" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726830AbfIYVce (ORCPT ); Wed, 25 Sep 2019 17:32:34 -0400 Received: from userp2130.oracle.com ([156.151.31.86]:34994 "EHLO userp2130.oracle.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726808AbfIYVce (ORCPT ); Wed, 25 Sep 2019 17:32:34 -0400 Received: from pps.filterd (userp2130.oracle.com [127.0.0.1]) by userp2130.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTGZO053890; Wed, 25 Sep 2019 21:32:29 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : from : to : cc : date : message-id : in-reply-to : references : mime-version : content-type : content-transfer-encoding; s=corp-2019-08-05; bh=Dycnl933oLH8Ajj6s/0zroM1vbcvSfmG1ehoVYrHB78=; b=KJnPuaYuyA6NkHr5H2NpgSb/SMZVWDp9hYf099Fs1zxbKTY6xku8p3vuE8Fb7T0ubNpu ox02A4kzwKla3fy8tzml20VqfFPjpQwpSNcQmcru1tYKIybspeU4eXeQzlQgCuObI6Dy kPQx0/4wWGvcFVY4unRdj7mIsLE2t89MCUW1WgJPpnIU3ZfzWYCTcDSKiEu3yjJXI1Zv YlsZidODu10Y6bZrsGk4NUJ+YYJNe95uAK3oY6ek+kSuNHIY9LLe0MdRqvHNuB4kg8qQ ZCrT6UriQ6gIrcZZctbE9IgTaAx2MHb0d/v3oZxgUtdMeKt8Z3pACr9nv3NmwvGCiGZG pA== Received: from aserp3020.oracle.com (aserp3020.oracle.com [141.146.126.70]) by userp2130.oracle.com with ESMTP id 2v5b9tygqk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:29 +0000 Received: from pps.filterd (aserp3020.oracle.com [127.0.0.1]) by aserp3020.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x8PLTESQ011719; Wed, 25 Sep 2019 21:32:28 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserp3020.oracle.com with ESMTP id 2v7vnyuk9x-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 25 Sep 2019 21:32:28 +0000 Received: from abhmp0015.oracle.com (abhmp0015.oracle.com [141.146.116.21]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id x8PLWQPf013856; Wed, 25 Sep 2019 21:32:26 GMT Received: from localhost (/10.145.178.55) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 25 Sep 2019 14:32:26 -0700 Subject: [PATCH 4/4] mkfs: use libxfs to write out new AGs From: "Darrick J. Wong" To: sandeen@sandeen.net, darrick.wong@oracle.com Cc: linux-xfs@vger.kernel.org, Christoph Hellwig Date: Wed, 25 Sep 2019 14:32:24 -0700 Message-ID: <156944714471.296397.1482817288636439627.stgit@magnolia> In-Reply-To: <156944712040.296397.10216531793013990772.stgit@magnolia> References: <156944712040.296397.10216531793013990772.stgit@magnolia> User-Agent: StGit/0.17.1-dirty MIME-Version: 1.0 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 suspectscore=2 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 X-Proofpoint-Virus-Version: vendor=nai engine=6000 definitions=9391 signatures=668685 X-Proofpoint-Spam-Details: rule=notspam policy=default score=0 priorityscore=1501 malwarescore=0 suspectscore=2 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 mlxscore=0 impostorscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1908290000 definitions=main-1909250173 Sender: linux-xfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Darrick J. Wong Use the libxfs AG initialization functions to write out the new filesystem instead of open-coding everything. Signed-off-by: Darrick J. Wong Reviewed-by: Christoph Hellwig --- include/libxfs.h | 1 libxfs/libxfs_api_defs.h | 3 libxfs/util.c | 1 mkfs/xfs_mkfs.c | 371 ++++------------------------------------------ 4 files changed, 41 insertions(+), 335 deletions(-) diff --git a/include/libxfs.h b/include/libxfs.h index 663063bc..63696df5 100644 --- a/include/libxfs.h +++ b/include/libxfs.h @@ -63,6 +63,7 @@ extern uint32_t crc32c_le(uint32_t crc, unsigned char const *p, size_t len); #include "xfs_bmap.h" #include "xfs_trace.h" #include "xfs_trans.h" +#include "xfs_ag.h" #include "xfs_rmap_btree.h" #include "xfs_rmap.h" #include "xfs_refcount_btree.h" diff --git a/libxfs/libxfs_api_defs.h b/libxfs/libxfs_api_defs.h index 0ae21318..645c9b1b 100644 --- a/libxfs/libxfs_api_defs.h +++ b/libxfs/libxfs_api_defs.h @@ -154,4 +154,7 @@ #define LIBXFS_ATTR_CREATE ATTR_CREATE #define LIBXFS_ATTR_REPLACE ATTR_REPLACE +#define xfs_ag_init_headers libxfs_ag_init_headers +#define xfs_buf_delwri_submit libxfs_buf_delwri_submit + #endif /* __LIBXFS_API_DEFS_H__ */ diff --git a/libxfs/util.c b/libxfs/util.c index 95054094..885dd42b 100644 --- a/libxfs/util.c +++ b/libxfs/util.c @@ -762,3 +762,4 @@ xfs_fs_mark_healthy( spin_unlock(&mp->m_sb_lock); } +void xfs_ag_geom_health(struct xfs_perag *pag, struct xfs_ag_geometry *ageo) { } diff --git a/mkfs/xfs_mkfs.c b/mkfs/xfs_mkfs.c index 6254fd42..10a40cd4 100644 --- a/mkfs/xfs_mkfs.c +++ b/mkfs/xfs_mkfs.c @@ -3430,349 +3430,30 @@ initialise_ag_headers( struct xfs_mount *mp, struct xfs_sb *sbp, xfs_agnumber_t agno, - int *worst_freelist) + int *worst_freelist, + struct list_head *buffer_list) { + struct aghdr_init_data id = { + .agno = agno, + .agsize = cfg->agsize, + }; struct xfs_perag *pag = libxfs_perag_get(mp, agno); - struct xfs_agfl *agfl; - struct xfs_agf *agf; - struct xfs_agi *agi; - struct xfs_buf *buf; - struct xfs_btree_block *block; - struct xfs_alloc_rec *arec; - struct xfs_alloc_rec *nrec; - int bucket; - uint64_t agsize = cfg->agsize; - xfs_agblock_t agblocks; - bool is_log_ag = false; - int c; - - if (cfg->loginternal && agno == cfg->logagno) - is_log_ag = true; - - /* - * Superblock. - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_SB_DADDR), - XFS_FSS_TO_BB(mp, 1)); - buf->b_ops = &xfs_sb_buf_ops; - memset(buf->b_addr, 0, cfg->sectorsize); - libxfs_sb_to_disk(buf->b_addr, sbp); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); + int error; - /* - * AG header block: freespace - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1)); - buf->b_ops = &xfs_agf_buf_ops; - agf = XFS_BUF_TO_AGF(buf); - memset(agf, 0, cfg->sectorsize); if (agno == cfg->agcount - 1) - agsize = cfg->dblocks - (xfs_rfsblock_t)(agno * agsize); - agf->agf_magicnum = cpu_to_be32(XFS_AGF_MAGIC); - agf->agf_versionnum = cpu_to_be32(XFS_AGF_VERSION); - agf->agf_seqno = cpu_to_be32(agno); - agf->agf_length = cpu_to_be32(agsize); - agf->agf_roots[XFS_BTNUM_BNOi] = cpu_to_be32(XFS_BNO_BLOCK(mp)); - agf->agf_roots[XFS_BTNUM_CNTi] = cpu_to_be32(XFS_CNT_BLOCK(mp)); - agf->agf_levels[XFS_BTNUM_BNOi] = cpu_to_be32(1); - agf->agf_levels[XFS_BTNUM_CNTi] = cpu_to_be32(1); - pag->pagf_levels[XFS_BTNUM_BNOi] = 1; - pag->pagf_levels[XFS_BTNUM_CNTi] = 1; - - if (xfs_sb_version_hasrmapbt(sbp)) { - agf->agf_roots[XFS_BTNUM_RMAPi] = cpu_to_be32(XFS_RMAP_BLOCK(mp)); - agf->agf_levels[XFS_BTNUM_RMAPi] = cpu_to_be32(1); - agf->agf_rmap_blocks = cpu_to_be32(1); - } + id.agsize = cfg->dblocks - (xfs_rfsblock_t)(agno * cfg->agsize); - if (xfs_sb_version_hasreflink(sbp)) { - agf->agf_refcount_root = cpu_to_be32(libxfs_refc_block(mp)); - agf->agf_refcount_level = cpu_to_be32(1); - agf->agf_refcount_blocks = cpu_to_be32(1); + INIT_LIST_HEAD(&id.buffer_list); + error = -libxfs_ag_init_headers(mp, &id); + if (error) { + fprintf(stderr, _("AG header init failed, error %d\n"), error); + exit(1); } - agf->agf_flfirst = 0; - agf->agf_fllast = cpu_to_be32(libxfs_agfl_size(mp) - 1); - agf->agf_flcount = 0; - agblocks = (xfs_agblock_t)(agsize - libxfs_prealloc_blocks(mp)); - agf->agf_freeblks = cpu_to_be32(agblocks); - agf->agf_longest = cpu_to_be32(agblocks); + list_splice_tail_init(&id.buffer_list, buffer_list); - if (xfs_sb_version_hascrc(sbp)) - platform_uuid_copy(&agf->agf_uuid, &sbp->sb_uuid); - - if (is_log_ag) { - be32_add_cpu(&agf->agf_freeblks, -(int64_t)cfg->logblocks); - agf->agf_longest = cpu_to_be32(agsize - - XFS_FSB_TO_AGBNO(mp, cfg->logstart) - cfg->logblocks); - } if (libxfs_alloc_min_freelist(mp, pag) > *worst_freelist) *worst_freelist = libxfs_alloc_min_freelist(mp, pag); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * AG freelist header block - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1)); - buf->b_ops = &xfs_agfl_buf_ops; - agfl = XFS_BUF_TO_AGFL(buf); - /* setting to 0xff results in initialisation to NULLAGBLOCK */ - memset(agfl, 0xff, cfg->sectorsize); - if (xfs_sb_version_hascrc(sbp)) { - agfl->agfl_magicnum = cpu_to_be32(XFS_AGFL_MAGIC); - agfl->agfl_seqno = cpu_to_be32(agno); - platform_uuid_copy(&agfl->agfl_uuid, &sbp->sb_uuid); - for (bucket = 0; bucket < libxfs_agfl_size(mp); bucket++) - agfl->agfl_bno[bucket] = cpu_to_be32(NULLAGBLOCK); - } - - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * AG header block: inodes - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)), - XFS_FSS_TO_BB(mp, 1)); - agi = XFS_BUF_TO_AGI(buf); - buf->b_ops = &xfs_agi_buf_ops; - memset(agi, 0, cfg->sectorsize); - agi->agi_magicnum = cpu_to_be32(XFS_AGI_MAGIC); - agi->agi_versionnum = cpu_to_be32(XFS_AGI_VERSION); - agi->agi_seqno = cpu_to_be32(agno); - agi->agi_length = cpu_to_be32(agsize); - agi->agi_count = 0; - agi->agi_root = cpu_to_be32(XFS_IBT_BLOCK(mp)); - agi->agi_level = cpu_to_be32(1); - if (xfs_sb_version_hasfinobt(sbp)) { - agi->agi_free_root = cpu_to_be32(XFS_FIBT_BLOCK(mp)); - agi->agi_free_level = cpu_to_be32(1); - } - agi->agi_freecount = 0; - agi->agi_newino = cpu_to_be32(NULLAGINO); - agi->agi_dirino = cpu_to_be32(NULLAGINO); - if (xfs_sb_version_hascrc(sbp)) - platform_uuid_copy(&agi->agi_uuid, &sbp->sb_uuid); - for (c = 0; c < XFS_AGI_UNLINKED_BUCKETS; c++) - agi->agi_unlinked[c] = cpu_to_be32(NULLAGINO); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * BNO btree root block - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_bnobt_buf_ops; - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - libxfs_btree_init_block(mp, buf, XFS_BTNUM_BNO, 0, 1, agno); - - arec = XFS_ALLOC_REC_ADDR(mp, block, 1); - arec->ar_startblock = cpu_to_be32(libxfs_prealloc_blocks(mp)); - if (is_log_ag) { - xfs_agblock_t start = XFS_FSB_TO_AGBNO(mp, cfg->logstart); - - ASSERT(start >= libxfs_prealloc_blocks(mp)); - if (start != libxfs_prealloc_blocks(mp)) { - /* - * Modify first record to pad stripe align of log - */ - arec->ar_blockcount = cpu_to_be32(start - - libxfs_prealloc_blocks(mp)); - nrec = arec + 1; - /* - * Insert second record at start of internal log - * which then gets trimmed. - */ - nrec->ar_startblock = cpu_to_be32( - be32_to_cpu(arec->ar_startblock) + - be32_to_cpu(arec->ar_blockcount)); - arec = nrec; - be16_add_cpu(&block->bb_numrecs, 1); - } - /* - * Change record start to after the internal log - */ - be32_add_cpu(&arec->ar_startblock, cfg->logblocks); - } - /* - * Calculate the record block count and check for the case where - * the log might have consumed all available space in the AG. If - * so, reset the record count to 0 to avoid exposure of an invalid - * record start block. - */ - arec->ar_blockcount = cpu_to_be32(agsize - - be32_to_cpu(arec->ar_startblock)); - if (!arec->ar_blockcount) - block->bb_numrecs = 0; - - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * CNT btree root block - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_cntbt_buf_ops; - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - libxfs_btree_init_block(mp, buf, XFS_BTNUM_CNT, 0, 1, agno); - - arec = XFS_ALLOC_REC_ADDR(mp, block, 1); - arec->ar_startblock = cpu_to_be32(libxfs_prealloc_blocks(mp)); - if (is_log_ag) { - xfs_agblock_t start = XFS_FSB_TO_AGBNO(mp, cfg->logstart); - - ASSERT(start >= libxfs_prealloc_blocks(mp)); - if (start != libxfs_prealloc_blocks(mp)) { - arec->ar_blockcount = cpu_to_be32(start - - libxfs_prealloc_blocks(mp)); - nrec = arec + 1; - nrec->ar_startblock = cpu_to_be32( - be32_to_cpu(arec->ar_startblock) + - be32_to_cpu(arec->ar_blockcount)); - arec = nrec; - be16_add_cpu(&block->bb_numrecs, 1); - } - be32_add_cpu(&arec->ar_startblock, cfg->logblocks); - } - /* - * Calculate the record block count and check for the case where - * the log might have consumed all available space in the AG. If - * so, reset the record count to 0 to avoid exposure of an invalid - * record start block. - */ - arec->ar_blockcount = cpu_to_be32(agsize - - be32_to_cpu(arec->ar_startblock)); - if (!arec->ar_blockcount) - block->bb_numrecs = 0; - - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * refcount btree root block - */ - if (xfs_sb_version_hasreflink(sbp)) { - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, libxfs_refc_block(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_refcountbt_buf_ops; - - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - libxfs_btree_init_block(mp, buf, XFS_BTNUM_REFC, 0, 0, agno); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - } - - /* - * INO btree root block - */ - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_inobt_buf_ops; - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - libxfs_btree_init_block(mp, buf, XFS_BTNUM_INO, 0, 0, agno); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - - /* - * Free INO btree root block - */ - if (xfs_sb_version_hasfinobt(sbp)) { - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_FIBT_BLOCK(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_finobt_buf_ops; - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - libxfs_btree_init_block(mp, buf, XFS_BTNUM_FINO, 0, 0, agno); - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - } - - /* RMAP btree root block */ - if (xfs_sb_version_hasrmapbt(sbp)) { - struct xfs_rmap_rec *rrec; - - buf = libxfs_getbuf(mp->m_ddev_targp, - XFS_AGB_TO_DADDR(mp, agno, XFS_RMAP_BLOCK(mp)), - BTOBB(cfg->blocksize)); - buf->b_ops = &xfs_rmapbt_buf_ops; - block = XFS_BUF_TO_BLOCK(buf); - memset(block, 0, cfg->blocksize); - - libxfs_btree_init_block(mp, buf, XFS_BTNUM_RMAP, 0, 0, agno); - - /* - * mark the AG header regions as static metadata - * The BNO btree block is the first block after the - * headers, so it's location defines the size of region - * the static metadata consumes. - */ - rrec = XFS_RMAP_REC_ADDR(block, 1); - rrec->rm_startblock = 0; - rrec->rm_blockcount = cpu_to_be32(XFS_BNO_BLOCK(mp)); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_FS); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - - /* account freespace btree root blocks */ - rrec = XFS_RMAP_REC_ADDR(block, 2); - rrec->rm_startblock = cpu_to_be32(XFS_BNO_BLOCK(mp)); - rrec->rm_blockcount = cpu_to_be32(2); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - - /* account inode btree root blocks */ - rrec = XFS_RMAP_REC_ADDR(block, 3); - rrec->rm_startblock = cpu_to_be32(XFS_IBT_BLOCK(mp)); - rrec->rm_blockcount = cpu_to_be32(XFS_RMAP_BLOCK(mp) - - XFS_IBT_BLOCK(mp)); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_INOBT); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - - /* account for rmap btree root */ - rrec = XFS_RMAP_REC_ADDR(block, 4); - rrec->rm_startblock = cpu_to_be32(XFS_RMAP_BLOCK(mp)); - rrec->rm_blockcount = cpu_to_be32(1); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_AG); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - - /* account for refcount btree root */ - if (xfs_sb_version_hasreflink(sbp)) { - rrec = XFS_RMAP_REC_ADDR(block, 5); - rrec->rm_startblock = cpu_to_be32(libxfs_refc_block(mp)); - rrec->rm_blockcount = cpu_to_be32(1); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_REFC); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - } - - /* account for the log space */ - if (is_log_ag) { - rrec = XFS_RMAP_REC_ADDR(block, - be16_to_cpu(block->bb_numrecs) + 1); - rrec->rm_startblock = cpu_to_be32( - XFS_FSB_TO_AGBNO(mp, cfg->logstart)); - rrec->rm_blockcount = cpu_to_be32(cfg->logblocks); - rrec->rm_owner = cpu_to_be64(XFS_RMAP_OWN_LOG); - rrec->rm_offset = 0; - be16_add_cpu(&block->bb_numrecs, 1); - } - - libxfs_writebuf(buf, LIBXFS_EXIT_ON_FAILURE); - } - libxfs_perag_put(pag); } @@ -3895,6 +3576,8 @@ main( }, }; + struct list_head buffer_list; + platform_uuid_generate(&cli.uuid); progname = basename(argv[0]); setlocale(LC_ALL, ""); @@ -4086,8 +3769,26 @@ main( /* * Initialise all the static on disk metadata. */ - for (agno = 0; agno < cfg.agcount; agno++) - initialise_ag_headers(&cfg, mp, sbp, agno, &worst_freelist); + INIT_LIST_HEAD(&buffer_list); + for (agno = 0; agno < cfg.agcount; agno++) { + initialise_ag_headers(&cfg, mp, sbp, agno, &worst_freelist, + &buffer_list); + + if (agno % 16) + continue; + + if (libxfs_buf_delwri_submit(&buffer_list)) { + fprintf(stderr, _("%s: writing AG headers failed\n"), + progname); + exit(1); + } + } + + if (libxfs_buf_delwri_submit(&buffer_list)) { + fprintf(stderr, _("%s: writing AG headers failed\n"), + progname); + exit(1); + } /* * Initialise the freespace freelists (i.e. AGFLs) in each AG.