[PATCH] Fix extent overflow bugs (1 of 3)
"David J. Kleikamp" <[email protected]> Tue, 26 Oct 2004 16:01:19 -0500
| Newsgroups | gmane.comp.file-systems.jfs.patches |
|---|---|
| Message-ID | <[email protected]> |
# This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/09/02 10:19:56-05:00 [email protected] # JFS: Fix extent overflow bugs # # The code which handled adding a new extent when it is unable to grow an extent # past the maximum size made an invalid assumption about when the root page # would split. # # Signed-off-by: Dave Kleikamp <[email protected]> # diff -Nru a/fs/jfs/jfs_xtree.c b/fs/jfs/jfs_xtree.c --- a/fs/jfs/jfs_xtree.c 2004-10-26 15:55:49 -05:00 +++ b/fs/jfs/jfs_xtree.c 2004-10-26 15:55:49 -05:00 @@ -1622,7 +1622,6 @@ s64 xaddr; struct tlock *tlck; struct xtlock *xtlck = NULL; - int rootsplit = 0; jfs_info("xtExtend: nxoff:0x%lx nxlen:0x%x", (ulong) xoff, xlen); @@ -1678,8 +1677,6 @@ * The xtSplitUp() will insert the entry and unpin the leaf page. */ if (nextindex == le16_to_cpu(p->header.maxentry)) { - rootsplit = p->header.flag & BT_ROOT; - /* xtSpliUp() unpins leaf pages */ split.mp = mp; split.index = index + 1; @@ -1691,16 +1688,21 @@ if ((rc = xtSplitUp(tid, ip, &split, &btstack))) return rc; + /* get back old page */ + XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); + if (rc) + return rc; /* * if leaf root has been split, original root has been * copied to new child page, i.e., original entry now * resides on the new child page; */ - if (rootsplit) { + if (p->header.flag & BT_INTERNAL) { ASSERT(p->header.nextindex == cpu_to_le16(XTENTRYSTART + 1)); xad = &p->xad[XTENTRYSTART]; bn = addressXAD(xad); + XT_PUTPAGE(mp); /* get new child page */ XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); @@ -1712,11 +1714,6 @@ tlck = txLock(tid, ip, mp, tlckXTREE|tlckGROW); xtlck = (struct xtlock *) & tlck->lock; } - } else { - /* get back old page */ - XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); - if (rc) - return rc; } } /* @@ -1790,7 +1787,6 @@ struct xtlock *xtlck = 0; struct tlock *mtlck; struct maplock *pxdlock; - int rootsplit = 0; /* printf("xtTailgate: nxoff:0x%lx nxlen:0x%x nxaddr:0x%lx\n", @@ -1848,8 +1844,6 @@ * The xtSplitUp() will insert the entry and unpin the leaf page. */ if (nextindex == le16_to_cpu(p->header.maxentry)) { - rootsplit = p->header.flag & BT_ROOT; - /* xtSpliUp() unpins leaf pages */ split.mp = mp; split.index = index + 1; @@ -1861,16 +1855,21 @@ if ((rc = xtSplitUp(tid, ip, &split, &btstack))) return rc; + /* get back old page */ + XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); + if (rc) + return rc; /* * if leaf root has been split, original root has been * copied to new child page, i.e., original entry now * resides on the new child page; */ - if (rootsplit) { + if (p->header.flag & BT_INTERNAL) { ASSERT(p->header.nextindex == cpu_to_le16(XTENTRYSTART + 1)); xad = &p->xad[XTENTRYSTART]; bn = addressXAD(xad); + XT_PUTPAGE(mp); /* get new child page */ XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); @@ -1882,11 +1881,6 @@ tlck = txLock(tid, ip, mp, tlckXTREE|tlckGROW); xtlck = (struct xtlock *) & tlck->lock; } - } else { - /* get back old page */ - XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); - if (rc) - return rc; } } /* @@ -1976,7 +1970,7 @@ s64 nxaddr, xaddr; struct tlock *tlck; struct xtlock *xtlck = NULL; - int rootsplit = 0, newpage = 0; + int newpage = 0; /* there must exist extent to be tailgated */ nxoff = offsetXAD(nxad); @@ -2183,7 +2177,6 @@ /* insert nXAD:recorded */ if (nextindex == le16_to_cpu(p->header.maxentry)) { - rootsplit = p->header.flag & BT_ROOT; /* xtSpliUp() unpins leaf pages */ split.mp = mp; @@ -2196,16 +2189,21 @@ if ((rc = xtSplitUp(tid, ip, &split, &btstack))) return rc; + /* get back old page */ + XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); + if (rc) + return rc; /* * if leaf root has been split, original root has been * copied to new child page, i.e., original entry now * resides on the new child page; */ - if (rootsplit) { + if (p->header.flag & BT_INTERNAL) { ASSERT(p->header.nextindex == cpu_to_le16(XTENTRYSTART + 1)); xad = &p->xad[XTENTRYSTART]; bn = addressXAD(xad); + XT_PUTPAGE(mp); /* get new child page */ XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); @@ -2218,11 +2216,6 @@ xtlck = (struct xtlock *) & tlck->lock; } } else { - /* get back old page */ - XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); - if (rc) - return rc; - /* is nXAD on new page ? */ if (newindex > (le16_to_cpu(p->header.maxentry) >> 1)) { @@ -2336,8 +2329,6 @@ xlen = xlen - nxlen; xaddr = xaddr + nxlen; if (nextindex == le16_to_cpu(p->header.maxentry)) { - rootsplit = p->header.flag & BT_ROOT; - /* printf("xtUpdate.updateLeft.split p:0x%p\n", p); */ @@ -2352,16 +2343,22 @@ if ((rc = xtSplitUp(tid, ip, &split, &btstack))) return rc; + /* get back old page */ + XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); + if (rc) + return rc; + /* * if leaf root has been split, original root has been * copied to new child page, i.e., original entry now * resides on the new child page; */ - if (rootsplit) { + if (p->header.flag & BT_INTERNAL) { ASSERT(p->header.nextindex == cpu_to_le16(XTENTRYSTART + 1)); xad = &p->xad[XTENTRYSTART]; bn = addressXAD(xad); + XT_PUTPAGE(mp); /* get new child page */ XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); @@ -2373,11 +2370,6 @@ tlck = txLock(tid, ip, mp, tlckXTREE|tlckGROW); xtlck = (struct xtlock *) & tlck->lock; } - } else { - /* get back old page */ - XT_GETPAGE(ip, bn, mp, PSIZE, p, rc); - if (rc) - return rc; } } else { /* if insert into middle, shift right remaining entries */