瀏覽代碼

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>
Dave Kleikamp 19 年之前
父節點
當前提交
7038f1cbac
共有 1 個文件被更改,包括 9 次插入9 次删除
  1. 9 9
      fs/jfs/jfs_xtree.c

+ 9 - 9
fs/jfs/jfs_xtree.c

@@ -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
-	 * a page that was formerly to the right, let's make sure that the
-	 * next pointer is zero.
+	/* Since this is the rightmost page at this level, 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 ? */