[Cluster-devel] cluster/gfs2/fsck fs_recovery.c initialize.c m ...
rpeterso at sourceware.org
rpeterso at sourceware.org
Thu Jun 15 18:48:49 UTC 2006
CVSROOT: /cvs/cluster
Module name: cluster
Changes by: rpeterso at sourceware.org 2006-06-15 18:48:45
Modified files:
gfs2/fsck : fs_recovery.c initialize.c main.c pass2.c
pass3.c pass4.c util.c
Log message:
Fixed a bug where changes to the root inode are not written to disk.
Also, added logging changes for bz 156009.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/fs_recovery.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/initialize.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/main.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass2.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass3.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/pass4.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/fsck/util.c.diff?cvsroot=cluster&r1=1.3&r2=1.4
--- cluster/gfs2/fsck/fs_recovery.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/fs_recovery.c 2006/06/15 18:48:45 1.4
@@ -97,7 +97,7 @@
int reconstruct_journals(struct gfs2_sbd *sdp){
int i;
- log_warn("Clearing journals (this may take a while)\n");
+ log_notice("Clearing journals (this may take a while)");
for(i=0; i < sdp->md.journals; i++) {
/* Journal replay seems to have slowed down quite a bit in
* the gfs2_fsck */
@@ -106,6 +106,6 @@
if(reconstruct_single_journal(sdp, i))
return -1;
}
- log_notice("Cleared journals\n");
+ log_notice("\nJournals cleared.\n");
return 0;
}
--- cluster/gfs2/fsck/initialize.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/initialize.c 2006/06/15 18:48:45 1.4
@@ -348,6 +348,7 @@
log_warn("Unable to unblock other mounters - manual intevention required\n");
log_warn("Use 'gfs_tool sb <device> proto' to fix\n");
}
+ log_info("Syncing the device.\n");
fsync(sbp->device_fd);
}
empty_super_block(sbp);
--- cluster/gfs2/fsck/main.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/main.c 2006/06/15 18:48:45 1.4
@@ -198,6 +198,7 @@
inode_put(lf_dip, updated);
/* print_map(sbp->bl, sbp->last_fs_block); */
+ log_notice("Writing changes to disk\n");
bsync(sbp);
destroy(sbp);
log_notice("gfs2_fsck complete \n");
--- cluster/gfs2/fsck/pass2.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/pass2.c 2006/06/15 18:48:45 1.4
@@ -226,6 +226,7 @@
struct gfs2_inode *entry_ip = NULL;
struct metawalk_fxns clear_eattrs = {0};
struct gfs2_dirent dentry, *de;
+ uint32_t calculated_hash;
memset(&dentry, 0, sizeof(struct gfs2_dirent));
gfs2_dirent_in(&dentry, (char *)dent);
@@ -250,18 +251,26 @@
/* FIXME: should probably delete the entry here at the
* very least - maybe look at attempting to fix it */
}
-
- if (de->de_hash != gfs2_disk_hash(filename, de->de_name_len)){
+
+ calculated_hash = gfs2_disk_hash(filename, de->de_name_len);
+ if (de->de_hash != calculated_hash){
log_err("Dir entry with bad hash or name length\n"
- "\tHash found = %u\n"
- "\tName found = %s\n"
- "\tName length found = %u\n"
- "\tHash expected = %u\n",
- de->de_hash,
- filename,
- de->de_name_len,
- gfs2_disk_hash(filename, de->de_name_len));
- return 1;
+ "\tHash found = %u (0x%x)\n"
+ "\tFilename = %s\n", de->de_hash, de->de_hash,
+ filename);
+ log_err("\tName length found = %u\n"
+ "\tHash expected = %u (0x%x)\n",
+ de->de_name_len, calculated_hash, calculated_hash);
+ if(query(&opts, "Fix directory hash for %s? (y/n) ",
+ filename)) {
+ de->de_hash = calculated_hash;
+ gfs2_dirent_out(de, (char *)dent);
+ log_err("Directory entry hash for %s fixed.\n", filename);
+ }
+ else {
+ log_err("Directory entry hash for %s not fixed.\n", filename);
+ return 1;
+ }
}
/* FIXME: This should probably go to the top of the fxn, and
* references to filename should be replaced with tmp_name */
@@ -608,7 +617,6 @@
{
uint64_t rootblock;
struct dir_status ds = {0};
- struct gfs2_inode *ip;
struct gfs2_buffer_head b, *bh = &b;
char *filename;
int filename_len;
@@ -630,10 +638,6 @@
* error out if the root block number is valid, but
* gfs2_block_check fails */
return -1;
-/* if(build_rooti(sbp)) {
- stack;
- return -1;
- }*/
}
/* if there are errors with the root inode here, we need to
@@ -660,13 +664,10 @@
pass2_fxns.private = (void *) &ds;
if(ds.q.bad_block) {
/* First check that the directory's metatree is valid */
- ip = gfs2_load_inode(sbp, rootblock);
- if(check_metatree(ip, &pass2_fxns)) {
+ if(check_metatree(sbp->md.rooti, &pass2_fxns)) {
stack;
- free(ip);
return -1;
}
- inode_put(ip, not_updated);
}
error = check_dir(sbp, rootblock, &pass2_fxns);
if(error < 0) {
@@ -676,10 +677,8 @@
if (error > 0)
gfs2_block_set(bl, rootblock, gfs2_meta_inval);
- bh = bread(sbp, rootblock);
- ip = inode_get(sbp, bh);
-
- if(check_inode_eattr(ip, &pass2_fxns)) {
+ bh = bhold(sbp->md.rooti->i_bh);
+ if(check_inode_eattr(sbp->md.rooti, &pass2_fxns)) {
stack;
return -1;
}
@@ -699,36 +698,35 @@
}
memcpy(filename, tmp_name, filename_len);
log_warn("Adding '.' entry\n");
- dir_add(ip, filename, filename_len, &(ip->i_di.di_num), DT_DIR);
- increment_link(ip->i_sbd, ip->i_di.di_num.no_addr);
+ dir_add(sbp->md.rooti, filename, filename_len,
+ &(sbp->md.rooti->i_di.di_num), DT_DIR);
+ increment_link(sbp->md.rooti->i_sbd,
+ sbp->md.rooti->i_di.di_num.no_addr);
ds.entry_count++;
free(filename);
update = 1;
}
- inode_put(ip, not_updated); /* does a brelse */
- bh = bread(sbp, rootblock);
- ip = inode_get(sbp, bh);
- if(ip->i_di.di_entries != ds.entry_count) {
- log_err("Inode %" PRIu64 " (0x%" PRIx64
+ if(sbp->md.rooti->i_di.di_entries != ds.entry_count) {
+ log_err("Root inode %" PRIu64 " (0x%" PRIx64
"): Entries is %d - should be %d\n",
- ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr,
- ip->i_di.di_entries, ds.entry_count);
- if(query(&opts, "Fix entries for inode %" PRIu64 " (0x%" PRIx64
- ")? (y/n) ", ip->i_di.di_num.no_addr,
- ip->i_di.di_num.no_addr)) {
- ip->i_di.di_entries = ds.entry_count;
+ sbp->md.rooti->i_di.di_num.no_addr,
+ sbp->md.rooti->i_di.di_num.no_addr,
+ sbp->md.rooti->i_di.di_entries, ds.entry_count);
+ if(query(&opts, "Fix entries for root inode %" PRIu64 " (0x%" PRIx64
+ ")? (y/n) ", sbp->md.rooti->i_di.di_num.no_addr,
+ sbp->md.rooti->i_di.di_num.no_addr)) {
+ sbp->md.rooti->i_di.di_entries = ds.entry_count;
log_warn("Entries updated\n");
update = 1;
} else {
log_err("Entries for inode %" PRIu64 " (0x%" PRIx64
") left out of sync\n",
- ip->i_di.di_num.no_addr, ip->i_di.di_num.no_addr);
+ sbp->md.rooti->i_di.di_num.no_addr,
+ sbp->md.rooti->i_di.di_num.no_addr);
}
}
- if(update)
- gfs2_dinode_out(&ip->i_di, bh->b_data);
- inode_put(ip, update); /* does a brelse */
+ brelse(bh, update);
return 0;
}
@@ -753,12 +751,12 @@
char *filename;
int filename_len;
char tmp_name[256];
+ int error = 0;
+
if(check_root_dir(sbp)) {
stack;
return -1;
}
- int error = 0;
-
/* Grab each directory inode, and run checks on it */
for(i = 0; i < last_fs_block; i++) {
/* Skip the root inode - it's checked above */
@@ -774,8 +772,8 @@
if(q.block_type != gfs2_inode_dir)
continue;
- log_info("Checking directory inode at block %"PRIu64" (0x%"
- PRIx64 ")\n", i, i);
+ log_debug("Checking directory inode at block %"PRIu64" (0x%"
+ PRIx64 ")\n", i, i);
memset(&ds, 0, sizeof(ds));
pass2_fxns.private = (void *) &ds;
--- cluster/gfs2/fsck/pass3.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/pass3.c 2006/06/15 18:48:45 1.4
@@ -206,6 +206,7 @@
* until we find one that's been checked already. If we don't
* find a parent, put in lost+found.
*/
+ log_info("Checking directory linkage.\n");
for(i = 0; i < FSCK_HASH_SIZE; i++) {
osi_list_foreach(tmp, &dir_hash[i]) {
di = osi_list_entry(tmp, struct dir_info, list);
@@ -272,8 +273,8 @@
break;
}
else {
- log_info("Directory at block %" PRIu64 " (0x%"
- PRIx64 ") connected\n", di->dinode, di->dinode);
+ log_debug("Directory at block %" PRIu64 " (0x%"
+ PRIx64 ") connected\n", di->dinode, di->dinode);
}
di = tdi;
}
--- cluster/gfs2/fsck/pass4.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/pass4.c 2006/06/15 18:48:45 1.4
@@ -53,8 +53,8 @@
log_crit("osi_list_foreach broken in scan_info_list!!\n");
exit(1);
}
- log_info("Checking reference count on inode at block %" PRIu64
- " (0x%" PRIx64 ")\n", ii->inode, ii->inode);
+ log_debug("Checking reference count on inode at block %" PRIu64
+ " (0x%" PRIx64 ")\n", ii->inode, ii->inode);
if(ii->counted_links == 0) {
log_err("Found unlinked inode at %" PRIu64 " (0x%" PRIx64 ")\n",
ii->inode, ii->inode);
@@ -163,6 +163,7 @@
if(lf_dip)
log_debug("At beginning of pass4, lost+found entries is %u\n",
lf_dip->i_di.di_entries);
+ log_info("Checking inode reference counts.\n");
for (i = 0; i < FSCK_HASH_SIZE; i++) {
list = &inode_hash[i];
if(scan_inode_list(sbp, list)) {
--- cluster/gfs2/fsck/util.c 2006/06/12 20:41:43 1.3
+++ cluster/gfs2/fsck/util.c 2006/06/15 18:48:45 1.4
@@ -54,7 +54,7 @@
return height;
}
-/* Put out a warm, fuzzy message every second so the customer */
+/* Put out a warm, fuzzy message every second so the user */
/* doesn't think we hung. (This may take a long time). */
void warm_fuzzy_stuff(uint64_t block)
{
@@ -69,8 +69,7 @@
seconds = tv.tv_sec;
percent = (block * 100) / last_fs_block;
- printf("\r%" PRIu64 " percent complete.\r", percent);
- fflush(stdout);
+ log_notice("\r%" PRIu64 " percent complete.\r", percent);
}
}
More information about the Cluster-devel
mailing list