[PATCH] Fix balance Oops

Yan Zheng
2009-08-07T06:14:09Z

invalidate_inode_pages2_range may return -EBUSY occasionally
which results Oops. This patch fixes the issue by moving
invalidate_inode_pages2_range into a loop and keeping calling
it until the return value is not -EBUSY.

Signed-off-by: Yan Zheng <zheng.yan@oracle.com>

---
diff -urp 1/fs/btrfs/relocation.c 2/fs/btrfs/relocation.c
--- 1/fs/btrfs/relocation.c 2009-07-29 10:03:04.367858774 +0800
+++ 2/fs/btrfs/relocation.c 2009-08-07 13:26:43.882147138 +0800
@@ -2553,8 +2553,13 @@ int relocate_inode_pages(struct inode *i
last_index = (start + len - 1) >> PAGE_CACHE_SHIFT;

/* make sure the dirty trick played by the caller work */
- ret = invalidate_inode_pages2_range(inode->i_mapping,
- first_index, last_index);
+ while (1) {
+ ret = invalidate_inode_pages2_range(inode->i_mapping,
+ first_index, last_index);
+ if (ret != -EBUSY)
+ break;
+ cond_resched();
+ }
if (ret)
goto out_unlock;