public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Allison Collins <allison.henderson@oracle.com>
To: "Darrick J. Wong" <darrick.wong@oracle.com>, sandeen@sandeen.net
Cc: linux-xfs@vger.kernel.org
Subject: Re: [PATCH 1/1] xfs_repair: fix totally broken unit conversion in directory invalidation
Date: Thu, 2 Jan 2020 14:17:07 -0700	[thread overview]
Message-ID: <e890e671-fb53-012b-906e-e9908b45a7e7@oracle.com> (raw)
In-Reply-To: <157784163634.1371001.9270275500137619667.stgit@magnolia>



On 12/31/19 6:20 PM, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
> 
> Your humble author forgot that xfs_dablk_t has the same units as
> xfs_fileoff_t, and totally screwed up the directory buffer invalidation
> loop in dir_binval.  Not only is there an off-by-one error in the loop
> conditional, but the unit conversions are wrong.
> 
> Fix all this stupidity by adding a for loop macro to take care of these
> details for us so that everyone can iterate all logical directory blocks
> (xfs_dir2_db_t) that start within a given bmbt record.
> 
> The pre-5.5 xfs_da_get_buf implementation mostly hides the off-by-one
> error because dir_binval turns on "don't complain if no mapping" mode,
> but on dirblocksize > fsblocksize filesystems the incorrect units can
> cause us to miss invalidating some blocks, which can lead to other
> buffer cache errors later.
> 
> Fixes: f9c559f4e4fb4 ("xfs_repair: invalidate dirty dir buffers when we zap a  directory")
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This one looks ok to me.  Thanks!

Reviewed-by: Allison Collins <allison.henderson@oracle.com>

> ---
>   repair/phase6.c |   10 ++++------
>   1 file changed, 4 insertions(+), 6 deletions(-)
> 
> 
> diff --git a/repair/phase6.c b/repair/phase6.c
> index 91d208a6..a11712a2 100644
> --- a/repair/phase6.c
> +++ b/repair/phase6.c
> @@ -1276,7 +1276,7 @@ dir_binval(
>   	struct xfs_ifork	*ifp;
>   	struct xfs_da_geometry	*geo;
>   	struct xfs_buf		*bp;
> -	xfs_dablk_t		dabno, end_dabno;
> +	xfs_dablk_t		dabno;
>   	int			error = 0;
>   
>   	if (ip->i_d.di_format != XFS_DINODE_FMT_EXTENTS &&
> @@ -1286,11 +1286,9 @@ dir_binval(
>   	geo = tp->t_mountp->m_dir_geo;
>   	ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK);
>   	for_each_xfs_iext(ifp, &icur, &rec) {
> -		dabno = xfs_dir2_db_to_da(geo, rec.br_startoff +
> -				geo->fsbcount - 1);
> -		end_dabno = xfs_dir2_db_to_da(geo, rec.br_startoff +
> -				rec.br_blockcount);
> -		for (; dabno <= end_dabno; dabno += geo->fsbcount) {
> +		for (dabno = roundup(rec.br_startoff, geo->fsbcount);
> +		     dabno < rec.br_startoff + rec.br_blockcount;
> +		     dabno += geo->fsbcount) {
>   			bp = NULL;
>   			error = -libxfs_da_get_buf(tp, ip, dabno, -2, &bp,
>   					whichfork);
> 

      reply	other threads:[~2020-01-02 21:19 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-01  1:20 [PATCH 0/1] xfsprogs: random fixes Darrick J. Wong
2020-01-01  1:20 ` [PATCH 1/1] xfs_repair: fix totally broken unit conversion in directory invalidation Darrick J. Wong
2020-01-02 21:17   ` Allison Collins [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=e890e671-fb53-012b-906e-e9908b45a7e7@oracle.com \
    --to=allison.henderson@oracle.com \
    --cc=darrick.wong@oracle.com \
    --cc=linux-xfs@vger.kernel.org \
    --cc=sandeen@sandeen.net \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox