From: Bob Peterson <rpete...@redhat.com>

This patch creates a new function hdr_size that calculates the size
of a GFS2 metadata header depending on the height and type of block.

rhbz#902920
---
 gfs2/fsck/metawalk.c | 44 +++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index e985dbc..d1b12f1 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -1331,6 +1331,23 @@ static int check_data(struct gfs2_inode *ip, struct 
metawalk_fxns *pass,
        return error;
 }
 
+static int hdr_size(struct gfs2_buffer_head *bh, int height)
+{
+       if (height > 1) {
+               if (gfs2_check_meta(bh, GFS2_METATYPE_IN))
+                       return 0;
+               if (bh->sdp->gfs1)
+                       return sizeof(struct gfs_indirect);
+               else
+                       return sizeof(struct gfs2_meta_header);
+       }
+       /* if this isn't really a dinode, skip it */
+       if (gfs2_check_meta(bh, GFS2_METATYPE_DI))
+               return 0;
+
+       return sizeof(struct gfs2_dinode);
+}
+
 /**
  * check_metatree
  * @ip: inode structure in memory
@@ -1401,28 +1418,13 @@ int check_metatree(struct gfs2_inode *ip, struct 
metawalk_fxns *pass)
                bh = osi_list_entry(list->next, struct gfs2_buffer_head,
                                    b_altlist);
 
-               if (height > 1) {
-                       if (gfs2_check_meta(bh, GFS2_METATYPE_IN)) {
-                               if (bh == ip->i_bh)
-                                       osi_list_del(&bh->b_altlist);
-                               else
-                                       brelse(bh);
-                               continue;
-                       }
-                       if (ip->i_sbd->gfs1)
-                               head_size = sizeof(struct gfs_indirect);
+               head_size = hdr_size(bh, height);
+               if (!head_size) {
+                       if (bh == ip->i_bh)
+                               osi_list_del(&bh->b_altlist);
                        else
-                               head_size = sizeof(struct gfs2_meta_header);
-               } else {
-                       /* if this isn't really a dinode, skip it */
-                       if (gfs2_check_meta(bh, GFS2_METATYPE_DI)) {
-                               if (bh == ip->i_bh)
-                                       osi_list_del(&bh->b_altlist);
-                               else
-                                       brelse(bh);
-                               continue;
-                       }
-                       head_size = sizeof(struct gfs2_dinode);
+                               brelse(bh);
+                       continue;
                }
 
                if (pass->check_data)
-- 
1.7.11.7

Reply via email to