cluster: RHEL6 - gfs2_edit savemeta: Get rid of "slow" mode
Bob Peterson
rpeterso at fedoraproject.org
Thu Feb 16 14:33:46 UTC 2012
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=c59206c5af168ae7ae645ece16ffacf2311ceb82
Commit: c59206c5af168ae7ae645ece16ffacf2311ceb82
Parent: 972afbfa3d72de2beae350d1c7befffa4a698c55
Author: Bob Peterson <rpeterso at redhat.com>
AuthorDate: Fri Oct 28 15:36:00 2011 -0500
Committer: Bob Peterson <rpeterso at redhat.com>
CommitterDate: Thu Feb 16 09:26:41 2012 -0600
gfs2_edit savemeta: Get rid of "slow" mode
"Slow" mode was designed to save file systems that were so corrupt
that they could only be saved a block at a time. The process is
so slow that it's not practical, so I'm removing it.
rhbz#749864
---
gfs2/edit/savemeta.c | 241 +++++++++++++++++++++++---------------------------
1 files changed, 109 insertions(+), 132 deletions(-)
diff --git a/gfs2/edit/savemeta.c b/gfs2/edit/savemeta.c
index 1b9d0a8..b044d3d 100644
--- a/gfs2/edit/savemeta.c
+++ b/gfs2/edit/savemeta.c
@@ -632,14 +632,16 @@ static int next_rg_freemeta(struct gfs2_sbd *sdp, struct rgrp_tree *rgd,
void savemeta(char *out_fn, int saveoption, int gziplevel)
{
- int slow, ret;
+ osi_list_t *tmp;
int rgcount;
uint64_t jindex_block;
struct gfs2_buffer_head *lbh;
struct rgrp_tree *last_rgd, *prev_rgd;
struct metafd mfd;
+ int sane;
+ uint64_t fssize;
+ struct osi_node *n, *next = NULL;
- slow = (saveoption == 1);
sbd.md.journals = 1;
mfd = savemetaopen(out_fn, gziplevel);
@@ -652,151 +654,126 @@ void savemeta(char *out_fn, int saveoption, int gziplevel)
blks_saved = total_out = last_reported_block = 0;
if (!sbd.gfs1)
sbd.bsize = BUFSIZE;
- if (!slow) {
- if (device_geometry(&sbd)) {
- fprintf(stderr, "Geometery error\n");
- exit(-1);
- }
- if (fix_device_geometry(&sbd)) {
- fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
- sbd.device.length << GFS2_BASIC_BLOCK_SHIFT);
- exit(-1);
- }
- sbd.rgtree.osi_node = NULL;
- if (!sbd.gfs1)
- sbd.sd_sb.sb_bsize = GFS2_DEFAULT_BSIZE;
- if (compute_constants(&sbd)) {
- fprintf(stderr, "Bad constants (1)\n");
- exit(-1);
- }
- ret = read_sb(&sbd, 1);
- if (ret < 0) {
- slow = TRUE;
- sbd.gfs1 = 0;
- }
- if (sbd.gfs1)
- sbd.bsize = sbd.sd_sb.sb_bsize;
+ if (device_geometry(&sbd)) {
+ fprintf(stderr, "Geometery error\n");
+ exit(-1);
}
+ if (fix_device_geometry(&sbd)) {
+ fprintf(stderr, "Device is too small (%"PRIu64" bytes)\n",
+ sbd.device.length << GFS2_BASIC_BLOCK_SHIFT);
+ exit(-1);
+ }
+ sbd.rgtree.osi_node = NULL;
+ if (!sbd.gfs1)
+ sbd.sd_sb.sb_bsize = GFS2_DEFAULT_BSIZE;
+ if (compute_constants(&sbd)) {
+ fprintf(stderr, "Bad constants (1)\n");
+ exit(-1);
+ }
+ if (read_sb(&sbd, 1) < 0) {
+ fprintf(stderr, "Unable to read superblock.\n");
+ exit(-1);
+ }
+ if (sbd.gfs1)
+ sbd.bsize = sbd.sd_sb.sb_bsize;
last_fs_block = lseek(sbd.device_fd, 0, SEEK_END) / sbd.bsize;
printf("There are %" PRIu64 " blocks of %u bytes in the destination "
"device.\n", last_fs_block, sbd.bsize);
- if (!slow) {
- if (sbd.gfs1) {
- sbd.md.riinode = inode_read(&sbd,
- sbd1->sb_rindex_di.no_addr);
- jindex_block = sbd1->sb_jindex_di.no_addr;
- } else {
- sbd.master_dir =
- inode_read(&sbd,
- sbd.sd_sb.sb_master_dir.no_addr);
+ if (sbd.gfs1) {
+ sbd.md.riinode = inode_read(&sbd, sbd1->sb_rindex_di.no_addr);
+ jindex_block = sbd1->sb_jindex_di.no_addr;
+ } else {
+ sbd.master_dir = inode_read(&sbd,
+ sbd.sd_sb.sb_master_dir.no_addr);
- slow = gfs2_lookupi(sbd.master_dir, "rindex", 6,
- &sbd.md.riinode);
- jindex_block = masterblock("jindex");
- }
- lbh = bread(&sbd, jindex_block);
- gfs2_dinode_in(&di, lbh);
- if (!sbd.gfs1)
- do_dinode_extended(&di, lbh);
- brelse(lbh);
+ gfs2_lookupi(sbd.master_dir, "rindex", 6, &sbd.md.riinode);
+ jindex_block = masterblock("jindex");
}
- if (!slow) {
- int sane;
- uint64_t fssize;
- struct osi_node *n;
+ lbh = bread(&sbd, jindex_block);
+ gfs2_dinode_in(&di, lbh);
+ if (!sbd.gfs1)
+ do_dinode_extended(&di, lbh);
+ brelse(lbh);
- printf("Reading resource groups...");
- fflush(stdout);
- if (sbd.gfs1)
- slow = gfs1_ri_update(&sbd, 0, &rgcount, 0);
- else
- slow = ri_update(&sbd, 0, &rgcount, &sane);
- n = osi_last(&sbd.rgtree);
- last_rgd = (struct rgrp_tree *)n;
- n = osi_prev(n);
- prev_rgd = (struct rgrp_tree *)n;
- fssize = last_rgd->ri.ri_addr +
- (last_rgd->ri.ri_addr - prev_rgd->ri.ri_addr);
- last_fs_block = fssize;
- fssize *= sbd.bsize;
- printf("Done. File system size: %s\n\n",
- anthropomorphize(fssize));
- fflush(stdout);
- }
+ printf("Reading resource groups...");
+ fflush(stdout);
+ if (sbd.gfs1)
+ gfs1_ri_update(&sbd, 0, &rgcount, 0);
+ else
+ ri_update(&sbd, 0, &rgcount, &sane);
+ n = osi_last(&sbd.rgtree);
+ last_rgd = (struct rgrp_tree *)n;
+ n = osi_prev(n);
+ prev_rgd = (struct rgrp_tree *)n;
+ fssize = last_rgd->ri.ri_addr +
+ (last_rgd->ri.ri_addr - prev_rgd->ri.ri_addr);
+ last_fs_block = fssize;
+ fssize *= sbd.bsize;
+ printf("Done. File system size: %s\n\n", anthropomorphize(fssize));
+ fflush(stdout);
get_journal_inode_blocks();
- if (!slow) {
- struct osi_node *n, *next = NULL;
- /* Save off the superblock */
- save_block(sbd.device_fd, &mfd, 0x10 * (4096 / sbd.bsize));
- /* If this is gfs1, save off the rindex because it's not
- part of the file system as it is in gfs2. */
- if (sbd.gfs1) {
- int j;
+ /* Save off the superblock */
+ save_block(sbd.device_fd, &mfd, 0x10 * (4096 / sbd.bsize));
+ /* If this is gfs1, save off the rindex because it's not
+ part of the file system as it is in gfs2. */
+ if (sbd.gfs1) {
+ int j;
+
+ block = sbd1->sb_rindex_di.no_addr;
+ save_block(sbd.device_fd, &mfd, block);
+ save_inode_data(&mfd);
+ /* In GFS1, journals aren't part of the RG space */
+ for (j = 0; j < journals_found; j++) {
+ log_debug("Saving journal #%d\n", j + 1);
+ for (block = journal_blocks[j];
+ block < journal_blocks[j] + gfs1_journal_size;
+ block++)
+ save_block(sbd.device_fd, &mfd, block);
+ }
+ }
+ /* Walk through the resource groups saving everything within */
+ for (n = osi_first(&sbd.rgtree); n; n = next) {
+ int first;
+ struct rgrp_tree *rgd;
- block = sbd1->sb_rindex_di.no_addr;
+ next = osi_next(n);
+ rgd = (struct rgrp_tree *)n;
+ if (gfs2_rgrp_read(&sbd, rgd))
+ continue;
+ log_debug("RG at %lld (0x%llx) is %u long\n",
+ (unsigned long long)rgd->ri.ri_addr,
+ (unsigned long long)rgd->ri.ri_addr,
+ rgd->ri.ri_length);
+ first = 1;
+ /* Save off the rg and bitmaps */
+ for (block = rgd->ri.ri_addr;
+ block < rgd->ri.ri_data0; block++) {
+ warm_fuzzy_stuff(block, FALSE);
save_block(sbd.device_fd, &mfd, block);
- save_inode_data(&mfd);
- /* In GFS1, journals aren't part of the RG space */
- for (j = 0; j < journals_found; j++) {
- log_debug("Saving journal #%d\n", j + 1);
- for (block = journal_blocks[j];
- block < journal_blocks[j] +
- gfs1_journal_size;
- block++)
- save_block(sbd.device_fd, &mfd, block);
- }
}
- /* Walk through the resource groups saving everything within */
- for (n = osi_first(&sbd.rgtree); n; n = next) {
- int first;
- struct rgrp_tree *rgd;
-
- next = osi_next(n);
- rgd = (struct rgrp_tree *)n;
- slow = gfs2_rgrp_read(&sbd, rgd);
- if (slow)
- continue;
- log_debug("RG at %lld (0x%llx) is %u long\n",
- (unsigned long long)rgd->ri.ri_addr,
- (unsigned long long)rgd->ri.ri_addr,
- rgd->ri.ri_length);
- first = 1;
- /* Save off the rg and bitmaps */
- for (block = rgd->ri.ri_addr;
- block < rgd->ri.ri_data0; block++) {
+ /* Save off the other metadata: inodes, etc. */
+ if (saveoption != 2) {
+ int blktype;
+
+ while (!gfs2_next_rg_meta(rgd, &block, first)){
warm_fuzzy_stuff(block, FALSE);
- save_block(sbd.device_fd, &mfd, block);
+ blktype = save_block(sbd.device_fd, &mfd,
+ block);
+ if (blktype == GFS2_METATYPE_DI)
+ save_inode_data(&mfd);
+ first = 0;
}
- /* Save off the other metadata: inodes, etc. */
- if (saveoption != 2) {
- int blktype;
-
- while (!gfs2_next_rg_meta(rgd, &block, first)){
- warm_fuzzy_stuff(block, FALSE);
- blktype = save_block(sbd.device_fd,
- &mfd, block);
- if (blktype == GFS2_METATYPE_DI)
- save_inode_data(&mfd);
- first = 0;
- }
- /* Save off the free/unlinked meta blocks too.
- If we don't, we may run into metadata
- allocation issues. */
- while (!next_rg_freemeta(&sbd, rgd, &block,
- first)) {
- blktype = save_block(sbd.device_fd,
- &mfd, block);
- first = 0;
- }
+ /* Save off the free/unlinked meta blocks too.
+ If we don't, we may run into metadata
+ allocation issues. */
+ while (!next_rg_freemeta(&sbd, rgd, &block, first)) {
+ blktype = save_block(sbd.device_fd,
+ &mfd, block);
+ first = 0;
}
- gfs2_rgrp_relse(rgd);
- }
- }
- if (slow) {
- for (block = 0; block < last_fs_block; block++) {
- save_block(sbd.device_fd, &mfd, block);
}
+ gfs2_rgrp_relse(rgd);
}
/* Clean up */
/* There may be a gap between end of file system and end of device */
More information about the cluster-commits
mailing list