[Top] [All Lists]

Re: [PATCH] Long btree pointers are still 64 bit on disk

To: Dave Chinner <david@xxxxxxxxxxxxx>
Subject: Re: [PATCH] Long btree pointers are still 64 bit on disk
From: Felix Blyakher <felixb@xxxxxxx>
Date: Wed, 21 Jan 2009 22:02:26 -0600
Cc: Christoph Hellwig <hch@xxxxxxxxxxxxx>, xfs@xxxxxxxxxxx
In-reply-to: <20090122012520.GS10158@disturbed>
References: <20090121042217.GL10158@disturbed> <20090121112648.GA9002@xxxxxxxxxxxxx> <20090121230221.GP10158@disturbed> <20090122012520.GS10158@disturbed>

On Jan 21, 2009, at 7:25 PM, Dave Chinner wrote:

On Wed, Jan 21, 2009 at 06:26:48AM -0500, Christoph Hellwig wrote:
Looks good and passes xfsqs for me.

Thanks Christoph.

SGI, patch with updated metadata is below.

I've added those tags myself as well, hope it's ok if
tags order is different. It's already in ready to push

Please include and push
to Linus ASAP.

The account breakage on oss hold my push. Seems Russell
resolved it, will push right away.





[XFS] Long btree pointers are still 64 bit on disk

On 32 bit machines with CONFIG_LBD=n, XFS reduces the
in memory size of xfs_fsblock_t to 32 bits so that it
will fit within 32 bit addressing. However, the disk format
for long btree pointers are still 64 bits in size.

The recent btree rewrite failed to take this into account
when initialising new btree blocks, setting sibling pointers
to NULL and checking if they are NULL. Hence checking whether
a 64 bit NULL was the same as a 32 bit NULL was failingi
resulting in NULL sibling pointers failing to be detected
correctly. This showed up as WANT_CORRUPTED_GOTO shutdowns
in xfs_btree_delrec.

Fix this by making all the comparisons and setting of long
pointer btree NULL blocks to the disk format, not the
in memory format. i.e. use NULLDFSBNO.

Reported-by: Alexander Beregalov <a.beregalov@xxxxxxxxx>
Reported-by: Jacek Luczak <difrost.kernel@xxxxxxxxx>
Reported-by: Danny ter Haar <dth@xxxxxxx>
Signed-off-by: Dave Chinner <david@xxxxxxxxxxxxx>
Tested-by: Jacek Luczak <difrost.kernel@xxxxxxxxx>
Reviewed-by: Christoph Hellwig <hch@xxxxxxxxxxxxx>

 fs/xfs/xfs_btree.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c
index 2c3ef20..6bc2136 100644
--- a/fs/xfs/xfs_btree.c
+++ b/fs/xfs/xfs_btree.c
@@ -843,7 +843,7 @@ xfs_btree_ptr_is_null(
        union xfs_btree_ptr     *ptr)
        if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
-               return be64_to_cpu(ptr->l) == NULLFSBLOCK;
+               return be64_to_cpu(ptr->l) == NULLDFSBNO;
                return be32_to_cpu(ptr->s) == NULLAGBLOCK;
@@ -854,7 +854,7 @@ xfs_btree_set_ptr_null(
        union xfs_btree_ptr     *ptr)
        if (cur->bc_flags & XFS_BTREE_LONG_PTRS)
-               ptr->l = cpu_to_be64(NULLFSBLOCK);
+               ptr->l = cpu_to_be64(NULLDFSBNO);
                ptr->s = cpu_to_be32(NULLAGBLOCK);
@@ -918,8 +918,8 @@ xfs_btree_init_block(
        new->bb_numrecs = cpu_to_be16(numrecs);

        if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
-               new->bb_u.l.bb_leftsib = cpu_to_be64(NULLFSBLOCK);
-               new->bb_u.l.bb_rightsib = cpu_to_be64(NULLFSBLOCK);
+               new->bb_u.l.bb_leftsib = cpu_to_be64(NULLDFSBNO);
+               new->bb_u.l.bb_rightsib = cpu_to_be64(NULLDFSBNO);
        } else {
                new->bb_u.s.bb_leftsib = cpu_to_be32(NULLAGBLOCK);
                new->bb_u.s.bb_rightsib = cpu_to_be32(NULLAGBLOCK);
@@ -971,7 +971,7 @@ xfs_btree_ptr_to_daddr(
        union xfs_btree_ptr     *ptr)
        if (cur->bc_flags & XFS_BTREE_LONG_PTRS) {
-               ASSERT(be64_to_cpu(ptr->l) != NULLFSBLOCK);
+               ASSERT(be64_to_cpu(ptr->l) != NULLDFSBNO);

                return XFS_FSB_TO_DADDR(cur->bc_mp, be64_to_cpu(ptr->l));
        } else {

xfs mailing list

<Prev in Thread] Current Thread [Next in Thread>