Long btree pointers are still 64 bit on disk

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Linux Kernel Mailing List
Date: Friday, April 3, 2009 - 11:06 am

Gitweb:     http://git.kernel.org/linus/33ad965dde197a016083438359c3163e1aca9ada
Commit:     33ad965dde197a016083438359c3163e1aca9ada
Parent:     55622c6df3600267b1d61fa7e8a4d9341de3db24
Author:     Dave Chinner <david@fromorbit.com>
AuthorDate: Wed Jan 21 15:22:17 2009 +1100
Committer:  Felix Blyakher <felixb@sgi.com>
CommitDate: Wed Jan 21 18:33:46 2009 -0600

    Long btree pointers are still 64 bit on disk
    
    [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@gmail.com>
    Reported-by: Jacek Luczak <difrost.kernel@gmail.com>
    Reported-by: Danny ter Haar <dth@dth.net>
    Tested-by: Jacek Luczak <difrost.kernel@gmail.com>
    Reviewed-by: Christoph Hellwig <hch@infradead.org>
    Signed-off-by: Dave Chinner <david@fromorbit.com>
    Signed-off-by: Felix Blyakher <felixb@sgi.com>
---
 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 4681519..e73c332 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;
 	else
 		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);
 	else
 		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 {
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
Long btree pointers are still 64 bit on disk, Linux Kernel Mailing ..., (Fri Apr 3, 11:06 am)