From: rpeterso@sourceware.org <rpeterso@sourceware.org>
To: cluster-devel.redhat.com
Subject: [Cluster-devel] cluster/gfs2/fsck fsck.h metawalk.c pass1.c pa ...
Date: 29 Nov 2007 16:21:21 -0000 [thread overview]
Message-ID: <20071129162121.1595.qmail@sourceware.org> (raw)
CVSROOT: /cvs/cluster
Module name: cluster
Branch: RHEL5
Changes by: rpeterso at sourceware.org 2007-11-29 16:21:20
Modified files:
gfs2/fsck : fsck.h metawalk.c pass1.c pass1b.c pass1c.c
pass2.c pass3.c pass4.c
Log message:
Resolves: bz 325151: GFS2: gfs2_fsck changes to system inodes don't stick
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/fsck.h.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.3&r2=1.3.2.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/metawalk.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.11&r2=1.3.2.12
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.8&r2=1.4.2.9
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1b.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.3.2.4&r2=1.3.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass1c.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.4&r2=1.4.2.5
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass2.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.6&r2=1.4.2.7
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass3.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.1&r2=1.4.2.2
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass4.c.diff?cvsroot=cluster&only_with_tag=RHEL5&r1=1.4.2.1&r2=1.4.2.2
--- cluster/gfs2/fsck/fsck.h 2007/08/15 22:31:00 1.3.2.3
+++ cluster/gfs2/fsck/fsck.h 2007/11/29 16:21:19 1.3.2.4
@@ -58,6 +58,12 @@
gfs2_grow or something. Count the RGs by hand. */
};
+struct gfs2_inode *get_system_inode(struct gfs2_sbd *sbp, uint64_t block);
+struct gfs2_inode *fsck_load_inode(struct gfs2_sbd *sbp, uint64_t block);
+struct gfs2_inode *fsck_inode_get(struct gfs2_sbd *sdp,
+ struct gfs2_buffer_head *bh);
+void fsck_inode_put(struct gfs2_inode *ip, enum update_flags update);
+
int initialize(struct gfs2_sbd *sbp);
void destroy(struct gfs2_sbd *sbp);
int block_mounters(struct gfs2_sbd *sbp, int block_em);
--- cluster/gfs2/fsck/metawalk.c 2007/11/16 23:22:23 1.3.2.11
+++ cluster/gfs2/fsck/metawalk.c 2007/11/29 16:21:19 1.3.2.12
@@ -12,6 +12,7 @@
#include <inttypes.h>
#include <linux_endian.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
@@ -24,6 +25,84 @@
#include "metawalk.h"
#include "hash.h"
+struct gfs2_inode *get_system_inode(struct gfs2_sbd *sbp, uint64_t block)
+{
+ int j;
+
+ if (block == sbp->md.inum->i_di.di_num.no_addr)
+ return sbp->md.inum;
+ if (block == sbp->md.statfs->i_di.di_num.no_addr)
+ return sbp->md.statfs;
+ if (block == sbp->md.jiinode->i_di.di_num.no_addr)
+ return sbp->md.jiinode;
+ if (block == sbp->md.riinode->i_di.di_num.no_addr)
+ return sbp->md.riinode;
+ if (block == sbp->md.qinode->i_di.di_num.no_addr)
+ return sbp->md.qinode;
+ if (block == sbp->md.pinode->i_di.di_num.no_addr)
+ return sbp->md.pinode;
+ if (block == sbp->md.rooti->i_di.di_num.no_addr)
+ return sbp->md.rooti;
+ if (block == sbp->master_dir->i_di.di_num.no_addr)
+ return sbp->master_dir;
+ if (lf_dip && block == lf_dip->i_di.di_num.no_addr)
+ return lf_dip;
+ for (j = 0; j < sbp->md.journals; j++)
+ if (block == sbp->md.journal[j]->i_di.di_num.no_addr)
+ return sbp->md.journal[j];
+ return NULL;
+}
+
+/* fsck_load_inode - same as gfs2_load_inode() in libgfs2 but system inodes
+ get special treatment. */
+struct gfs2_inode *fsck_load_inode(struct gfs2_sbd *sbp, uint64_t block)
+{
+ struct gfs2_inode *ip = NULL;
+
+ ip = get_system_inode(sbp, block);
+ if (ip) {
+ bhold(ip->i_bh);
+ return ip;
+ }
+ return gfs2_load_inode(sbp, block);
+}
+
+/* fsck_inode_get - same as inode_get() in libgfs2 but system inodes
+ get special treatment. */
+struct gfs2_inode *fsck_inode_get(struct gfs2_sbd *sdp,
+ struct gfs2_buffer_head *bh)
+{
+ struct gfs2_inode *ip, *sysip;
+
+ zalloc(ip, sizeof(struct gfs2_inode));
+ gfs2_dinode_in(&ip->i_di, bh->b_data);
+ ip->i_bh = bh;
+ ip->i_sbd = sdp;
+
+ sysip = get_system_inode(sdp, ip->i_di.di_num.no_addr);
+ if (sysip) {
+ free(ip);
+ return sysip;
+ }
+ return ip;
+}
+
+/* fsck_inode_put - same as inode_put() in libgfs2 but system inodes
+ get special treatment. */
+void fsck_inode_put(struct gfs2_inode *ip, enum update_flags update)
+{
+ struct gfs2_inode *sysip;
+
+ sysip = get_system_inode(ip->i_sbd, ip->i_di.di_num.no_addr);
+ if (sysip) {
+ if (update)
+ gfs2_dinode_out(&ip->i_di, ip->i_bh->b_data);
+ brelse(ip->i_bh, update);
+ } else {
+ inode_put(ip, update);
+ }
+}
+
int dirent_repair(struct gfs2_inode *ip, struct gfs2_buffer_head *bh,
struct gfs2_dirent *de, struct gfs2_dirent *dent,
int type, int first)
@@ -542,6 +621,7 @@
/**
* build_and_check_metalist - check a bunch of indirect blocks
+ * Note: Every buffer put on the metalist should be "held".
* @ip:
* @mlp:
*/
@@ -561,10 +641,8 @@
osi_list_add(&metabh->b_altlist, &mlp[0]);
/* if(<there are no indirect blocks to check>) */
- if (height < 2) {
- brelse(metabh, not_updated);
+ if (height < 2)
return 0;
- }
for (i = 1; i < height; i++){
prev_list = &mlp[i - 1];
cur_list = &mlp[i];
@@ -588,6 +666,8 @@
block = be64_to_cpu(*ptr);
err = pass->check_metalist(ip, block, &nbh,
pass->private);
+ /* check_metalist should hold any buffers
+ it gets with "bread". */
if(err < 0) {
stack;
goto fail;
@@ -598,16 +678,13 @@
block, block);
continue;
}
- if(!nbh) {
+ if(!nbh)
nbh = bread(ip->i_sbd, block);
- osi_list_add(&nbh->b_altlist, cur_list);
- }
- else
- osi_list_add(&nbh->b_altlist, cur_list);
+
+ osi_list_add(&nbh->b_altlist, cur_list);
} /* for all data on the indirect block */
} /* for blocks at that height */
} /* for height */
- brelse(metabh, not_updated);
return 0;
fail:
for (i = 0; i < GFS2_MAX_META_HEIGHT; i++) {
@@ -619,6 +696,7 @@
osi_list_del(&nbh->b_altlist);
}
}
+ /* This is an error path, so we need to release the buffer here: */
brelse(metabh, not_updated);
return -1;
}
@@ -690,6 +768,7 @@
{
bh = osi_list_entry(list->next,
struct gfs2_buffer_head, b_altlist);
+ brelse(bh, not_updated);
osi_list_del(&bh->b_altlist);
}
}
@@ -734,13 +813,13 @@
int error = 0;
bh = bread(sbp, block);
- ip = inode_get(sbp, bh);
+ ip = fsck_inode_get(sbp, bh);
if(ip->i_di.di_flags & GFS2_DIF_EXHASH) {
error = check_leaf(ip, &update, pass);
if(error < 0) {
stack;
- inode_put(ip, not_updated); /* does brelse(bh); */
+ fsck_inode_put(ip, not_updated); /* does brelse(bh); */
return -1;
}
}
@@ -748,12 +827,12 @@
error = check_linear_dir(ip, bh, &update, pass);
if(error < 0) {
stack;
- inode_put(ip, not_updated); /* does brelse(bh); */
+ fsck_inode_put(ip, not_updated); /* does brelse(bh); */
return -1;
}
}
- inode_put(ip, opts.no ? not_updated : update); /* does a brelse */
+ fsck_inode_put(ip, opts.no ? not_updated : update); /* does a brelse */
return error;
}
--- cluster/gfs2/fsck/pass1.c 2007/11/16 23:22:23 1.4.2.8
+++ cluster/gfs2/fsck/pass1.c 2007/11/29 16:21:19 1.4.2.9
@@ -83,7 +83,6 @@
}
nbh = bread(ip->i_sbd, block);
- /** Attention -- experimental code **/
if (gfs2_check_meta(nbh, GFS2_METATYPE_IN)){
log_debug("Bad indirect block pointer "
"(points to something that is not an indirect block).\n");
@@ -94,8 +93,6 @@
}
}else /* blk check ok */
*bh = nbh;
- brelse(nbh, not_updated);
- /** Attention -- experimental code end **/
log_debug("Setting %" PRIu64 " (0x%" PRIx64 ") to indirect block.\n",
block, block);
@@ -285,6 +282,7 @@
block, block);
gfs2_block_set(bl, block, gfs2_dup_block);
bc->ea_count++;
+ ret = 1;
}
else {
leaf_bh = bread(sdp, block);
@@ -465,7 +463,7 @@
invalidate_metatree.check_data = clear_data;
invalidate_metatree.check_leaf = clear_leaf;
- ip = inode_get(sdp, bh);
+ ip = fsck_inode_get(sdp, bh);
if (ip->i_di.di_num.no_addr != block) {
log_err("Inode #%" PRIu64 " (0x%" PRIx64
"): Bad inode address found: %" PRIu64 " (0x%" PRIx64 ")\n",
@@ -483,7 +481,7 @@
if(gfs2_block_check(bl, block, &q)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
if(q.block_type != gfs2_block_free) {
@@ -491,10 +489,10 @@
block, block);
if(gfs2_block_mark(bl, block, gfs2_dup_block)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
@@ -505,12 +503,12 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_dir)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
if(add_to_dir_list(sdp, block)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -519,7 +517,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_file)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -528,7 +526,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_lnk)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -537,7 +535,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_blk)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -546,7 +544,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_chr)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -555,7 +553,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_fifo)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -564,7 +562,7 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_inode_sock)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
break;
@@ -573,15 +571,15 @@
block, block);
if(gfs2_block_set(bl, block, gfs2_meta_inval)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
if(set_link_count(ip->i_sbd, ip->i_di.di_num.no_addr, ip->i_di.di_nlink)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
@@ -596,10 +594,10 @@
log_warn("Marking inode invalid\n");
if(gfs2_block_set(bl, block, gfs2_meta_inval)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
@@ -615,10 +613,10 @@
log_warn("Marking inode invalid\n");
if(gfs2_block_set(bl, block, gfs2_meta_inval)) {
stack;
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return -1;
}
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
}
@@ -627,7 +625,7 @@
error = check_metatree(ip, &pass1_fxns);
if(error < 0) {
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
if(error > 0) {
@@ -635,7 +633,7 @@
/* FIXME: Must set all leaves invalid as well */
check_metatree(ip, &invalidate_metatree);
gfs2_block_set(bl, ip->i_di.di_num.no_addr, gfs2_meta_inval);
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
@@ -663,7 +661,7 @@
ip->i_di.di_num.no_addr);
}
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
return 0;
}
--- cluster/gfs2/fsck/pass1b.c 2007/10/11 20:32:36 1.3.2.4
+++ cluster/gfs2/fsck/pass1b.c 2007/11/29 16:21:19 1.3.2.5
@@ -132,6 +132,8 @@
osi_list_t *tmp1, *tmp2;
struct blocks *b;
struct inode_with_dups *id;
+ struct gfs2_leaf leaf;
+
osi_list_foreach(tmp1, &dup_list) {
b = osi_list_entry(tmp1, struct blocks, list);
osi_list_foreach(tmp2, &b->ref_inode_list) {
@@ -157,6 +159,10 @@
}
}
}
+ /* Return the number of leaf entries so metawalk doesn't flag this
+ leaf as having none. */
+ gfs2_leaf_in(&leaf, bh->b_data);
+ *count = leaf.lf_entries;
return 0;
}
@@ -339,17 +345,22 @@
.check_eattr_extentry = check_eattr_extentry,
};
- ip = gfs2_load_inode(sbp, inode); /* bread, inode_get */
+ ip = fsck_load_inode(sbp, inode); /* bread, inode_get */
log_info("Checking inode %" PRIu64 " (0x%" PRIx64
")'s metatree for references to block %" PRIu64 " (0x%" PRIx64
")\n", inode, inode, b->block_no, b->block_no);
if(check_metatree(ip, &find_refs)) {
stack;
- inode_put(ip, not_updated); /* out, brelse, free */
+ fsck_inode_put(ip, not_updated); /* out, brelse, free */
return -1;
}
log_info("Done checking metatree\n");
-
+ /* Check for ea references in the inode */
+ if(check_inode_eattr(ip, &find_refs) < 0){
+ stack;
+ fsck_inode_put(ip, not_updated); /* out, brelse, free */
+ return -1;
+ }
if (myfi.found) {
if(!(id = malloc(sizeof(*id)))) {
log_crit("Unable to allocate inode_with_dups structure\n");
@@ -367,7 +378,7 @@
id->ea_only = myfi.ea_only;
osi_list_add_prev(&id->list, &b->ref_inode_list);
}
- inode_put(ip, (opts.no ? not_updated : updated)); /* out, brelse, free */
+ fsck_inode_put(ip, (opts.no ? not_updated : updated)); /* out, brelse, free */
return 0;
}
@@ -433,7 +444,7 @@
b->block_no);
/* FIXME: User input */
log_warn("Clearing...\n");
- ip = gfs2_load_inode(sbp, id->block_no);
+ ip = fsck_load_inode(sbp, id->block_no);
dh.b = b;
dh.id = id;
clear_dup_fxns.private = (void *) &dh;
@@ -443,7 +454,7 @@
if(!id->ea_only)
check_metatree(ip, &clear_dup_fxns);
- inode_put(ip, not_updated); /* out, brelse, free */
+ fsck_inode_put(ip, not_updated); /* out, brelse, free */
dh.ref_inode_count--;
if(dh.ref_inode_count == 1)
break;
@@ -522,7 +533,7 @@
log_info("Handling duplicate blocks\n");
out:
while (!osi_list_empty(&dup_list)) {
- b = osi_list_entry(tmp, struct blocks, list);
+ b = osi_list_entry(dup_list.next, struct blocks, list);
if (!skip_this_pass && !rc) /* no error & not asked to skip the rest */
handle_dup_blk(sbp, b);
osi_list_del(&b->list);
--- cluster/gfs2/fsck/pass1c.c 2007/11/16 23:22:23 1.4.2.4
+++ cluster/gfs2/fsck/pass1c.c 2007/11/29 16:21:19 1.4.2.5
@@ -240,7 +240,7 @@
log_info("EA in inode %"PRIu64" (0x%" PRIx64 ")\n",
block_no, block_no);
gfs2_block_clear(bl, block_no, gfs2_eattr_block);
- ip = inode_get(sbp, bh);
+ ip = fsck_inode_get(sbp, bh);
log_debug("Found eattr at %"PRIu64" (0x%" PRIx64 ")\n",
ip->i_di.di_eattr, ip->i_di.di_eattr);
@@ -252,13 +252,10 @@
return -1;
}
- if(update)
- gfs2_dinode_out(&ip->i_di, bh->b_data);
-
- free(ip);
+ fsck_inode_put(ip, update); /* dinode_out, brelse, free */
+ } else {
+ brelse(bh, update);
}
- brelse(bh, update);
-
block_no++;
}
return 0;
--- cluster/gfs2/fsck/pass2.c 2007/11/16 23:22:23 1.4.2.6
+++ cluster/gfs2/fsck/pass2.c 2007/11/29 16:21:19 1.4.2.7
@@ -250,9 +250,9 @@
if(query(&opts, "Clear entry to inode containing bad blocks? (y/n)")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
/* FIXME: make sure all blocks referenced by
* this inode are cleared in the bitmap */
@@ -309,9 +309,9 @@
de->de_inum.no_addr, de->de_inum.no_addr,
block_type_string(&q));
if(query(&opts, "Clear stale directory entry? (y/n) ")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
dirent2_del(ip, bh, prev_de, dent);
*update = 1;
@@ -333,9 +333,9 @@
ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
if(query(&opts, "Clear duplicate '.' entry? (y/n) ")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
dirent2_del(ip, bh, prev_de, dent);
*update = 1;
@@ -364,9 +364,9 @@
de->de_inum.no_addr, de->de_inum.no_addr,
ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
if(query(&opts, "Remove '.' reference? (y/n) ")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
dirent2_del(ip, bh, prev_de, dent);
*update = 1;
@@ -399,9 +399,9 @@
ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
if(query(&opts, "Clear duplicate '..' entry? (y/n) ")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
dirent2_del(ip, bh, prev_de, dent);
*update = 1;
@@ -424,9 +424,9 @@
" something that's not a directory",
ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
if(query(&opts, "Clear bad '..' directory entry? (y/n) ")) {
- entry_ip = gfs2_load_inode(sbp, de->de_inum.no_addr);
+ entry_ip = fsck_load_inode(sbp, de->de_inum.no_addr);
check_inode_eattr(entry_ip, &clear_eattrs);
- inode_put(entry_ip, not_updated);
+ fsck_inode_put(entry_ip, not_updated);
dirent2_del(ip, bh, prev_de, dent);
*update = 1;
@@ -685,13 +685,13 @@
if(ds.q.bad_block) {
/* First check that the directory's metatree
* is valid */
- ip = gfs2_load_inode(sbp, i);
+ ip = fsck_load_inode(sbp, i);
if(check_metatree(ip, &pass2_fxns)) {
stack;
free(ip);
return -1;
}
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
}
error = check_dir(sbp, i, &pass2_fxns);
if(error < 0) {
@@ -730,7 +730,7 @@
gfs2_block_set(bl, i, gfs2_meta_inval);
}
bh = bread(sbp, i);
- ip = inode_get(sbp, bh);
+ ip = fsck_inode_get(sbp, bh);
if(!ds.dotdir) {
log_err("No '.' entry found\n");
sprintf(tmp_name, ".");
@@ -753,21 +753,20 @@
free(filename);
}
- inode_put(ip, not_updated); /* does a brelse */
+ fsck_inode_put(ip, not_updated); /* does a brelse */
bh = bread(sbp, i);
- ip = inode_get(sbp, bh);
+ ip = fsck_inode_get(sbp, bh);
if(ip->i_di.di_entries != ds.entry_count) {
log_err("Entries is %d - should be %d for inode block %" PRIu64
" (0x%" PRIx64 ")\n",
ip->i_di.di_entries, ds.entry_count,
ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
ip->i_di.di_entries = ds.entry_count;
- gfs2_dinode_out(&ip->i_di, bh->b_data);
- inode_put(ip, updated); /* does a brelse */
+ fsck_inode_put(ip, updated); /* does a gfs2_dinode_out, brelse */
}
else
- inode_put(ip, not_updated); /* does a brelse */
+ fsck_inode_put(ip, not_updated); /* does a brelse */
}
return 0;
}
--- cluster/gfs2/fsck/pass3.c 2007/01/23 19:30:19 1.4.2.1
+++ cluster/gfs2/fsck/pass3.c 2007/11/29 16:21:19 1.4.2.2
@@ -31,8 +31,8 @@
int filename_len;
struct gfs2_inode *ip, *pip;
- ip = gfs2_load_inode(sbp, block);
- pip = gfs2_load_inode(sbp, newdotdot);
+ ip = fsck_load_inode(sbp, block);
+ pip = fsck_load_inode(sbp, newdotdot);
/* FIXME: Need to add some interactive
* options here and come up with a
* good default for non-interactive */
@@ -43,15 +43,15 @@
filename_len = strlen("..");
if(!(filename = malloc((sizeof(char) * filename_len) + 1))) {
log_err("Unable to allocate name\n");
- inode_put(ip, not_updated);
- inode_put(pip, not_updated);
+ fsck_inode_put(ip, not_updated);
+ fsck_inode_put(pip, not_updated);
stack;
return -1;
}
if(!memset(filename, 0, (sizeof(char) * filename_len) + 1)) {
log_err("Unable to zero name\n");
- inode_put(ip, not_updated);
- inode_put(pip, not_updated);
+ fsck_inode_put(ip, not_updated);
+ fsck_inode_put(pip, not_updated);
stack;
return -1;
}
@@ -62,8 +62,8 @@
decrement_link(sbp, olddotdot);
dir_add(ip, filename, filename_len, &pip->i_di.di_num, DT_DIR);
increment_link(sbp, newdotdot);
- inode_put(ip, updated);
- inode_put(pip, updated);
+ fsck_inode_put(ip, updated);
+ fsck_inode_put(pip, updated);
return 0;
}
@@ -248,14 +248,14 @@
log_err("Found unlinked directory at block %" PRIu64
" (0x%" PRIx64 ")\n", di->dinode, di->dinode);
- ip = gfs2_load_inode(sbp, di->dinode);
+ ip = fsck_load_inode(sbp, di->dinode);
/* Don't skip zero size directories
* with eattrs */
if(!ip->i_di.di_size && !ip->i_di.di_eattr){
log_err("Unlinked directory has zero size.\n");
if(query(&opts, "Remove zero-size unlinked directory? (y/n) ")) {
gfs2_block_set(bl, di->dinode, gfs2_block_free);
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
break;
} else {
log_err("Zero-size unlinked directory remains\n");
@@ -263,7 +263,7 @@
}
if(query(&opts, "Add unlinked directory to lost+found? (y/n) ")) {
if(add_inode_to_lf(ip)) {
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
stack;
return -1;
}
@@ -271,7 +271,7 @@
} else {
log_err("Unlinked directory remains unlinked\n");
}
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
break;
}
else {
--- cluster/gfs2/fsck/pass4.c 2007/01/23 19:30:19 1.4.2.1
+++ cluster/gfs2/fsck/pass4.c 2007/11/29 16:21:19 1.4.2.2
@@ -85,7 +85,7 @@
log_err("Cleared\n");
continue;
}
- ip = gfs2_load_inode(sbp, ii->inode);
+ ip = fsck_load_inode(sbp, ii->inode);
/* We don't want to clear zero-size files with
* eattrs - there might be relevent info in
@@ -94,7 +94,7 @@
log_err("Unlinked inode has zero size\n");
if(query(&opts, "Clear zero-size unlinked inode? (y/n) ")) {
gfs2_block_set(bl, ii->inode, gfs2_block_free);
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
continue;
}
@@ -103,7 +103,7 @@
f = updated;
if(add_inode_to_lf(ip)) {
stack;
- inode_put(ip, not_updated);
+ fsck_inode_put(ip, not_updated);
return -1;
}
else {
@@ -112,7 +112,7 @@
}
} else
log_err("Unlinked inode left unlinked\n");
- inode_put(ip, f);
+ fsck_inode_put(ip, f);
} /* if(ii->counted_links == 0) */
else if(ii->link_count != ii->counted_links) {
log_err("Link count inconsistent for inode %" PRIu64
@@ -122,9 +122,9 @@
* and write it back out */
if(query(&opts, "Update link count for inode %"
PRIu64 " (0x%" PRIx64 ") ? (y/n) ", ii->inode, ii->inode)) {
- ip = gfs2_load_inode(sbp, ii->inode); /* bread, inode_get */
+ ip = fsck_load_inode(sbp, ii->inode); /* bread, inode_get */
fix_inode_count(sbp, ii, ip);
- inode_put(ip, updated); /* out, brelse, free */
+ fsck_inode_put(ip, updated); /* out, brelse, free */
log_warn("Link count updated for inode %"
PRIu64 " (0x%" PRIx64 ") \n", ii->inode, ii->inode);
} else {
next reply other threads:[~2007-11-29 16:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-11-29 16:21 rpeterso [this message]
-- strict thread matches above, loose matches on Subject: below --
2007-11-29 16:20 [Cluster-devel] cluster/gfs2/fsck fsck.h metawalk.c pass1.c pa rpeterso
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20071129162121.1595.qmail@sourceware.org \
--to=rpeterso@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.