* [PATCH] xfs_db: use correct inode to set inode type
@ 2020-08-13 6:03 Zorro Lang
2020-08-13 13:53 ` Gao Xiang
2020-08-13 14:56 ` Darrick J. Wong
0 siblings, 2 replies; 7+ messages in thread
From: Zorro Lang @ 2020-08-13 6:03 UTC (permalink / raw)
To: linux-xfs
A test fails as:
# xfs_db -c "inode 133" -c "addr" -c "p core.size" -c "type inode" -c "addr" -c "p core.size" /dev/sdb1
current
byte offset 68096, length 512
buffer block 128 (fsbno 16), 32 bbs
inode 133, dir inode -1, type inode
core.size = 123142
current
byte offset 65536, length 512
buffer block 128 (fsbno 16), 32 bbs
inode 128, dir inode 128, type inode
core.size = 42
The "type inode" get wrong inode addr due to it trys to get the
beginning of an inode chunk, refer to "533d1d229 xfs_db: properly set
inode type".
We don't need to get the beginning of a chunk in set_iocur_type, due
to set_cur_inode(ino) will help to do all of that and make a proper
verification. We just need to give it a correct inode.
Reported-by: Jianhong Yin <jiyin@redhat.com>
Signed-off-by: Zorro Lang <zlang@redhat.com>
---
db/io.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/db/io.c b/db/io.c
index 6628d061..61940a07 100644
--- a/db/io.c
+++ b/db/io.c
@@ -591,6 +591,7 @@ set_iocur_type(
/* Inodes are special; verifier checks all inodes in the chunk */
if (type->typnm == TYP_INODE) {
xfs_daddr_t b = iocur_top->bb;
+ int bo = iocur_top->boff;
xfs_ino_t ino;
/*
@@ -598,7 +599,7 @@ set_iocur_type(
* which contains the current disk location; daddr may change.
*/
ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
- ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
+ (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
set_cur_inode(ino);
return;
--
2.20.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 6:03 [PATCH] xfs_db: use correct inode to set inode type Zorro Lang
@ 2020-08-13 13:53 ` Gao Xiang
2020-08-13 15:29 ` Zorro Lang
2020-08-13 17:37 ` Eric Sandeen
2020-08-13 14:56 ` Darrick J. Wong
1 sibling, 2 replies; 7+ messages in thread
From: Gao Xiang @ 2020-08-13 13:53 UTC (permalink / raw)
To: Zorro Lang; +Cc: linux-xfs
Hi,
On Thu, Aug 13, 2020 at 02:03:24PM +0800, Zorro Lang wrote:
> A test fails as:
> # xfs_db -c "inode 133" -c "addr" -c "p core.size" -c "type inode" -c "addr" -c "p core.size" /dev/sdb1
> current
> byte offset 68096, length 512
> buffer block 128 (fsbno 16), 32 bbs
> inode 133, dir inode -1, type inode
> core.size = 123142
> current
> byte offset 65536, length 512
> buffer block 128 (fsbno 16), 32 bbs
> inode 128, dir inode 128, type inode
> core.size = 42
>
> The "type inode" get wrong inode addr due to it trys to get the
> beginning of an inode chunk, refer to "533d1d229 xfs_db: properly set
> inode type".
From the kernel side, the prefered way is
commit id ("subject")
>
> We don't need to get the beginning of a chunk in set_iocur_type, due
> to set_cur_inode(ino) will help to do all of that and make a proper
> verification. We just need to give it a correct inode.
>
> Reported-by: Jianhong Yin <jiyin@redhat.com>
> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
> db/io.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/db/io.c b/db/io.c
> index 6628d061..61940a07 100644
> --- a/db/io.c
> +++ b/db/io.c
> @@ -591,6 +591,7 @@ set_iocur_type(
> /* Inodes are special; verifier checks all inodes in the chunk */
> if (type->typnm == TYP_INODE) {
> xfs_daddr_t b = iocur_top->bb;
> + int bo = iocur_top->boff;
> xfs_ino_t ino;
>
> /*
> @@ -598,7 +599,7 @@ set_iocur_type(
> * which contains the current disk location; daddr may change.
> */
> ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
> - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
> + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
> XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
> set_cur_inode(ino);
> return;
Not familar with such code, but after looking into a bit, (my premature
thought is that) I'm wondering if we need to reverify original buffer in
if (type->fields) {
...
set_cur()
}
iocur_top->typ = type;
/* verify the buffer if the type has one. */
...
since set_cur() already verified the buffer in
set_cur->libxfs_buf_read->...->libxfs_readbuf_verify?
Not related to this patchset but I'm a bit curious about it now...
Thanks,
Gao Xiang
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 6:03 [PATCH] xfs_db: use correct inode to set inode type Zorro Lang
2020-08-13 13:53 ` Gao Xiang
@ 2020-08-13 14:56 ` Darrick J. Wong
2020-08-13 15:36 ` Zorro Lang
1 sibling, 1 reply; 7+ messages in thread
From: Darrick J. Wong @ 2020-08-13 14:56 UTC (permalink / raw)
To: Zorro Lang; +Cc: linux-xfs
On Thu, Aug 13, 2020 at 02:03:24PM +0800, Zorro Lang wrote:
> A test fails as:
> # xfs_db -c "inode 133" -c "addr" -c "p core.size" -c "type inode" -c "addr" -c "p core.size" /dev/sdb1
> current
> byte offset 68096, length 512
> buffer block 128 (fsbno 16), 32 bbs
> inode 133, dir inode -1, type inode
> core.size = 123142
> current
> byte offset 65536, length 512
> buffer block 128 (fsbno 16), 32 bbs
> inode 128, dir inode 128, type inode
> core.size = 42
>
> The "type inode" get wrong inode addr due to it trys to get the
> beginning of an inode chunk, refer to "533d1d229 xfs_db: properly set
> inode type".
It took me a minute to figure out what this was referring to (though it
was obvious from the code change). Might I suggest something like:
The "type inode" command accidentally moves the io cursor because it
forgets to include the io cursor's buffer offset when it computes the
inode number from the io cursor's location.
Fixes: 533d1d229a88 ("xfs_db: properly set inode type")
> We don't need to get the beginning of a chunk in set_iocur_type, due
> to set_cur_inode(ino) will help to do all of that and make a proper
> verification. We just need to give it a correct inode.
>
> Reported-by: Jianhong Yin <jiyin@redhat.com>
> Signed-off-by: Zorro Lang <zlang@redhat.com>
> ---
> db/io.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/db/io.c b/db/io.c
> index 6628d061..61940a07 100644
> --- a/db/io.c
> +++ b/db/io.c
> @@ -591,6 +591,7 @@ set_iocur_type(
> /* Inodes are special; verifier checks all inodes in the chunk */
> if (type->typnm == TYP_INODE) {
> xfs_daddr_t b = iocur_top->bb;
> + int bo = iocur_top->boff;
> xfs_ino_t ino;
>
> /*
> @@ -598,7 +599,7 @@ set_iocur_type(
> * which contains the current disk location; daddr may change.
> */
> ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
> - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
> + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
> XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
/me feels like this whole thing ought to be revised into something
involving XFS_OFFBNO_TO_AGINO to make the unit conversions easier to
read, e.g.:
xfs_daddr_t b = iocur_top->bb;
xfs_agbno_t agbno;
xfs_agino_t agino;
agbno = xfs_daddr_to_agbno(mp, b);
agino = XFS_OFFBNO_TO_AGINO(mp, agbno,
iocur_top->boff / mp->m_sb.sb_inodesize);
ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b), agino);
--D
> set_cur_inode(ino);
> return;
> --
> 2.20.1
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 15:29 ` Zorro Lang
@ 2020-08-13 15:28 ` Gao Xiang
0 siblings, 0 replies; 7+ messages in thread
From: Gao Xiang @ 2020-08-13 15:28 UTC (permalink / raw)
To: Zorro Lang; +Cc: linux-xfs
On Thu, Aug 13, 2020 at 11:29:05PM +0800, Zorro Lang wrote:
...
> > > ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
> > > - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
> > > + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
> > > XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
> > > set_cur_inode(ino);
> > > return;
> >
> > Not familar with such code, but after looking into a bit, (my premature
> > thought is that) I'm wondering if we need to reverify original buffer in
> >
> > if (type->fields) {
> > ...
> > set_cur()
> > }
> >
> > iocur_top->typ = type;
> >
> > /* verify the buffer if the type has one. */
> > ...
> >
> > since set_cur() already verified the buffer in
> > set_cur->libxfs_buf_read->...->libxfs_readbuf_verify?
> >
> > Not related to this patchset but I'm a bit curious about it now...
>
> I'm not the one who learn about xfsprogs best:) But by looking into
> set_cur_inode() -> set_cur(), I think the set_cur() does the xfs_buf
> verification, so I don't think we need to do that again at the end
> of set_iocur_type().
Nope, I wasn't saying we need to add anything after set_cur_inode().
but commit 55f224baf83d ("xfs_db: update buffer size when new type is set")
In detail, I think it might be
if (type->fields) {
...
set_cur()
return; <- here
}
iocur_top->typ = type;
/* verify the buffer if the type has one. */
...
Thanks,
Gao Xiang
>
> Thanks,
> Zorro
>
> >
> > Thanks,
> > Gao Xiang
> >
> > > --
> > > 2.20.1
> > >
> >
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 13:53 ` Gao Xiang
@ 2020-08-13 15:29 ` Zorro Lang
2020-08-13 15:28 ` Gao Xiang
2020-08-13 17:37 ` Eric Sandeen
1 sibling, 1 reply; 7+ messages in thread
From: Zorro Lang @ 2020-08-13 15:29 UTC (permalink / raw)
To: Gao Xiang; +Cc: linux-xfs
On Thu, Aug 13, 2020 at 09:53:45PM +0800, Gao Xiang wrote:
> Hi,
>
> On Thu, Aug 13, 2020 at 02:03:24PM +0800, Zorro Lang wrote:
> > A test fails as:
> > # xfs_db -c "inode 133" -c "addr" -c "p core.size" -c "type inode" -c "addr" -c "p core.size" /dev/sdb1
> > current
> > byte offset 68096, length 512
> > buffer block 128 (fsbno 16), 32 bbs
> > inode 133, dir inode -1, type inode
> > core.size = 123142
> > current
> > byte offset 65536, length 512
> > buffer block 128 (fsbno 16), 32 bbs
> > inode 128, dir inode 128, type inode
> > core.size = 42
> >
> > The "type inode" get wrong inode addr due to it trys to get the
> > beginning of an inode chunk, refer to "533d1d229 xfs_db: properly set
> > inode type".
>
> From the kernel side, the prefered way is
> commit id ("subject")
Hi Xiang,
Thanks for your review. I'll change my commit log.
>
> >
> > We don't need to get the beginning of a chunk in set_iocur_type, due
> > to set_cur_inode(ino) will help to do all of that and make a proper
> > verification. We just need to give it a correct inode.
> >
> > Reported-by: Jianhong Yin <jiyin@redhat.com>
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > ---
> > db/io.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/db/io.c b/db/io.c
> > index 6628d061..61940a07 100644
> > --- a/db/io.c
> > +++ b/db/io.c
> > @@ -591,6 +591,7 @@ set_iocur_type(
> > /* Inodes are special; verifier checks all inodes in the chunk */
> > if (type->typnm == TYP_INODE) {
> > xfs_daddr_t b = iocur_top->bb;
> > + int bo = iocur_top->boff;
> > xfs_ino_t ino;
> >
> > /*
> > @@ -598,7 +599,7 @@ set_iocur_type(
> > * which contains the current disk location; daddr may change.
> > */
> > ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
> > - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
> > + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
> > XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
> > set_cur_inode(ino);
> > return;
>
> Not familar with such code, but after looking into a bit, (my premature
> thought is that) I'm wondering if we need to reverify original buffer in
>
> if (type->fields) {
> ...
> set_cur()
> }
>
> iocur_top->typ = type;
>
> /* verify the buffer if the type has one. */
> ...
>
> since set_cur() already verified the buffer in
> set_cur->libxfs_buf_read->...->libxfs_readbuf_verify?
>
> Not related to this patchset but I'm a bit curious about it now...
I'm not the one who learn about xfsprogs best:) But by looking into
set_cur_inode() -> set_cur(), I think the set_cur() does the xfs_buf
verification, so I don't think we need to do that again at the end
of set_iocur_type().
Thanks,
Zorro
>
> Thanks,
> Gao Xiang
>
> > --
> > 2.20.1
> >
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 14:56 ` Darrick J. Wong
@ 2020-08-13 15:36 ` Zorro Lang
0 siblings, 0 replies; 7+ messages in thread
From: Zorro Lang @ 2020-08-13 15:36 UTC (permalink / raw)
To: Darrick J. Wong; +Cc: linux-xfs
On Thu, Aug 13, 2020 at 07:56:16AM -0700, Darrick J. Wong wrote:
> On Thu, Aug 13, 2020 at 02:03:24PM +0800, Zorro Lang wrote:
> > A test fails as:
> > # xfs_db -c "inode 133" -c "addr" -c "p core.size" -c "type inode" -c "addr" -c "p core.size" /dev/sdb1
> > current
> > byte offset 68096, length 512
> > buffer block 128 (fsbno 16), 32 bbs
> > inode 133, dir inode -1, type inode
> > core.size = 123142
> > current
> > byte offset 65536, length 512
> > buffer block 128 (fsbno 16), 32 bbs
> > inode 128, dir inode 128, type inode
> > core.size = 42
> >
> > The "type inode" get wrong inode addr due to it trys to get the
> > beginning of an inode chunk, refer to "533d1d229 xfs_db: properly set
> > inode type".
>
> It took me a minute to figure out what this was referring to (though it
Sorry about that :-p
> was obvious from the code change). Might I suggest something like:
>
> The "type inode" command accidentally moves the io cursor because it
> forgets to include the io cursor's buffer offset when it computes the
> inode number from the io cursor's location.
>
> Fixes: 533d1d229a88 ("xfs_db: properly set inode type")
Sure, thanks for this detailed suggestion.
>
> > We don't need to get the beginning of a chunk in set_iocur_type, due
> > to set_cur_inode(ino) will help to do all of that and make a proper
> > verification. We just need to give it a correct inode.
> >
> > Reported-by: Jianhong Yin <jiyin@redhat.com>
> > Signed-off-by: Zorro Lang <zlang@redhat.com>
> > ---
> > db/io.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/db/io.c b/db/io.c
> > index 6628d061..61940a07 100644
> > --- a/db/io.c
> > +++ b/db/io.c
> > @@ -591,6 +591,7 @@ set_iocur_type(
> > /* Inodes are special; verifier checks all inodes in the chunk */
> > if (type->typnm == TYP_INODE) {
> > xfs_daddr_t b = iocur_top->bb;
> > + int bo = iocur_top->boff;
> > xfs_ino_t ino;
> >
> > /*
> > @@ -598,7 +599,7 @@ set_iocur_type(
> > * which contains the current disk location; daddr may change.
> > */
> > ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
> > - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
> > + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
> > XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
>
> /me feels like this whole thing ought to be revised into something
> involving XFS_OFFBNO_TO_AGINO to make the unit conversions easier to
> read, e.g.:
>
> xfs_daddr_t b = iocur_top->bb;
> xfs_agbno_t agbno;
> xfs_agino_t agino;
>
> agbno = xfs_daddr_to_agbno(mp, b);
> agino = XFS_OFFBNO_TO_AGINO(mp, agbno,
> iocur_top->boff / mp->m_sb.sb_inodesize);
> ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b), agino);
Sure, that looks clearer.
Thanks,
Zorro
>
> --D
>
> > set_cur_inode(ino);
> > return;
> > --
> > 2.20.1
> >
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] xfs_db: use correct inode to set inode type
2020-08-13 13:53 ` Gao Xiang
2020-08-13 15:29 ` Zorro Lang
@ 2020-08-13 17:37 ` Eric Sandeen
1 sibling, 0 replies; 7+ messages in thread
From: Eric Sandeen @ 2020-08-13 17:37 UTC (permalink / raw)
To: Gao Xiang, Zorro Lang; +Cc: linux-xfs
On 8/13/20 6:53 AM, Gao Xiang wrote:
> Hi,
>
> On Thu, Aug 13, 2020 at 02:03:24PM +0800, Zorro Lang wrote:
...
>> diff --git a/db/io.c b/db/io.c
>> index 6628d061..61940a07 100644
>> --- a/db/io.c
>> +++ b/db/io.c
>> @@ -591,6 +591,7 @@ set_iocur_type(
>> /* Inodes are special; verifier checks all inodes in the chunk */
>> if (type->typnm == TYP_INODE) {
>> xfs_daddr_t b = iocur_top->bb;
>> + int bo = iocur_top->boff;
>> xfs_ino_t ino;
>>
>> /*
>> @@ -598,7 +599,7 @@ set_iocur_type(
>> * which contains the current disk location; daddr may change.
>> */
>> ino = XFS_AGINO_TO_INO(mp, xfs_daddr_to_agno(mp, b),
>> - ((b << BBSHIFT) >> mp->m_sb.sb_inodelog) %
>> + (((b << BBSHIFT) + bo) >> mp->m_sb.sb_inodelog) %
>> XFS_AGB_TO_AGINO(mp, mp->m_sb.sb_agblocks));
>> set_cur_inode(ino);
>> return;
>
> Not familar with such code, but after looking into a bit, (my premature
> thought is that) I'm wondering if we need to reverify original buffer in
>
> if (type->fields) {
> ...
> set_cur()
> }
>
> iocur_top->typ = type;
>
> /* verify the buffer if the type has one. */
> ...
>
> since set_cur() already verified the buffer in
> set_cur->libxfs_buf_read->...->libxfs_readbuf_verify?
>
> Not related to this patchset but I'm a bit curious about it now...
I'm wondering about all this, too.
set_cur_inode() actually calls set_cur, which /does/ get into the verifier.
It definitely seems like a mess; the early return from the
if (type->typnm == TYP_INODE) {
block is a little weird, and the explicit verify_read() later in the
function seems like it might be unnecessary?
Agreed that it's unrelated to this bug, though.
-Eric
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2020-08-13 17:37 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-08-13 6:03 [PATCH] xfs_db: use correct inode to set inode type Zorro Lang
2020-08-13 13:53 ` Gao Xiang
2020-08-13 15:29 ` Zorro Lang
2020-08-13 15:28 ` Gao Xiang
2020-08-13 17:37 ` Eric Sandeen
2020-08-13 14:56 ` Darrick J. Wong
2020-08-13 15:36 ` Zorro Lang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox