commit 2c070ddf1f552e459d8cb7e08e404b56480353df Author: Andrew Price Date: Mon Jan 28 15:50:51 2019 +0000 gfs2-utils: Accept a char* instead of a buffer head in gfs2_check_meta This allows us to call it from different contexts. Signed-off-by: Andrew Price diff --git a/gfs2/convert/gfs2_convert.c b/gfs2/convert/gfs2_convert.c index 98450493..d13a5252 100644 --- a/gfs2/convert/gfs2_convert.c +++ b/gfs2/convert/gfs2_convert.c @@ -832,7 +832,7 @@ static int fix_xattr(struct gfs2_sbd *sbp, struct gfs2_buffer_head *bh, struct g /* Read in the i_di.di_eattr block */ eabh = bread(sbp, ip->i_di.di_eattr); - if (!gfs2_check_meta(eabh, GFS_METATYPE_IN)) {/* if it is an indirect block */ + if (!gfs2_check_meta(eabh->b_data, GFS_METATYPE_IN)) {/* if it is an indirect block */ len = sbp->bsize - sizeof(struct gfs_indirect); buf = malloc(len); if (!buf) { @@ -1008,7 +1008,7 @@ static int next_rg_metatype(struct gfs2_sbd *sdp, struct rgrp_tree *rgd, return -1; bh = bread(sdp, *block); first = 0; - } while(gfs2_check_meta(bh, type)); + } while(gfs2_check_meta(bh->b_data, type)); brelse(bh); return 0; } @@ -1068,7 +1068,7 @@ static int inode_renumber(struct gfs2_sbd *sbp, uint64_t root_inode_addr, osi_li sbp->sd_sb.sb_root_dir.no_formal_ino = sbp->md.next_inum; } bh = bread(sbp, block); - if (!gfs2_check_meta(bh, GFS_METATYPE_DI)) {/* if it is an dinode */ + if (!gfs2_check_meta(bh->b_data, GFS_METATYPE_DI)) {/* if it is an dinode */ /* Skip the rindex and jindex inodes for now. */ if (block != rindex_addr && block != jindex_addr) { error = adjust_inode(sbp, bh); diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c index b67fde2d..923d6b43 100644 --- a/gfs2/edit/hexedit.c +++ b/gfs2/edit/hexedit.c @@ -1274,7 +1274,7 @@ static int find_rg_metatype(struct rgrp_tree *rgd, uint64_t *blk, uint64_t start for (j = 0; j < m; j++) { *blk = ibuf[j]; bhp = bread(&sbd, *blk); - found = (*blk > startblk) && !gfs2_check_meta(bhp, mtype); + found = (*blk > startblk) && !gfs2_check_meta(bhp->b_data, mtype); brelse(bhp); if (found) { free(ibuf); @@ -2279,7 +2279,7 @@ static int count_dinode_blks(struct rgrp_tree *rgd, int bitmap, rgd->bits[bitmap].bi_start + b); byte = rbh->b_data + off + (b / GFS2_NBBY); bit = (b % GFS2_NBBY) * GFS2_BIT_SIZE; - if (gfs2_check_meta(tbh, GFS2_METATYPE_DI) == 0) { + if (gfs2_check_meta(tbh->b_data, GFS2_METATYPE_DI) == 0) { dinodes++; new_state = GFS2_BLKST_DINODE; } else { @@ -2350,7 +2350,7 @@ static void rg_repair(void) printf("Bitmap #%d:", b); rbh = bread(&sbd, rgd->ri.ri_addr + b); - if (gfs2_check_meta(rbh, mtype)) { /* wrong type */ + if (gfs2_check_meta(rbh->b_data, mtype)) { /* wrong type */ printf("Damaged. Repairing..."); /* Fix the meta header */ memset(rbh->b_data, 0, sbd.bsize); diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c index 04f67fc7..1065e407 100644 --- a/gfs2/edit/savemeta.c +++ b/gfs2/edit/savemeta.c @@ -567,7 +567,7 @@ static int save_leaf_chain(struct metafd *mfd, struct gfs2_sbd *sdp, uint64_t bl return 1; } warm_fuzzy_stuff(blk, FALSE); - if (gfs2_check_meta(bh, GFS2_METATYPE_LF) == 0) { + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_LF) == 0) { int ret = save_bh(mfd, bh, blk, NULL); if (ret != 0) { brelse(bh); diff --git a/gfs2/fsck/fs_recovery.c b/gfs2/fsck/fs_recovery.c index 17b2a3ab..3acbb5d7 100644 --- a/gfs2/fsck/fs_recovery.c +++ b/gfs2/fsck/fs_recovery.c @@ -211,7 +211,7 @@ static int revoke_lo_scan_elements(struct gfs2_inode *ip, unsigned int start, return error; if (!first) { - if (gfs2_check_meta(bh, GFS2_METATYPE_LB)) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_LB)) continue; } while (offset + sizeof(uint64_t) <= sdp->sd_sb.sb_bsize) { @@ -355,7 +355,7 @@ static int foreach_descriptor(struct gfs2_inode *ip, unsigned int start, bmodified(bh); brelse(bh); return error; - } else if (gfs2_check_meta(bh, GFS2_METATYPE_LD)) { + } else if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_LD)) { bmodified(bh); brelse(bh); return -EIO; @@ -649,7 +649,7 @@ static int rangecheck_jmeta(struct gfs2_inode *ip, uint64_t block, rc = rangecheck_jblock(ip, block); if (rc == meta_is_good) { *bh = bread(ip->i_sbd, block); - *is_valid = (gfs2_check_meta(*bh, GFS2_METATYPE_IN) == 0); + *is_valid = (gfs2_check_meta((*bh)->b_data, GFS2_METATYPE_IN) == 0); if (!(*is_valid)) { log_err( _("Journal at block %lld (0x%llx) has a bad " "indirect block pointer %lld (0x%llx) " diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c index 4e323ffa..5720c095 100644 --- a/gfs2/fsck/initialize.c +++ b/gfs2/fsck/initialize.c @@ -243,7 +243,7 @@ static void check_rgrp_integrity(struct gfs2_sbd *sdp, struct rgrp_tree *rgd, if (state == GFS2_BLKST_DINODE) { if (sdp->gfs1) { bh = bread(sdp, diblock); - if (!gfs2_check_meta(bh, + if (!gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI)) rg_useddi++; else @@ -298,7 +298,7 @@ static void check_rgrp_integrity(struct gfs2_sbd *sdp, struct rgrp_tree *rgd, (unsigned long long)diblock, (unsigned long long)diblock); bh = bread(sdp, diblock); - if (!gfs2_check_meta(bh, GFS2_METATYPE_DI)) { + if (!gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI)) { struct gfs2_inode *ip = fsck_inode_get(sdp, rgd, bh); if (ip->i_di.di_blocks > 1) { @@ -1169,7 +1169,7 @@ static int peruse_metadata(struct gfs2_sbd *sdp, uint64_t startblock) /* Max RG size is 2GB. 2G / bsize. */ for (blk = startblock; blk < startblock + max_rg_size; blk++) { bh = bread(sdp, blk); - if (gfs2_check_meta(bh, GFS2_METATYPE_DI)) { + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI)) { brelse(bh); continue; } diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c index a334180f..4d6a2d2c 100644 --- a/gfs2/fsck/metawalk.c +++ b/gfs2/fsck/metawalk.c @@ -559,7 +559,7 @@ int check_leaf(struct gfs2_inode *ip, int lindex, struct metawalk_fxns *pass, /* Try to read in the leaf block. */ lbh = bread(sdp, *leaf_no); /* Make sure it's really a valid leaf block. */ - if (gfs2_check_meta(lbh, GFS2_METATYPE_LF)) { + if (gfs2_check_meta(lbh->b_data, GFS2_METATYPE_LF)) { msg = _("that is not really a leaf"); goto bad_leaf; } @@ -768,7 +768,7 @@ int check_leaf_blks(struct gfs2_inode *ip, struct metawalk_fxns *pass) if (valid_block_ip(ip, leaf_no)) { lbh = bread(sdp, leaf_no); /* Make sure it's really a valid leaf block. */ - if (gfs2_check_meta(lbh, GFS2_METATYPE_LF) == 0) { + if (gfs2_check_meta(lbh->b_data, GFS2_METATYPE_LF) == 0) { brelse(lbh); first_ok_leaf = leaf_no; break; @@ -1268,7 +1268,7 @@ static int build_and_check_metalist(struct gfs2_inode *ip, osi_list_t *mlp, for (tmp = prev_list->next; tmp != prev_list; tmp = tmp->next){ bh = osi_list_entry(tmp, struct gfs2_buffer_head, b_altlist); - if (gfs2_check_meta(bh, iblk_type)) { + if (gfs2_check_meta(bh->b_data, iblk_type)) { if (pass->invalid_meta_is_fatal) return meta_error; @@ -1513,7 +1513,7 @@ static int undo_check_data(struct gfs2_inode *ip, struct metawalk_fxns *pass, static int hdr_size(struct gfs2_buffer_head *bh, int height) { if (height > 1) { - if (gfs2_check_meta(bh, GFS2_METATYPE_IN)) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_IN)) return 0; if (bh->sdp->gfs1) return sizeof(struct gfs_indirect); @@ -1521,7 +1521,7 @@ static int hdr_size(struct gfs2_buffer_head *bh, int height) return sizeof(struct gfs2_meta_header); } /* if this isn't really a dinode, skip it */ - if (gfs2_check_meta(bh, GFS2_METATYPE_DI)) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI)) return 0; return sizeof(struct gfs2_dinode); diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c index c7de3e39..0b59971d 100644 --- a/gfs2/fsck/pass1.c +++ b/gfs2/fsck/pass1.c @@ -393,7 +393,7 @@ static int check_metalist(struct gfs2_inode *ip, uint64_t block, } nbh = bread(ip->i_sbd, block); - *is_valid = (gfs2_check_meta(nbh, iblk_type) == 0); + *is_valid = (gfs2_check_meta(nbh->b_data, iblk_type) == 0); if (!(*is_valid)) { log_err( _("Inode %lld (0x%llx) has a bad indirect block " @@ -519,7 +519,7 @@ static int blockmap_set_as_data(struct gfs2_inode *ip, uint64_t block) /* The bitmap says it's a dinode, but a block reference begs to differ. So which is it? */ bh = bread(ip->i_sbd, block); - if (gfs2_check_meta(bh, GFS2_METATYPE_DI) != 0) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI) != 0) goto out; /* The meta header agrees it's a dinode. But it might be data in @@ -747,7 +747,7 @@ static int check_eattr_indir(struct gfs2_inode *ip, uint64_t indirect, handling sort it out. If it isn't, clear it but don't count it as a duplicate. */ *bh = bread(sdp, indirect); - if (gfs2_check_meta(*bh, GFS2_METATYPE_IN)) { + if (gfs2_check_meta((*bh)->b_data, GFS2_METATYPE_IN)) { bc->ea_count++; if (q != GFS2_BLKST_FREE) { /* Duplicate? */ add_duplicate_ref(ip, indirect, ref_as_ea, 0, @@ -829,7 +829,7 @@ static int check_ealeaf_block(struct gfs2_inode *ip, uint64_t block, int btype, really is an EA. If it is, let duplicate handling sort it out. If it isn't, clear it but don't count it as a duplicate. */ leaf_bh = bread(sdp, block); - if (gfs2_check_meta(leaf_bh, btype)) { + if (gfs2_check_meta(leaf_bh->b_data, btype)) { bc->ea_count++; if (q != GFS2_BLKST_FREE) { /* Duplicate? */ add_duplicate_ref(ip, block, ref_as_ea, 0, @@ -1666,7 +1666,7 @@ static int check_system_inode(struct gfs2_sbd *sdp, " (0x%llx)\n"), filename, (unsigned long long)iblock, (unsigned long long)iblock); - if (gfs2_check_meta((*sysinode)->i_bh, GFS2_METATYPE_DI)) { + if (gfs2_check_meta((*sysinode)->i_bh->b_data, GFS2_METATYPE_DI)) { log_err( _("Found invalid system dinode at block #" "%llu (0x%llx)\n"), (unsigned long long)iblock, @@ -1935,7 +1935,7 @@ static int pass1_process_bitmap(struct gfs2_sbd *sdp, struct rgrp_tree *rgd, uin bh = bread(sdp, block); is_inode = 0; - if (gfs2_check_meta(bh, GFS2_METATYPE_DI) == 0) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI) == 0) is_inode = 1; check_magic = ((struct gfs2_meta_header *) diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c index abc2b960..d10b9089 100644 --- a/gfs2/fsck/pass2.c +++ b/gfs2/fsck/pass2.c @@ -651,7 +651,7 @@ static int basic_dentry_checks(struct gfs2_inode *ip, struct gfs2_dirent *dent, struct gfs2_buffer_head *tbh; tbh = bread(sdp, entry->no_addr); - if (gfs2_check_meta(tbh, GFS2_METATYPE_DI)) { /* not dinode */ + if (gfs2_check_meta(tbh->b_data, GFS2_METATYPE_DI)) { /* not dinode */ log_err( _("Directory entry '%s' pointing to block " "%llu (0x%llx) in directory %llu (0x%llx) " "is not really a GFS1 dinode.\n"), tmp_name, @@ -1600,7 +1600,7 @@ static int check_hash_tbl_dups(struct gfs2_inode *ip, uint64_t *tbl, continue; lbh = bread(ip->i_sbd, leafblk); - if (gfs2_check_meta(lbh, GFS2_METATYPE_LF)) { /* Chked later */ + if (gfs2_check_meta(lbh->b_data, GFS2_METATYPE_LF)) { /* Chked later */ brelse(lbh); continue; } @@ -1794,7 +1794,7 @@ static int check_hash_tbl(struct gfs2_inode *ip, uint64_t *tbl, proper_len, proper_len); lbh = bread(ip->i_sbd, leafblk); gfs2_leaf_in(&leaf, lbh); - if (gfs2_check_meta(lbh, GFS2_METATYPE_LF) || + if (gfs2_check_meta(lbh->b_data, GFS2_METATYPE_LF) || leaf.lf_depth > ip->i_di.di_depth) leaf.lf_depth = factor; brelse(lbh); @@ -1895,7 +1895,7 @@ static int check_data_qc(struct gfs2_inode *ip, uint64_t metablock, return -1; bh = bread(ip->i_sbd, block); - if (gfs2_check_meta(bh, GFS2_METATYPE_QC) != 0) { + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_QC) != 0) { log_crit(_("Error: quota_change block at %lld (0x%llx) is " "the wrong metadata type.\n"), (unsigned long long)block, (unsigned long long)block); diff --git a/gfs2/fsck/pass5.c b/gfs2/fsck/pass5.c index 554f39f9..6693daa5 100644 --- a/gfs2/fsck/pass5.c +++ b/gfs2/fsck/pass5.c @@ -49,7 +49,7 @@ static int check_block_status(struct gfs2_sbd *sdp, struct gfs2_bmap *bl, struct gfs2_buffer_head *bh; bh = bread(sdp, block); - if (gfs2_check_meta(bh, GFS2_METATYPE_DI) == 0) + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_DI) == 0) count[GFS2_BLKST_DINODE]++; else count[GFS1_BLKST_USEDMETA]++; diff --git a/gfs2/fsck/rgrepair.c b/gfs2/fsck/rgrepair.c index f397db1c..9a914615 100644 --- a/gfs2/fsck/rgrepair.c +++ b/gfs2/fsck/rgrepair.c @@ -71,7 +71,7 @@ static void find_journaled_rgs(struct gfs2_sbd *sdp) if (!dblock) break; bh = bread(sdp, dblock); - if (!gfs2_check_meta(bh, GFS2_METATYPE_RG)) { + if (!gfs2_check_meta(bh->b_data, GFS2_METATYPE_RG)) { /* False rgrp found at block dblock */ false_count++; gfs2_special_set(&false_rgrps, dblock); @@ -128,7 +128,7 @@ static int find_shortest_rgdist(struct gfs2_sbd *sdp, uint64_t *dist_array, is_rgrp = 0; else { bh = bread(sdp, blk); - is_rgrp = (gfs2_check_meta(bh, GFS2_METATYPE_RG) == 0); + is_rgrp = (gfs2_check_meta(bh->b_data, GFS2_METATYPE_RG) == 0); brelse(bh); } if (!is_rgrp) { @@ -146,7 +146,7 @@ static int find_shortest_rgdist(struct gfs2_sbd *sdp, uint64_t *dist_array, is_rgrp = 0; } else { bh = bread(sdp, nblk); - is_rgrp = (((gfs2_check_meta(bh, + is_rgrp = (((gfs2_check_meta(bh->b_data, GFS2_METATYPE_RG) == 0))); brelse(bh); } @@ -562,7 +562,7 @@ static int gfs2_rindex_rebuild(struct gfs2_sbd *sdp, int *num_rgs, while (blk <= sdp->device.length) { log_debug( _("Block 0x%llx\n"), (unsigned long long)blk); bh = bread(sdp, blk); - rg_was_fnd = (!gfs2_check_meta(bh, GFS2_METATYPE_RG)); + rg_was_fnd = (!gfs2_check_meta(bh->b_data, GFS2_METATYPE_RG)); brelse(bh); /* Allocate a new RG and index. */ calc_rgd = rgrp_insert(&sdp->rgcalc, blk); @@ -594,7 +594,7 @@ static int gfs2_rindex_rebuild(struct gfs2_sbd *sdp, int *num_rgs, for (fwd_block = blk + 1; fwd_block < sdp->device.length; fwd_block++) { int bitmap_was_fnd; bh = bread(sdp, fwd_block); - bitmap_was_fnd = !gfs2_check_meta(bh, GFS2_METATYPE_RB); + bitmap_was_fnd = !gfs2_check_meta(bh->b_data, GFS2_METATYPE_RB); brelse(bh); if (bitmap_was_fnd) /* if a bitmap */ calc_rgd->ri.ri_length++; diff --git a/gfs2/libgfs2/fs_ops.c b/gfs2/libgfs2/fs_ops.c index 3acfb67f..f796c763 100644 --- a/gfs2/libgfs2/fs_ops.c +++ b/gfs2/libgfs2/fs_ops.c @@ -883,7 +883,7 @@ void dirent2_del(struct gfs2_inode *dip, struct gfs2_buffer_head *bh, uint16_t cur_rec_len, prev_rec_len; bmodified(bh); - if (gfs2_check_meta(bh, GFS2_METATYPE_LF) == 0) { + if (gfs2_check_meta(bh->b_data, GFS2_METATYPE_LF) == 0) { struct gfs2_leaf *lf = (struct gfs2_leaf *)bh->b_data; lf->lf_entries = be16_to_cpu(lf->lf_entries) - 1; @@ -1102,7 +1102,7 @@ int gfs2_get_leaf(struct gfs2_inode *dip, uint64_t leaf_no, int error = 0; *bhp = bread(dip->i_sbd, leaf_no); - error = gfs2_check_meta(*bhp, GFS2_METATYPE_LF); + error = gfs2_check_meta((*bhp)->b_data, GFS2_METATYPE_LF); if(error) brelse(*bhp); return error; @@ -1154,7 +1154,7 @@ static int get_next_leaf(struct gfs2_inode *dip,struct gfs2_buffer_head *bh_in, if (*bh_out == NULL) return -ENOENT; /* Check for a leaf pointing to a non-leaf */ - if (gfs2_check_meta(*bh_out, GFS2_METATYPE_LF)) { + if (gfs2_check_meta((*bh_out)->b_data, GFS2_METATYPE_LF)) { brelse(*bh_out); *bh_out = NULL; return -ENOENT; diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h index 570c89b9..228ecebd 100644 --- a/gfs2/libgfs2/libgfs2.h +++ b/gfs2/libgfs2/libgfs2.h @@ -696,7 +696,7 @@ extern int build_quota(struct gfs2_sbd *sdp); extern int build_root(struct gfs2_sbd *sdp); extern int do_init_inum(struct gfs2_sbd *sdp); extern int do_init_statfs(struct gfs2_sbd *sdp); -extern int gfs2_check_meta(struct gfs2_buffer_head *bh, int type); +extern int gfs2_check_meta(const char *buf, int type); extern unsigned lgfs2_bm_scan(struct rgrp_tree *rgd, unsigned idx, uint64_t *buf, uint8_t state); extern int build_inum_range(struct gfs2_inode *per_node, unsigned int j); diff --git a/gfs2/libgfs2/rgrp.c b/gfs2/libgfs2/rgrp.c index bb0776aa..0040d6dc 100644 --- a/gfs2/libgfs2/rgrp.c +++ b/gfs2/libgfs2/rgrp.c @@ -184,7 +184,7 @@ uint64_t gfs2_rgrp_read(struct gfs2_sbd *sdp, struct rgrp_tree *rgd) int mtype = (x ? GFS2_METATYPE_RB : GFS2_METATYPE_RG); bi->bi_bh = bhs[x]; - if (gfs2_check_meta(bi->bi_bh, mtype)) { + if (gfs2_check_meta(bi->bi_bh->b_data, mtype)) { unsigned err = x; do { brelse(rgd->bits[x].bi_bh); diff --git a/gfs2/libgfs2/structures.c b/gfs2/libgfs2/structures.c index 1cc88b50..208aa5dd 100644 --- a/gfs2/libgfs2/structures.c +++ b/gfs2/libgfs2/structures.c @@ -593,10 +593,10 @@ int do_init_statfs(struct gfs2_sbd *sdp) return 0; } -int gfs2_check_meta(struct gfs2_buffer_head *bh, int type) +int gfs2_check_meta(const char *buf, int type) { - uint32_t check_magic = ((struct gfs2_meta_header *)(bh->b_data))->mh_magic; - uint32_t check_type = ((struct gfs2_meta_header *)(bh->b_data))->mh_type; + uint32_t check_magic = ((struct gfs2_meta_header *)buf)->mh_magic; + uint32_t check_type = ((struct gfs2_meta_header *)buf)->mh_type; check_magic = be32_to_cpu(check_magic); check_type = be32_to_cpu(check_type); diff --git a/gfs2/libgfs2/super.c b/gfs2/libgfs2/super.c index cc9679f5..51657543 100644 --- a/gfs2/libgfs2/super.c +++ b/gfs2/libgfs2/super.c @@ -182,7 +182,7 @@ static int good_on_disk(struct gfs2_sbd *sdp, struct rgrp_tree *rgd) int is_rgrp; bh = bread(sdp, rgd->ri.ri_addr); - is_rgrp = (gfs2_check_meta(bh, GFS2_METATYPE_RG) == 0); + is_rgrp = (gfs2_check_meta(bh->b_data, GFS2_METATYPE_RG) == 0); brelse(bh); return is_rgrp; }