* [PATCH] xfs: bump INUMBERS cursor correctly in xfs_inumbers_walk
@ 2019-07-09 13:59 Darrick J. Wong
2019-07-09 14:22 ` Darrick J. Wong
0 siblings, 1 reply; 3+ messages in thread
From: Darrick J. Wong @ 2019-07-09 13:59 UTC (permalink / raw)
To: xfs, Brian Foster
From: Darrick J. Wong <darrick.wong@oracle.com>
There's a subtle unit conversion error when we increment the INUMBERS
cursor at the end of xfs_inumbers_walk. If there's an inode chunk at
the very end of the AG /and/ the AG size is a perfect power of two, that
means we can have inodes, that means that the startino of that last
chunk (which is in units of AG inodes) will be 63 less than (1 <<
agino_log). If we add XFS_INODES_PER_CHUNK to the startino, we end up
with a startino that's larger than (1 << agino_log) and when we convert
that back to fs inode units we'll rip off that upper bit and wind up
back at the start of the AG.
Fix this by converting to units of fs inodes before adding
XFS_INODES_PER_CHUNK so that we'll harmlessly end up pointing to the
next AG.
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
---
fs/xfs/xfs_itable.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
index cda8ae94480c..a8a06bb78ea8 100644
--- a/fs/xfs/xfs_itable.c
+++ b/fs/xfs/xfs_itable.c
@@ -338,15 +338,14 @@ xfs_inumbers_walk(
.xi_version = XFS_INUMBERS_VERSION_V5,
};
struct xfs_inumbers_chunk *ic = data;
- xfs_agino_t agino;
int error;
error = ic->formatter(ic->breq, &inogrp);
if (error && error != XFS_IBULK_ABORT)
return error;
- agino = irec->ir_startino + XFS_INODES_PER_CHUNK;
- ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, agino);
+ ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, irec->ir_startino) +
+ XFS_INODES_PER_CHUNK;
return error;
}
^ permalink raw reply related [flat|nested] 3+ messages in thread
* Re: [PATCH] xfs: bump INUMBERS cursor correctly in xfs_inumbers_walk
2019-07-09 13:59 [PATCH] xfs: bump INUMBERS cursor correctly in xfs_inumbers_walk Darrick J. Wong
@ 2019-07-09 14:22 ` Darrick J. Wong
2019-07-09 14:25 ` Brian Foster
0 siblings, 1 reply; 3+ messages in thread
From: Darrick J. Wong @ 2019-07-09 14:22 UTC (permalink / raw)
To: xfs, Brian Foster
On Tue, Jul 09, 2019 at 06:59:43AM -0700, Darrick J. Wong wrote:
> From: Darrick J. Wong <darrick.wong@oracle.com>
>
> There's a subtle unit conversion error when we increment the INUMBERS
> cursor at the end of xfs_inumbers_walk. If there's an inode chunk at
> the very end of the AG /and/ the AG size is a perfect power of two, that
> means we can have inodes, that means that the startino of that last
"...is a perfect power of two, the startino of that last chunk..."
--D
> chunk (which is in units of AG inodes) will be 63 less than (1 <<
> agino_log). If we add XFS_INODES_PER_CHUNK to the startino, we end up
> with a startino that's larger than (1 << agino_log) and when we convert
> that back to fs inode units we'll rip off that upper bit and wind up
> back at the start of the AG.
>
> Fix this by converting to units of fs inodes before adding
> XFS_INODES_PER_CHUNK so that we'll harmlessly end up pointing to the
> next AG.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> ---
> fs/xfs/xfs_itable.c | 5 ++---
> 1 file changed, 2 insertions(+), 3 deletions(-)
>
> diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
> index cda8ae94480c..a8a06bb78ea8 100644
> --- a/fs/xfs/xfs_itable.c
> +++ b/fs/xfs/xfs_itable.c
> @@ -338,15 +338,14 @@ xfs_inumbers_walk(
> .xi_version = XFS_INUMBERS_VERSION_V5,
> };
> struct xfs_inumbers_chunk *ic = data;
> - xfs_agino_t agino;
> int error;
>
> error = ic->formatter(ic->breq, &inogrp);
> if (error && error != XFS_IBULK_ABORT)
> return error;
>
> - agino = irec->ir_startino + XFS_INODES_PER_CHUNK;
> - ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, agino);
> + ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, irec->ir_startino) +
> + XFS_INODES_PER_CHUNK;
> return error;
> }
>
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] xfs: bump INUMBERS cursor correctly in xfs_inumbers_walk
2019-07-09 14:22 ` Darrick J. Wong
@ 2019-07-09 14:25 ` Brian Foster
0 siblings, 0 replies; 3+ messages in thread
From: Brian Foster @ 2019-07-09 14:25 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: xfs
On Tue, Jul 09, 2019 at 07:22:26AM -0700, Darrick J. Wong wrote:
> On Tue, Jul 09, 2019 at 06:59:43AM -0700, Darrick J. Wong wrote:
> > From: Darrick J. Wong <darrick.wong@oracle.com>
> >
> > There's a subtle unit conversion error when we increment the INUMBERS
> > cursor at the end of xfs_inumbers_walk. If there's an inode chunk at
> > the very end of the AG /and/ the AG size is a perfect power of two, that
> > means we can have inodes, that means that the startino of that last
>
> "...is a perfect power of two, the startino of that last chunk..."
>
Yeah, was going to point out this looked like some stale/spurious
text... :P
> --D
>
> > chunk (which is in units of AG inodes) will be 63 less than (1 <<
> > agino_log). If we add XFS_INODES_PER_CHUNK to the startino, we end up
> > with a startino that's larger than (1 << agino_log) and when we convert
> > that back to fs inode units we'll rip off that upper bit and wind up
> > back at the start of the AG.
> >
> > Fix this by converting to units of fs inodes before adding
> > XFS_INODES_PER_CHUNK so that we'll harmlessly end up pointing to the
> > next AG.
> >
> > Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
> > ---
Otherwise looks good:
Reviewed-by: Brian Foster <bfoster@redhat.com>
> > fs/xfs/xfs_itable.c | 5 ++---
> > 1 file changed, 2 insertions(+), 3 deletions(-)
> >
> > diff --git a/fs/xfs/xfs_itable.c b/fs/xfs/xfs_itable.c
> > index cda8ae94480c..a8a06bb78ea8 100644
> > --- a/fs/xfs/xfs_itable.c
> > +++ b/fs/xfs/xfs_itable.c
> > @@ -338,15 +338,14 @@ xfs_inumbers_walk(
> > .xi_version = XFS_INUMBERS_VERSION_V5,
> > };
> > struct xfs_inumbers_chunk *ic = data;
> > - xfs_agino_t agino;
> > int error;
> >
> > error = ic->formatter(ic->breq, &inogrp);
> > if (error && error != XFS_IBULK_ABORT)
> > return error;
> >
> > - agino = irec->ir_startino + XFS_INODES_PER_CHUNK;
> > - ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, agino);
> > + ic->breq->startino = XFS_AGINO_TO_INO(mp, agno, irec->ir_startino) +
> > + XFS_INODES_PER_CHUNK;
> > return error;
> > }
> >
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2019-07-09 14:25 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-07-09 13:59 [PATCH] xfs: bump INUMBERS cursor correctly in xfs_inumbers_walk Darrick J. Wong
2019-07-09 14:22 ` Darrick J. Wong
2019-07-09 14:25 ` Brian Foster
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).