Gitweb:
http://git.fedorahosted.org/git/?p=gfs2-utils.git;a=commitdiff;h=11b917f9...
Commit: 11b917f96e4171b206da53a7b65262e152250180
Parent: 18d0318b96a6b88698fb9ffdfbb3176ae7119f9e
Author: Andrew Price <anprice(a)redhat.com>
AuthorDate: Thu Jun 5 01:41:13 2014 +0100
Committer: Andrew Price <anprice(a)redhat.com>
CommitterDate: Thu Jun 5 01:41:13 2014 +0100
gfs2_edit: Ensure all leaf blocks in per_node are saved
block_is_in_per_node() only checks the first leaf block when the
per_node directory has been split (when the block size is small and/or
the number of journals is large). This caused savemeta to treat the
files in per_node as user data and so didn't save their metadata. Add an
outer loop to iterate over the indirect blocks.
Signed-off-by: Andrew Price <anprice(a)redhat.com>
---
gfs2/edit/savemeta.c | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index a43045f..360b144 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -75,7 +75,7 @@ static int block_is_a_journal(void)
static int block_is_in_per_node(void)
{
- int d;
+ int i;
struct gfs2_inode *per_node_di;
if (sbd.gfs1)
@@ -90,9 +90,12 @@ static int block_is_in_per_node(void)
do_dinode_extended(&per_node_di->i_di, per_node_di->i_bh);
inode_put(&per_node_di);
- for (d = 0; d < indirect->ii[0].dirents; d++) {
- if (block == indirect->ii[0].dirent[d].block)
- return TRUE;
+ for (i = 0; i < indirect_blocks; i++) {
+ int d;
+ for (d = 0; d < indirect->ii[i].dirents; d++) {
+ if (block == indirect->ii[i].dirent[d].block)
+ return TRUE;
+ }
}
return FALSE;
}