From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7B39EC05027 for ; Thu, 9 Feb 2023 22:26:35 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229862AbjBIW0e (ORCPT ); Thu, 9 Feb 2023 17:26:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59244 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230032AbjBIW0c (ORCPT ); Thu, 9 Feb 2023 17:26:32 -0500 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE2AB6BAA6 for ; Thu, 9 Feb 2023 14:26:20 -0800 (PST) Received: by mail-pl1-x633.google.com with SMTP id o8so2179696pls.11 for ; Thu, 09 Feb 2023 14:26:20 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=fromorbit-com.20210112.gappssmtp.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:from:to:cc:subject:date:message-id :reply-to; bh=+2mSyV8N3Jc1mBFCst0iX1czR7TTrbjWy8i3qYXVZcA=; b=DbGhhj4wR+glCYp/d1yczv8sn+ZZ8bDrPf/Ai4CmgWsZuhm7B6EHcaXlIw0QlpcZWb +JJRUbtKChpZkEnF14mWFDwTA+siLtu/SlseKjoshEE71gFSj7XYQwmC3B+Sin9bCtPZ 8dvFx5Yo5C/Sz9qwhO6ccEfi+zxEXtHMgeEoyOv1bJksEDghHxG+DWu7xsxWRISkQiVD vPO125oyh7cx9t1kRVK+sZFlw6i15YAAKn8sXtEcTpzUaTrI/KVOgwV8z0GC+blj8z9U kEujbtfvyruMItsvVIrdKsX9cJwnujI2GhejBXVoAJwseFXql37Ac0O34i9gYwTbXbAa OtZw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=+2mSyV8N3Jc1mBFCst0iX1czR7TTrbjWy8i3qYXVZcA=; b=y4Ih7MDhDE2P+3zSEsYxPl68i0XSzpoaV1UeCeDMMRQPZIuDzq9xFG4T/vrKoe5Lxv b2GQ+j2PkXcqIYZnq33NA5ywSwQTJ9QZBVyAIdQ0c4OBxFICU/FD9H7b78E7oqARI8zW FMsck/5FmBp4AVAqjmQSvvY/OOh4YHTismjYz20vgGkvSl0baLsoFN5p0lRoyhI2HaZr w4jrezTIThtAS4MvGNs8/R1zQyxf+DTNNDR2MSSxnRu9sIcvdU1wZeyUCPbLOPBrwjRm +IvGjxeGJ5OCoovmgFWx1BI5lTGMduVR9mmZCxwSiCxiXp0wfUIajJYvC13xx8VToY54 bzEA== X-Gm-Message-State: AO0yUKWRNeDy/1jGaF9dgRHkVH0tHHxMznfr999iriDKhaG1oBAJ/kdm RPpy50Crfa3XWFI3yYSzQiNz0TWIdDMrVtC/ X-Google-Smtp-Source: AK7set8sY8gWWWloWIALMqNg2SzAG2051txTCta8VXvHC6q88LrURnrcHP5tkk2g/dFlHiRWH+v++A== X-Received: by 2002:a17:903:1206:b0:191:1729:d7e7 with SMTP id l6-20020a170903120600b001911729d7e7mr14102528plh.67.1675981580376; Thu, 09 Feb 2023 14:26:20 -0800 (PST) Received: from dread.disaster.area (pa49-181-4-128.pa.nsw.optusnet.com.au. [49.181.4.128]) by smtp.gmail.com with ESMTPSA id 17-20020a170902c15100b0019a70a85e8fsm133206plj.220.2023.02.09.14.26.19 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Feb 2023 14:26:20 -0800 (PST) Received: from [192.168.253.23] (helo=devoid.disaster.area) by dread.disaster.area with esmtp (Exim 4.92.3) (envelope-from ) id 1pQFFM-00DOW4-MA for linux-xfs@vger.kernel.org; Fri, 10 Feb 2023 09:18:28 +1100 Received: from dave by devoid.disaster.area with local (Exim 4.96) (envelope-from ) id 1pQFFM-00FcOK-2B for linux-xfs@vger.kernel.org; Fri, 10 Feb 2023 09:18:28 +1100 From: Dave Chinner To: linux-xfs@vger.kernel.org Subject: [PATCH 30/42] xfs: factor out filestreams from xfs_bmap_btalloc_nullfb Date: Fri, 10 Feb 2023 09:18:13 +1100 Message-Id: <20230209221825.3722244-31-david@fromorbit.com> X-Mailer: git-send-email 2.39.0 In-Reply-To: <20230209221825.3722244-1-david@fromorbit.com> References: <20230209221825.3722244-1-david@fromorbit.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-xfs@vger.kernel.org From: Dave Chinner There's many if (filestreams) {} else {} branches in this function. Split it out into a filestreams specific function so that we can then work directly on cleaning up the filestreams code without impacting the rest of the allocation algorithms. Signed-off-by: Dave Chinner Reviewed-by: Darrick J. Wong --- fs/xfs/libxfs/xfs_bmap.c | 173 ++++++++++++++++++++++----------------- 1 file changed, 99 insertions(+), 74 deletions(-) diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c index ee402ac8c551..187200488ac0 100644 --- a/fs/xfs/libxfs/xfs_bmap.c +++ b/fs/xfs/libxfs/xfs_bmap.c @@ -3234,8 +3234,8 @@ xfs_bmap_btalloc_select_lengths( return error; } -STATIC int -xfs_bmap_btalloc_filestreams( +static int +xfs_bmap_btalloc_filestreams_select_lengths( struct xfs_bmalloca *ap, struct xfs_alloc_arg *args, xfs_extlen_t *blen) @@ -3576,32 +3576,101 @@ xfs_bmap_btalloc_at_eof( return 0; } +/* + * We have failed multiple allocation attempts so now are in a low space + * allocation situation. Try a locality first full filesystem minimum length + * allocation whilst still maintaining necessary total block reservation + * requirements. + * + * If that fails, we are now critically low on space, so perform a last resort + * allocation attempt: no reserve, no locality, blocking, minimum length, full + * filesystem free space scan. We also indicate to future allocations in this + * transaction that we are critically low on space so they don't waste time on + * allocation modes that are unlikely to succeed. + */ +static int +xfs_bmap_btalloc_low_space( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args) +{ + int error; + + if (args->minlen > ap->minlen) { + args->minlen = ap->minlen; + error = xfs_alloc_vextent_start_ag(args, ap->blkno); + if (error || args->fsbno != NULLFSBLOCK) + return error; + } + + /* Last ditch attempt before failure is declared. */ + args->total = ap->minlen; + error = xfs_alloc_vextent_first_ag(args, 0); + if (error) + return error; + ap->tp->t_flags |= XFS_TRANS_LOWMODE; + return 0; +} + +static int +xfs_bmap_btalloc_filestreams( + struct xfs_bmalloca *ap, + struct xfs_alloc_arg *args, + int stripe_align) +{ + xfs_agnumber_t agno = xfs_filestream_lookup_ag(ap->ip); + xfs_extlen_t blen = 0; + int error; + + /* Determine the initial block number we will target for allocation. */ + if (agno == NULLAGNUMBER) + agno = 0; + ap->blkno = XFS_AGB_TO_FSB(args->mp, agno, 0); + xfs_bmap_adjacent(ap); + + /* + * If there is very little free space before we start a + * filestreams allocation, we're almost guaranteed to fail to + * find an AG with enough contiguous free space to succeed, so + * just go straight to the low space algorithm. + */ + if (ap->tp->t_flags & XFS_TRANS_LOWMODE) { + args->minlen = ap->minlen; + return xfs_bmap_btalloc_low_space(ap, args); + } + + /* + * Search for an allocation group with a single extent large enough for + * the request. If one isn't found, then adjust the minimum allocation + * size to the largest space found. + */ + error = xfs_bmap_btalloc_filestreams_select_lengths(ap, args, &blen); + if (error) + return error; + + if (ap->aeof) { + error = xfs_bmap_btalloc_at_eof(ap, args, blen, stripe_align, + true); + if (error || args->fsbno != NULLFSBLOCK) + return error; + } + + error = xfs_alloc_vextent_near_bno(args, ap->blkno); + if (error || args->fsbno != NULLFSBLOCK) + return error; + + return xfs_bmap_btalloc_low_space(ap, args); +} + static int xfs_bmap_btalloc_best_length( struct xfs_bmalloca *ap, struct xfs_alloc_arg *args, int stripe_align) { - struct xfs_mount *mp = args->mp; xfs_extlen_t blen = 0; - bool is_filestream = false; int error; - if ((ap->datatype & XFS_ALLOC_USERDATA) && - xfs_inode_is_filestream(ap->ip)) - is_filestream = true; - - /* - * Determine the initial block number we will target for allocation. - */ - if (is_filestream) { - xfs_agnumber_t agno = xfs_filestream_lookup_ag(ap->ip); - if (agno == NULLAGNUMBER) - agno = 0; - ap->blkno = XFS_AGB_TO_FSB(mp, agno, 0); - } else { - ap->blkno = XFS_INO_TO_FSB(mp, ap->ip->i_ino); - } + ap->blkno = XFS_INO_TO_FSB(args->mp, ap->ip->i_ino); xfs_bmap_adjacent(ap); /* @@ -3609,21 +3678,7 @@ xfs_bmap_btalloc_best_length( * the request. If one isn't found, then adjust the minimum allocation * size to the largest space found. */ - if (is_filestream) { - /* - * If there is very little free space before we start a - * filestreams allocation, we're almost guaranteed to fail to - * find an AG with enough contiguous free space to succeed, so - * just go straight to the low space algorithm. - */ - if (ap->tp->t_flags & XFS_TRANS_LOWMODE) { - args->minlen = ap->minlen; - goto critically_low_space; - } - error = xfs_bmap_btalloc_filestreams(ap, args, &blen); - } else { - error = xfs_bmap_btalloc_select_lengths(ap, args, &blen); - } + error = xfs_bmap_btalloc_select_lengths(ap, args, &blen); if (error) return error; @@ -3635,50 +3690,16 @@ xfs_bmap_btalloc_best_length( */ if (ap->aeof && !(ap->tp->t_flags & XFS_TRANS_LOWMODE)) { error = xfs_bmap_btalloc_at_eof(ap, args, blen, stripe_align, - is_filestream); - if (error) + false); + if (error || args->fsbno != NULLFSBLOCK) return error; - if (args->fsbno != NULLFSBLOCK) - return 0; } - if (is_filestream) - error = xfs_alloc_vextent_near_bno(args, ap->blkno); - else - error = xfs_alloc_vextent_start_ag(args, ap->blkno); - if (error) + error = xfs_alloc_vextent_start_ag(args, ap->blkno); + if (error || args->fsbno != NULLFSBLOCK) return error; - if (args->fsbno != NULLFSBLOCK) - return 0; - /* - * Try a locality first full filesystem minimum length allocation whilst - * still maintaining necessary total block reservation requirements. - */ - if (args->minlen > ap->minlen) { - args->minlen = ap->minlen; - error = xfs_alloc_vextent_start_ag(args, ap->blkno); - if (error) - return error; - } - if (args->fsbno != NULLFSBLOCK) - return 0; - - /* - * We are now critically low on space, so this is a last resort - * allocation attempt: no reserve, no locality, blocking, minimum - * length, full filesystem free space scan. We also indicate to future - * allocations in this transaction that we are critically low on space - * so they don't waste time on allocation modes that are unlikely to - * succeed. - */ -critically_low_space: - args->total = ap->minlen; - error = xfs_alloc_vextent_first_ag(args, 0); - if (error) - return error; - ap->tp->t_flags |= XFS_TRANS_LOWMODE; - return 0; + return xfs_bmap_btalloc_low_space(ap, args); } static int @@ -3712,7 +3733,11 @@ xfs_bmap_btalloc( /* Trim the allocation back to the maximum an AG can fit. */ args.maxlen = min(ap->length, mp->m_ag_max_usable); - error = xfs_bmap_btalloc_best_length(ap, &args, stripe_align); + if ((ap->datatype & XFS_ALLOC_USERDATA) && + xfs_inode_is_filestream(ap->ip)) + error = xfs_bmap_btalloc_filestreams(ap, &args, stripe_align); + else + error = xfs_bmap_btalloc_best_length(ap, &args, stripe_align); if (error) return error; -- 2.39.0