Commit 7038f1cb authored by Dave Kleikamp's avatar Dave Kleikamp

JFS: make sure right-most xtree pages have header.next set to zero

The xtTruncate code was only doing this for leaf pages.  When a file is
horribly fragmented, we may truncate a file leaving an internal page with
an invalid head.next field, which may cause a stale page to be referenced.
Signed-off-by: default avatarDave Kleikamp <shaggy@austin.ibm.com>
parent b6a47fd8
...@@ -3516,16 +3516,10 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) ...@@ -3516,16 +3516,10 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag)
/* process entries backward from last index */ /* process entries backward from last index */
index = le16_to_cpu(p->header.nextindex) - 1; index = le16_to_cpu(p->header.nextindex) - 1;
if (p->header.flag & BT_INTERNAL)
goto getChild;
/*
* leaf page
*/
/* Since this is the rightmost leaf, and we may have already freed /* Since this is the rightmost page at this level, and we may have
* a page that was formerly to the right, let's make sure that the * already freed a page that was formerly to the right, let's make
* next pointer is zero. * sure that the next pointer is zero.
*/ */
if (p->header.next) { if (p->header.next) {
if (log) if (log)
...@@ -3539,6 +3533,12 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag) ...@@ -3539,6 +3533,12 @@ s64 xtTruncate(tid_t tid, struct inode *ip, s64 newsize, int flag)
p->header.next = 0; p->header.next = 0;
} }
if (p->header.flag & BT_INTERNAL)
goto getChild;
/*
* leaf page
*/
freed = 0; freed = 0;
/* does region covered by leaf page precede Teof ? */ /* does region covered by leaf page precede Teof ? */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment