All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Darrick J. Wong" <djwong@kernel.org>
To: Dan Carpenter <dan.carpenter@linaro.org>
Cc: linux-xfs@vger.kernel.org
Subject: Re: [bug report] xfs: repair free space btrees
Date: Thu, 4 Apr 2024 13:55:24 -0700	[thread overview]
Message-ID: <20240404205524.GG6414@frogsfrogsfrogs> (raw)
In-Reply-To: <4e8b2fc3-838a-458e-b306-2f8a0062ba76@moroto.mountain>

On Thu, Apr 04, 2024 at 10:32:32AM +0300, Dan Carpenter wrote:
> Hello Darrick J. Wong,
> 
> Commit 4bdfd7d15747 ("xfs: repair free space btrees") from Dec 15,
> 2023 (linux-next), leads to the following Smatch static checker
> warning:
> 
> 	fs/xfs/scrub/alloc_repair.c:781 xrep_abt_build_new_trees()
> 	warn: missing unwind goto?
> 
> fs/xfs/scrub/alloc_repair.c
>     702 STATIC int
>     703 xrep_abt_build_new_trees(
>     704         struct xrep_abt                *ra)
>     705 {
>     706         struct xfs_scrub        *sc = ra->sc;
>     707         struct xfs_btree_cur        *bno_cur;
>     708         struct xfs_btree_cur        *cnt_cur;
>     709         struct xfs_perag        *pag = sc->sa.pag;
>     710         bool                        needs_resort = false;
>     711         int                        error;
>     712 
>     713         /*
>     714          * Sort the free extents by length so that we can set up the free space
>     715          * btrees in as few extents as possible.  This reduces the amount of
>     716          * deferred rmap / free work we have to do at the end.
>     717          */
>     718         error = xrep_cntbt_sort_records(ra, false);
>     719         if (error)
>     720                 return error;
>     721 
>     722         /*
>     723          * Prepare to construct the new btree by reserving disk space for the
>     724          * new btree and setting up all the accounting information we'll need
>     725          * to root the new btree while it's under construction and before we
>     726          * attach it to the AG header.
>     727          */
>     728         xrep_newbt_init_bare(&ra->new_bnobt, sc);
>     729         xrep_newbt_init_bare(&ra->new_cntbt, sc);
>     730 
>     731         ra->new_bnobt.bload.get_records = xrep_abt_get_records;
>     732         ra->new_cntbt.bload.get_records = xrep_abt_get_records;
>     733 
>     734         ra->new_bnobt.bload.claim_block = xrep_abt_claim_block;
>     735         ra->new_cntbt.bload.claim_block = xrep_abt_claim_block;
>     736 
>     737         /* Allocate cursors for the staged btrees. */
>     738         bno_cur = xfs_bnobt_init_cursor(sc->mp, NULL, NULL, pag);
>     739         xfs_btree_stage_afakeroot(bno_cur, &ra->new_bnobt.afake);
>     740 
>     741         cnt_cur = xfs_cntbt_init_cursor(sc->mp, NULL, NULL, pag);
>     742         xfs_btree_stage_afakeroot(cnt_cur, &ra->new_cntbt.afake);
>     743 
>     744         /* Last chance to abort before we start committing fixes. */
>     745         if (xchk_should_terminate(sc, &error))
>     746                 goto err_cur;
>     747 
>     748         /* Reserve the space we'll need for the new btrees. */
>     749         error = xrep_abt_reserve_space(ra, bno_cur, cnt_cur, &needs_resort);
>     750         if (error)
>     751                 goto err_cur;
>     752 
>     753         /*
>     754          * If we need to re-sort the free extents by length, do so so that we
>     755          * can put the records into the cntbt in the correct order.
>     756          */
>     757         if (needs_resort) {
>     758                 error = xrep_cntbt_sort_records(ra, needs_resort);
>     759                 if (error)
>     760                         goto err_cur;
>     761         }
>     762 
>     763         /*
>     764          * Due to btree slack factors, it's possible for a new btree to be one
>     765          * level taller than the old btree.  Update the alternate incore btree
>     766          * height so that we don't trip the verifiers when writing the new
>     767          * btree blocks to disk.
>     768          */
>     769         pag->pagf_repair_bno_level = ra->new_bnobt.bload.btree_height;
>     770         pag->pagf_repair_cnt_level = ra->new_cntbt.bload.btree_height;
>     771 
>     772         /* Load the free space by length tree. */
>     773         ra->array_cur = XFARRAY_CURSOR_INIT;
>     774         ra->longest = 0;
>     775         error = xfs_btree_bload(cnt_cur, &ra->new_cntbt.bload, ra);
>     776         if (error)
>     777                 goto err_levels;
>                         ^^^^^^^^^^^^^^^^
>     778 
>     779         error = xrep_bnobt_sort_records(ra);
>     780         if (error)
> --> 781                 return error;
>                         ^^^^^^^^^^^^^
> Should this be a goto err_levels?

Yep.  Thanks for the report.

--D

>     782 
>     783         /* Load the free space by block number tree. */
>     784         ra->array_cur = XFARRAY_CURSOR_INIT;
>     785         error = xfs_btree_bload(bno_cur, &ra->new_bnobt.bload, ra);
>     786         if (error)
>     787                 goto err_levels;
>     788 
>     789         /*
>     790          * Install the new btrees in the AG header.  After this point the old
>     791          * btrees are no longer accessible and the new trees are live.
>     792          */
>     793         xfs_allocbt_commit_staged_btree(bno_cur, sc->tp, sc->sa.agf_bp);
>     794         xfs_btree_del_cursor(bno_cur, 0);
>     795         xfs_allocbt_commit_staged_btree(cnt_cur, sc->tp, sc->sa.agf_bp);
>     796         xfs_btree_del_cursor(cnt_cur, 0);
>     797 
>     798         /* Reset the AGF counters now that we've changed the btree shape. */
>     799         error = xrep_abt_reset_counters(ra);
>     800         if (error)
>     801                 goto err_newbt;
>     802 
>     803         /* Dispose of any unused blocks and the accounting information. */
>     804         xrep_abt_dispose_reservations(ra, error);
>     805 
>     806         return xrep_roll_ag_trans(sc);
>     807 
>     808 err_levels:
>     809         pag->pagf_repair_bno_level = 0;
>     810         pag->pagf_repair_cnt_level = 0;
>     811 err_cur:
>     812         xfs_btree_del_cursor(cnt_cur, error);
>     813         xfs_btree_del_cursor(bno_cur, error);
>     814 err_newbt:
>     815         xrep_abt_dispose_reservations(ra, error);
>     816         return error;
>     817 }
> 
> regards,
> dan carpenter

      reply	other threads:[~2024-04-04 20:55 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-04-04  7:32 [bug report] xfs: repair free space btrees Dan Carpenter
2024-04-04 20:55 ` Darrick J. Wong [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240404205524.GG6414@frogsfrogsfrogs \
    --to=djwong@kernel.org \
    --cc=dan.carpenter@linaro.org \
    --cc=linux-xfs@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.