From mboxrd@z Thu Jan 1 00:00:00 1970 From: rpeterso@sourceware.org Date: 20 Nov 2006 21:46:24 -0000 Subject: [Cluster-devel] cluster/gfs2/fsck metawalk.c Message-ID: <20061120214624.19041.qmail@sourceware.org> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit CVSROOT: /cvs/cluster Module name: cluster Branch: RHEL50 Changes by: rpeterso at sourceware.org 2006-11-20 21:46:23 Modified files: gfs2/fsck : metawalk.c Log message: Fix another case where lf_dirent_format was not rewritten to disk after it was fixed. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/metawalk.c.diff?cvsroot=cluster&only_with_tag=RHEL50&r1=1.3.4.1&r2=1.3.4.2 --- cluster/gfs2/fsck/metawalk.c 2006/11/20 21:30:40 1.3.4.1 +++ cluster/gfs2/fsck/metawalk.c 2006/11/20 21:46:23 1.3.4.2 @@ -166,6 +166,20 @@ lbh = bread(sbp, leaf_no); gfs2_leaf_in(&leaf, lbh->b_data); + /* + * Early versions of GFS2 had an endianess bug in the kernel + * that set lf_dirent_format to cpu_to_be16(GFS2_FORMAT_DE). + * This was fixed to use cpu_to_be32(), but we should check + * for incorrect values and replace them with the correct value. */ + + if (leaf.lf_dirent_format == (GFS2_FORMAT_DE << 16)) { + log_debug("incorrect lf_dirent_format@leaf #%" PRIu64 "\n", leaf_no); + leaf.lf_dirent_format = GFS2_FORMAT_DE; + gfs2_leaf_out(&leaf, lbh->b_data); + log_debug("Fixing lf_dirent_format.\n"); + *update = updated; + } + exp_count = (1 << (ip->i_di.di_depth - leaf.lf_depth)); log_debug("expected count %u - di_depth %u, leaf depth %u\n", exp_count, ip->i_di.di_depth, leaf.lf_depth); @@ -190,9 +204,8 @@ return 1; if(update && (count != leaf.lf_entries)) { - enum update_flags f; + enum update_flags f = not_updated; - f = not_updated; lbh = bread(sbp, leaf_no); gfs2_leaf_in(&leaf, lbh->b_data); @@ -214,7 +227,7 @@ * compare it against leaf->lf_entries */ break; } else { - brelse(lbh, not_updated); + brelse(lbh, *update); if(!leaf.lf_next) break; leaf_no = leaf.lf_next;