xfs
[Top] [All Lists]

[PATCH] infinite loop in xfs_db

To: xfs@xxxxxxxxxxx
Subject: [PATCH] infinite loop in xfs_db
From: Utako Kusaka <utako@xxxxxxxxxxxxxx>
Date: Wed, 29 Nov 2006 09:46:19 +0900
Sender: xfs-bounce@xxxxxxxxxxx
Hi,

I found two issues in xfs_db.
1)bmap, ablock and dblock command hangs up when the target file has
  either data fork or attr fork which is set XFS_DINODE_FMT_LOCAL. 
  Because bmap() in db/bmap.c performs XFS_DINODE_FMT_BTREE if-block
  and goes into an infinite loop.
2)bmap command does not show attribute area correctly when no option is 
specified.
  Because an offset for attr fork is changed by following code: 
    co = be.startoff + be.blockcount;

This patch fixes them.

Signed-off-by: Utako Kusaka <utako@xxxxxxxxxxxxxx>
---

--- xfsprogs-2.8.15-orgn/db/bmap.c      2006-05-30 23:35:06.000000000 +0900
+++ xfsprogs-2.8.15/db/bmap.c   2006-11-22 14:41:35.004978096 +0900
@@ -77,7 +77,8 @@ bmap(
        fmt = (xfs_dinode_fmt_t)XFS_DFORK_FORMAT(dip, whichfork);
        typ = whichfork == XFS_DATA_FORK ? TYP_BMAPBTD : TYP_BMAPBTA;
        ASSERT(typtab[typ].typnm == typ);
-       ASSERT(fmt == XFS_DINODE_FMT_EXTENTS || fmt == XFS_DINODE_FMT_BTREE);
+       ASSERT(fmt == XFS_DINODE_FMT_LOCAL || fmt == XFS_DINODE_FMT_EXTENTS ||
+               fmt == XFS_DINODE_FMT_BTREE);
        if (fmt == XFS_DINODE_FMT_EXTENTS) {
                nextents = XFS_DFORK_NEXTENTS(dip, whichfork);
                xp = (xfs_bmbt_rec_64_t *)XFS_DFORK_PTR(dip, whichfork);
@@ -85,7 +86,7 @@ bmap(
                        if (!bmap_one_extent(ep, &curoffset, eoffset, &n, bep))
                                break;
                }
-       } else {
+       } else if (fmt == XFS_DINODE_FMT_BTREE) {
                push_cur();
                bno = NULLFSBLOCK;
                rblock = (xfs_bmdr_block_t *)XFS_DFORK_PTR(dip, whichfork);
@@ -147,7 +148,7 @@ bmap_f(
        int             afork = 0;
        bmap_ext_t      be;
        int             c;
-       xfs_dfiloff_t   co;
+       xfs_dfiloff_t   co, cosave;
        int             dfork = 0;
        xfs_dinode_t    *dip;
        xfs_dfiloff_t   eo;
@@ -205,6 +206,7 @@ bmap_f(
                co = 0;
                eo = -1;
        }
+       cosave = co;
        for (whichfork = XFS_DATA_FORK;
             whichfork <= XFS_ATTR_FORK;
             whichfork++) {
@@ -226,6 +228,7 @@ bmap_f(
                                be.blockcount, be.flag);
                        co = be.startoff + be.blockcount;
                }
+               co = cosave;
        }
        return 0;
 }


<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] infinite loop in xfs_db, Utako Kusaka <=