[Cluster-devel] [fsck.gfs2 v2 PATCH 02/40] fsck.gfs2: Convert block_type to bitmap_type after pass1 and 5
Bob Peterson
rpeterso at redhat.com
Fri May 6 17:38:55 UTC 2016
This patch changes all the passes that happen after pass1 and 5
from using block_type to using bitmap_type. This is a step toward
eliminating the blockmap after pass1 and pass5 are complete.
Signed-off-by: Bob Peterson <rpeterso at redhat.com>
---
gfs2/fsck/lost_n_found.c | 4 ++--
gfs2/fsck/metawalk.c | 12 ++++++------
gfs2/fsck/pass1b.c | 6 +++---
gfs2/fsck/pass2.c | 6 +++---
gfs2/fsck/pass3.c | 8 ++++----
gfs2/fsck/pass4.c | 2 +-
gfs2/fsck/util.c | 2 +-
gfs2/fsck/util.h | 8 ++++++++
8 files changed, 28 insertions(+), 20 deletions(-)
diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index ba3ae1d..4816b3c 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -131,14 +131,14 @@ void make_sure_lf_exists(struct gfs2_inode *ip)
them in sync so that pass4 can detect and fix any descrepancies. */
set_di_nlink(sdp->md.rooti);
- q = block_type(lf_dip->i_di.di_num.no_addr);
+ q = bitmap_type(sdp, lf_dip->i_di.di_num.no_addr);
if (q != GFS2_BLKST_DINODE) {
lf_was_created = 1;
/* This is a new lost+found directory, so set its block type
and increment link counts for the directories */
/* FIXME: i'd feel better about this if fs_mkdir returned
whether it created a new directory or just found an old one,
- and we used that instead of the block_type to run this */
+ and we used that instead of the bitmap_type to run this */
fsck_blockmap_set(ip, lf_dip->i_di.di_num.no_addr,
_("lost+found dinode"), GFS2_BLKST_DINODE);
dirtree_insert(lf_dip->i_di.di_num);
diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index 8fcaea3..f401f2c 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -1045,7 +1045,7 @@ static int delete_block_if_notdup(struct gfs2_inode *ip, uint64_t block,
if (!valid_block(ip->i_sbd, block))
return meta_error;
- q = block_type(block);
+ q = bitmap_type(ip->i_sbd, block);
if (q == GFS2_BLKST_FREE) {
log_info( _("%s block %lld (0x%llx), part of inode "
"%lld (0x%llx), was already free.\n"),
@@ -1774,7 +1774,7 @@ int remove_dentry_from_dir(struct gfs2_sbd *sdp, uint64_t dir,
remove_dentry_fxns.private = &dentryblock;
remove_dentry_fxns.check_dentry = remove_dentry;
- q = block_type(dir);
+ q = bitmap_type(sdp, dir);
if (q != GFS2_BLKST_DINODE) {
log_info( _("Parent block is not an inode...ignoring\n"));
return 1;
@@ -1825,7 +1825,7 @@ static int del_eattr_generic(struct gfs2_inode *ip, uint64_t block,
uint8_t q;
if (valid_block(ip->i_sbd, block)) {
- q = block_type(block);
+ q = bitmap_type(ip->i_sbd, block);
if (q == GFS2_BLKST_FREE)
was_free = 1;
ret = delete_block_if_notdup(ip, block, NULL, eatype,
@@ -1925,7 +1925,7 @@ static int alloc_metalist(struct gfs2_inode *ip, uint64_t block,
*is_valid = 1;
*was_duplicate = 0;
*bh = bread(ip->i_sbd, block);
- q = block_type(block);
+ q = bitmap_type(ip->i_sbd, block);
if (q == GFS2_BLKST_FREE) {
log_debug(_("%s reference to new metadata block "
"%lld (0x%llx) is now marked as indirect.\n"),
@@ -1947,7 +1947,7 @@ static int alloc_data(struct gfs2_inode *ip, uint64_t metablock,
/* No need to range_check here--if it was added, it's in range. */
/* We can't check the bitmap here because this function is called
after the bitmap has been set but before the blockmap has. */
- q = block_type(block);
+ q = bitmap_type(ip->i_sbd, block);
if (q == GFS2_BLKST_FREE) {
log_debug(_("%s reference to new data block "
"%lld (0x%llx) is now marked as data.\n"),
@@ -1965,7 +1965,7 @@ static int alloc_leaf(struct gfs2_inode *ip, uint64_t block, void *private)
/* No need to range_check here--if it was added, it's in range. */
/* We can't check the bitmap here because this function is called
after the bitmap has been set but before the blockmap has. */
- q = block_type(block);
+ q = bitmap_type(ip->i_sbd, block);
if (q == GFS2_BLKST_FREE)
fsck_blockmap_set(ip, block, _("newly allocated leaf"),
ip->i_sbd->gfs1 ? GFS2_BLKST_DINODE :
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index 16c0aec..66dd0a8 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -216,7 +216,7 @@ static void resolve_dup_references(struct gfs2_sbd *sdp, struct duptree *dt,
return;
this_ref = get_ref_type(id);
- q = block_type(id->block_no);
+ q = bitmap_type(sdp, id->block_no);
if (inval)
log_warn( _("Invalid "));
/* FIXME: If we already found an acceptable reference to this
@@ -525,7 +525,7 @@ static void resolve_last_reference(struct gfs2_sbd *sdp, struct duptree *dt,
if (dt->dup_flags & DUPFLAG_REF1_IS_DUPL)
clone_dup_ref_in_inode(ip, dt);
- q = block_type(id->block_no);
+ q = bitmap_type(sdp, id->block_no);
if (q == GFS2_BLKST_UNLINKED) {
log_debug( _("The remaining reference inode %lld (0x%llx) is "
"marked invalid: Marking the block as free.\n"),
@@ -883,7 +883,7 @@ int pass1b(struct gfs2_sbd *sdp)
"duplicates.\n"), dups_found);
break;
}
- q = block_type(i);
+ q = bitmap_type(sdp, i);
if (q == GFS2_BLKST_FREE || q == GFS2_BLKST_USED)
continue;
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 11777eb..afee8dc 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -506,7 +506,7 @@ static int basic_dentry_checks(struct gfs2_inode *ip, struct gfs2_dirent *dent,
tmp_name);
}
- *q = block_type(entry->no_addr);
+ *q = bitmap_type(sdp, entry->no_addr);
/* Get the status of the directory inode */
/**
* 1. Blocks marked "invalid" were invalidated due to duplicate
@@ -1720,7 +1720,7 @@ static int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
}
iblock = sysinode->i_di.di_num.no_addr;
- ds.q = block_type(iblock);
+ ds.q = bitmap_type(sysinode->i_sbd, iblock);
pass2_fxns.private = (void *) &ds;
if (ds.q == GFS2_BLKST_UNLINKED) {
@@ -1998,7 +1998,7 @@ int pass2(struct gfs2_sbd *sdp)
if (is_system_dir(sdp, dirblk))
continue;
- q = block_type(dirblk);
+ q = bitmap_type(sdp, dirblk);
if (q != GFS2_BLKST_DINODE)
continue;
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index 054953f..7732178 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -75,7 +75,7 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
return NULL;
if (di->dotdot_parent.no_addr == di->treewalk_parent) {
- q_dotdot = block_type(di->dotdot_parent.no_addr);
+ q_dotdot = bitmap_type(sdp, di->dotdot_parent.no_addr);
if (q_dotdot != GFS2_BLKST_DINODE) {
log_err( _("Orphaned directory at block %llu (0x%llx) "
"moved to lost+found\n"),
@@ -95,9 +95,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
(unsigned long long)di->dotdot_parent.no_addr,
(unsigned long long)di->treewalk_parent,
(unsigned long long)di->treewalk_parent);
- q_dotdot = block_type(di->dotdot_parent.no_addr);
+ q_dotdot = bitmap_type(sdp, di->dotdot_parent.no_addr);
dt_dotdot = dirtree_find(di->dotdot_parent.no_addr);
- q_treewalk = block_type(di->treewalk_parent);
+ q_treewalk = bitmap_type(sdp, di->treewalk_parent);
dt_treewalk = dirtree_find(di->treewalk_parent);
/* if the dotdot entry isn't a directory, but the
* treewalk is, treewalk is correct - if the treewalk
@@ -249,7 +249,7 @@ int pass3(struct gfs2_sbd *sdp)
di = tdi;
continue;
}
- q = block_type(di->dinode.no_addr);
+ q = bitmap_type(sdp, di->dinode.no_addr);
if (q == GFS2_BLKST_UNLINKED) {
log_err( _("Found unlinked directory "
"containing bad block at block %llu"
diff --git a/gfs2/fsck/pass4.c b/gfs2/fsck/pass4.c
index 850a2fe..c3fb30a 100644
--- a/gfs2/fsck/pass4.c
+++ b/gfs2/fsck/pass4.c
@@ -70,7 +70,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
log_err( _("Found unlinked inode at %llu (0x%llx)\n"),
(unsigned long long)ii->di_num.no_addr,
(unsigned long long)ii->di_num.no_addr);
- q = block_type(ii->di_num.no_addr);
+ q = bitmap_type(sdp, ii->di_num.no_addr);
if (q == GFS2_BLKST_UNLINKED) {
log_err( _("Unlinked inode %llu (0x%llx) contains "
"bad blocks\n"),
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index 84402fc..44a41ba 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -372,7 +372,7 @@ int add_duplicate_ref(struct gfs2_inode *ip, uint64_t block,
return meta_error;
}
id->block_no = ip->i_di.di_num.no_addr;
- q = block_type(ip->i_di.di_num.no_addr);
+ q = bitmap_type(ip->i_sbd, ip->i_di.di_num.no_addr);
/* If it's an invalid dinode, put it first on the invalid
inode reference list otherwise put it on the normal list. */
if (!inode_valid || q == GFS2_BLKST_UNLINKED)
diff --git a/gfs2/fsck/util.h b/gfs2/fsck/util.h
index 62f8ca6..7d842e2 100644
--- a/gfs2/fsck/util.h
+++ b/gfs2/fsck/util.h
@@ -59,6 +59,14 @@ static inline uint8_t block_type(uint64_t bblock)
return btype;
}
+static inline uint8_t bitmap_type(struct gfs2_sbd *sdp, uint64_t bblock)
+{
+ struct rgrp_tree *rgd;
+
+ rgd = gfs2_blk2rgrpd(sdp, bblock);
+ return lgfs2_get_bitmap(sdp, bblock, rgd);
+}
+
static const inline char *block_type_string(uint8_t q)
{
const char *blktyp[] = {"free", "data", "other", "inode", "invalid"};
--
2.5.5
More information about the Cluster-devel
mailing list