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: Dave Kleikamp <shaggy@austin.ibm.com>wifi-calibration
parent
b6a47fd8ff
commit
7038f1cbac
|
@ -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;
|
|
||||||
|
|
||||||
/*
|
/* Since this is the rightmost page at this level, and we may have
|
||||||
* leaf page
|
* already freed a page that was formerly to the right, let's make
|
||||||
*/
|
* sure that the next pointer is zero.
|
||||||
|
|
||||||
/* Since this is the rightmost leaf, and we may have already freed
|
|
||||||
* a page that was formerly to the right, let's make 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)
|
||||||
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 ? */
|
||||||
|
|
Loading…
Reference in New Issue