* REVIEW: xfs_metadump improvements
@ 2008-06-30 7:53 Barry Naujok
2008-08-26 2:07 ` Barry Naujok
2008-08-26 19:12 ` Christoph Hellwig
0 siblings, 2 replies; 3+ messages in thread
From: Barry Naujok @ 2008-06-30 7:53 UTC (permalink / raw)
To: xfs@oss.sgi.com
[-- Attachment #1: Type: text/plain, Size: 7340 bytes --]
Based on what I found in xfs_check, I fixed up xfs_metadump in the
same way.
Also, I've increased the default maximum expected extent size for
a directory, as in practice, 400 block extents for directory
structures is not rare.
--
--- a/xfsprogs/db/metadump.c 2008-06-30 17:51:10.000000000 +1000
+++ b/xfsprogs/db/metadump.c 2008-06-30 17:45:59.609352130 +1000
@@ -27,6 +27,8 @@
#include "sig.h"
#include "xfs_metadump.h"
+#define DEFAULT_MAX_EXT_SIZE 1000
+
/* copy all metadata structures to/from a file */
static int metadump_f(int argc, char **argv);
@@ -58,7 +60,7 @@ static xfs_ino_t cur_ino;
static int show_progress = 0;
static int stop_on_read_error = 0;
-static int max_extent_size = 20;
+static int max_extent_size = DEFAULT_MAX_EXT_SIZE;
static int dont_obfuscate = 0;
static int show_warnings = 0;
static int progress_since_warning = 0;
@@ -80,10 +82,10 @@ metadump_help(void)
" Options:\n"
" -e -- Ignore read errors and keep going\n"
" -g -- Display dump progress\n"
-" -m -- Specify max extent size in blocks to copy (default = 20
blocks)\n"
+" -m -- Specify max extent size in blocks to copy (default = %d
blocks)\n"
" -o -- Don't obfuscate names and extended attributes\n"
" -w -- Show warnings of bad metadata information\n"
-"\n");
+"\n", DEFAULT_MAX_EXT_SIZE);
}
static void
@@ -186,22 +188,26 @@ scan_btree(
typnm_t btype,
void *arg))
{
+ int rval = 0;
+
push_cur();
set_cur(&typtab[btype], XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb,
DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read %s block %u/%u", typtab[btype].name,
agno, agbno);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
if (!(*func)(iocur_top->data, agno, agbno, level - 1, btype, arg))
- return 0;
-
+ goto pop_out;
+ rval = 1;
+pop_out:
pop_cur();
- return 1;
+ return rval;
}
/* free space tree copy routines */
@@ -949,8 +955,10 @@ process_bmbt_reclist(
if (iocur_top->data == NULL) {
print_warning("cannot read %s block %u/%u (%llu)",
typtab[btype].name, agno, agbno, s);
- if (stop_on_read_error)
+ if (stop_on_read_error) {
+ pop_cur();
return 0;
+ }
} else {
if (!dont_obfuscate)
switch (btype) {
@@ -973,8 +981,10 @@ process_bmbt_reclist(
default: ;
}
- if (!write_buf(iocur_top))
+ if (!write_buf(iocur_top)) {
+ pop_cur();
return 0;
+ }
}
pop_cur();
}
@@ -1238,6 +1248,7 @@ copy_inode_chunk(
int off;
xfs_agblock_t agbno;
int i;
+ int rval = 0;
agino = be32_to_cpu(rp->ir_startino);
agbno = XFS_AGINO_TO_AGBNO(mp, agino);
@@ -1258,7 +1269,8 @@ copy_inode_chunk(
DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read inode block %u/%u", agno, agbno);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
/*
@@ -1291,11 +1303,11 @@ copy_inode_chunk(
((off + i) << mp->m_sb.sb_inodelog));
if (!process_inode(agno, agino + i, dip))
- return 0;
+ goto pop_out;
}
skip_processing:
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
inodes_copied += XFS_INODES_PER_CHUNK;
@@ -1303,10 +1315,10 @@ skip_processing:
print_progress("Copied %u of %u inodes (%u of %u AGs)",
inodes_copied, mp->m_sb.sb_icount, agno,
mp->m_sb.sb_agcount);
-
+ rval = 1;
+pop_out:
pop_cur();
-
- return 1;
+ return rval;
}
static int
@@ -1401,61 +1413,66 @@ scan_ag(
{
xfs_agf_t *agf;
xfs_agi_t *agi;
+ int stack_count = 0;
+ int rval = 0;
/* copy the superblock of the AG */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_SB], XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
if (!iocur_top->data) {
print_warning("cannot read superblock for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG free space btree root */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGF], XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
agf = iocur_top->data;
if (iocur_top->data == NULL) {
print_warning("cannot read agf block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG inode btree root */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGI], XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
agi = iocur_top->data;
if (iocur_top->data == NULL) {
print_warning("cannot read agi block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG free list header */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGFL], XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read agfl block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
- pop_cur();
/* copy AG free space btrees */
if (agf) {
@@ -1463,22 +1480,21 @@ scan_ag(
print_progress("Copying free space trees of AG %u",
agno);
if (!copy_free_bno_btree(agno, agf))
- return 0;
+ goto pop_out;
if (!copy_free_cnt_btree(agno, agf))
- return 0;
+ goto pop_out;
}
/* copy inode btrees and the inodes and their associated metadata */
if (agi) {
if (!copy_inodes(agno, agi))
- return 0;
+ goto pop_out;
}
-
- pop_cur();
- pop_cur();
- pop_cur();
-
- return 1;
+ rval = 1;
+pop_out:
+ while (stack_count--)
+ pop_cur();
+ return rval;
}
static int
@@ -1492,6 +1508,7 @@ copy_ino(
xfs_dinode_t *dip;
xfs_dinode_core_t tdic;
int offset;
+ int rval = 0;
if (ino == 0)
return 1;
@@ -1515,7 +1532,8 @@ copy_ino(
if (iocur_top->data == NULL) {
print_warning("cannot read %s inode %lld",
typtab[itype].name, (long long)ino);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize);
@@ -1524,7 +1542,10 @@ copy_ino(
memcpy(&dip->di_core, &tdic, sizeof(xfs_dinode_core_t));
cur_ino = ino;
- return process_inode_data(dip, itype);
+ rval = process_inode_data(dip, itype);
+pop_out:
+ pop_cur();
+ return rval;
}
@@ -1553,6 +1574,7 @@ copy_log(void)
set_cur(&typtab[TYP_LOG], XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart),
mp->m_sb.sb_logblocks * blkbb, DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
+ pop_cur();
print_warning("cannot read log");
return !stop_on_read_error;
}
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: fix_metadump.patch --]
[-- Type: text/x-patch; name=fix_metadump.patch, Size: 6975 bytes --]
--- a/xfsprogs/db/metadump.c 2008-06-30 17:51:10.000000000 +1000
+++ b/xfsprogs/db/metadump.c 2008-06-30 17:45:59.609352130 +1000
@@ -27,6 +27,8 @@
#include "sig.h"
#include "xfs_metadump.h"
+#define DEFAULT_MAX_EXT_SIZE 1000
+
/* copy all metadata structures to/from a file */
static int metadump_f(int argc, char **argv);
@@ -58,7 +60,7 @@ static xfs_ino_t cur_ino;
static int show_progress = 0;
static int stop_on_read_error = 0;
-static int max_extent_size = 20;
+static int max_extent_size = DEFAULT_MAX_EXT_SIZE;
static int dont_obfuscate = 0;
static int show_warnings = 0;
static int progress_since_warning = 0;
@@ -80,10 +82,10 @@ metadump_help(void)
" Options:\n"
" -e -- Ignore read errors and keep going\n"
" -g -- Display dump progress\n"
-" -m -- Specify max extent size in blocks to copy (default = 20 blocks)\n"
+" -m -- Specify max extent size in blocks to copy (default = %d blocks)\n"
" -o -- Don't obfuscate names and extended attributes\n"
" -w -- Show warnings of bad metadata information\n"
-"\n");
+"\n", DEFAULT_MAX_EXT_SIZE);
}
static void
@@ -186,22 +188,26 @@ scan_btree(
typnm_t btype,
void *arg))
{
+ int rval = 0;
+
push_cur();
set_cur(&typtab[btype], XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb,
DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read %s block %u/%u", typtab[btype].name,
agno, agbno);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
if (!(*func)(iocur_top->data, agno, agbno, level - 1, btype, arg))
- return 0;
-
+ goto pop_out;
+ rval = 1;
+pop_out:
pop_cur();
- return 1;
+ return rval;
}
/* free space tree copy routines */
@@ -949,8 +955,10 @@ process_bmbt_reclist(
if (iocur_top->data == NULL) {
print_warning("cannot read %s block %u/%u (%llu)",
typtab[btype].name, agno, agbno, s);
- if (stop_on_read_error)
+ if (stop_on_read_error) {
+ pop_cur();
return 0;
+ }
} else {
if (!dont_obfuscate)
switch (btype) {
@@ -973,8 +981,10 @@ process_bmbt_reclist(
default: ;
}
- if (!write_buf(iocur_top))
+ if (!write_buf(iocur_top)) {
+ pop_cur();
return 0;
+ }
}
pop_cur();
}
@@ -1238,6 +1248,7 @@ copy_inode_chunk(
int off;
xfs_agblock_t agbno;
int i;
+ int rval = 0;
agino = be32_to_cpu(rp->ir_startino);
agbno = XFS_AGINO_TO_AGBNO(mp, agino);
@@ -1258,7 +1269,8 @@ copy_inode_chunk(
DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read inode block %u/%u", agno, agbno);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
/*
@@ -1291,11 +1303,11 @@ copy_inode_chunk(
((off + i) << mp->m_sb.sb_inodelog));
if (!process_inode(agno, agino + i, dip))
- return 0;
+ goto pop_out;
}
skip_processing:
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
inodes_copied += XFS_INODES_PER_CHUNK;
@@ -1303,10 +1315,10 @@ skip_processing:
print_progress("Copied %u of %u inodes (%u of %u AGs)",
inodes_copied, mp->m_sb.sb_icount, agno,
mp->m_sb.sb_agcount);
-
+ rval = 1;
+pop_out:
pop_cur();
-
- return 1;
+ return rval;
}
static int
@@ -1401,61 +1413,66 @@ scan_ag(
{
xfs_agf_t *agf;
xfs_agi_t *agi;
+ int stack_count = 0;
+ int rval = 0;
/* copy the superblock of the AG */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_SB], XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
if (!iocur_top->data) {
print_warning("cannot read superblock for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG free space btree root */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGF], XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
agf = iocur_top->data;
if (iocur_top->data == NULL) {
print_warning("cannot read agf block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG inode btree root */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGI], XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
agi = iocur_top->data;
if (iocur_top->data == NULL) {
print_warning("cannot read agi block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
/* copy the AG free list header */
push_cur();
+ stack_count++;
set_cur(&typtab[TYP_AGFL], XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
print_warning("cannot read agfl block for ag %u", agno);
if (stop_on_read_error)
- return 0;
+ goto pop_out;
} else {
if (!write_buf(iocur_top))
- return 0;
+ goto pop_out;
}
- pop_cur();
/* copy AG free space btrees */
if (agf) {
@@ -1463,22 +1480,21 @@ scan_ag(
print_progress("Copying free space trees of AG %u",
agno);
if (!copy_free_bno_btree(agno, agf))
- return 0;
+ goto pop_out;
if (!copy_free_cnt_btree(agno, agf))
- return 0;
+ goto pop_out;
}
/* copy inode btrees and the inodes and their associated metadata */
if (agi) {
if (!copy_inodes(agno, agi))
- return 0;
+ goto pop_out;
}
-
- pop_cur();
- pop_cur();
- pop_cur();
-
- return 1;
+ rval = 1;
+pop_out:
+ while (stack_count--)
+ pop_cur();
+ return rval;
}
static int
@@ -1492,6 +1508,7 @@ copy_ino(
xfs_dinode_t *dip;
xfs_dinode_core_t tdic;
int offset;
+ int rval = 0;
if (ino == 0)
return 1;
@@ -1515,7 +1532,8 @@ copy_ino(
if (iocur_top->data == NULL) {
print_warning("cannot read %s inode %lld",
typtab[itype].name, (long long)ino);
- return !stop_on_read_error;
+ rval = !stop_on_read_error;
+ goto pop_out;
}
off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize);
@@ -1524,7 +1542,10 @@ copy_ino(
memcpy(&dip->di_core, &tdic, sizeof(xfs_dinode_core_t));
cur_ino = ino;
- return process_inode_data(dip, itype);
+ rval = process_inode_data(dip, itype);
+pop_out:
+ pop_cur();
+ return rval;
}
@@ -1553,6 +1574,7 @@ copy_log(void)
set_cur(&typtab[TYP_LOG], XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart),
mp->m_sb.sb_logblocks * blkbb, DB_RING_IGN, NULL);
if (iocur_top->data == NULL) {
+ pop_cur();
print_warning("cannot read log");
return !stop_on_read_error;
}
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: REVIEW: xfs_metadump improvements
2008-06-30 7:53 REVIEW: xfs_metadump improvements Barry Naujok
@ 2008-08-26 2:07 ` Barry Naujok
2008-08-26 19:12 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Barry Naujok @ 2008-08-26 2:07 UTC (permalink / raw)
To: xfs@oss.sgi.com
Ping?
(This is why no new xfsprogs tarball has been released yet Eric!)
On Mon, 30 Jun 2008 17:53:53 +1000, Barry Naujok <bnaujok@sgi.com> wrote:
> Based on what I found in xfs_check, I fixed up xfs_metadump in the
> same way.
>
> Also, I've increased the default maximum expected extent size for
> a directory, as in practice, 400 block extents for directory
> structures is not rare.
>
> --
>
> --- a/xfsprogs/db/metadump.c 2008-06-30 17:51:10.000000000 +1000
> +++ b/xfsprogs/db/metadump.c 2008-06-30 17:45:59.609352130 +1000
> @@ -27,6 +27,8 @@
> #include "sig.h"
> #include "xfs_metadump.h"
>
> +#define DEFAULT_MAX_EXT_SIZE 1000
> +
> /* copy all metadata structures to/from a file */
>
> static int metadump_f(int argc, char **argv);
> @@ -58,7 +60,7 @@ static xfs_ino_t cur_ino;
>
> static int show_progress = 0;
> static int stop_on_read_error = 0;
> -static int max_extent_size = 20;
> +static int max_extent_size = DEFAULT_MAX_EXT_SIZE;
> static int dont_obfuscate = 0;
> static int show_warnings = 0;
> static int progress_since_warning = 0;
> @@ -80,10 +82,10 @@ metadump_help(void)
> " Options:\n"
> " -e -- Ignore read errors and keep going\n"
> " -g -- Display dump progress\n"
> -" -m -- Specify max extent size in blocks to copy (default = 20
> blocks)\n"
> +" -m -- Specify max extent size in blocks to copy (default = %d
> blocks)\n"
> " -o -- Don't obfuscate names and extended attributes\n"
> " -w -- Show warnings of bad metadata information\n"
> -"\n");
> +"\n", DEFAULT_MAX_EXT_SIZE);
> }
>
> static void
> @@ -186,22 +188,26 @@ scan_btree(
> typnm_t btype,
> void *arg))
> {
> + int rval = 0;
> +
> push_cur();
> set_cur(&typtab[btype], XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb,
> DB_RING_IGN, NULL);
> if (iocur_top->data == NULL) {
> print_warning("cannot read %s block %u/%u", typtab[btype].name,
> agno, agbno);
> - return !stop_on_read_error;
> + rval = !stop_on_read_error;
> + goto pop_out;
> }
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
>
> if (!(*func)(iocur_top->data, agno, agbno, level - 1, btype, arg))
> - return 0;
> -
> + goto pop_out;
> + rval = 1;
> +pop_out:
> pop_cur();
> - return 1;
> + return rval;
> }
>
> /* free space tree copy routines */
> @@ -949,8 +955,10 @@ process_bmbt_reclist(
> if (iocur_top->data == NULL) {
> print_warning("cannot read %s block %u/%u (%llu)",
> typtab[btype].name, agno, agbno, s);
> - if (stop_on_read_error)
> + if (stop_on_read_error) {
> + pop_cur();
> return 0;
> + }
> } else {
> if (!dont_obfuscate)
> switch (btype) {
> @@ -973,8 +981,10 @@ process_bmbt_reclist(
>
> default: ;
> }
> - if (!write_buf(iocur_top))
> + if (!write_buf(iocur_top)) {
> + pop_cur();
> return 0;
> + }
> }
> pop_cur();
> }
> @@ -1238,6 +1248,7 @@ copy_inode_chunk(
> int off;
> xfs_agblock_t agbno;
> int i;
> + int rval = 0;
>
> agino = be32_to_cpu(rp->ir_startino);
> agbno = XFS_AGINO_TO_AGBNO(mp, agino);
> @@ -1258,7 +1269,8 @@ copy_inode_chunk(
> DB_RING_IGN, NULL);
> if (iocur_top->data == NULL) {
> print_warning("cannot read inode block %u/%u", agno, agbno);
> - return !stop_on_read_error;
> + rval = !stop_on_read_error;
> + goto pop_out;
> }
>
> /*
> @@ -1291,11 +1303,11 @@ copy_inode_chunk(
> ((off + i) << mp->m_sb.sb_inodelog));
>
> if (!process_inode(agno, agino + i, dip))
> - return 0;
> + goto pop_out;
> }
> skip_processing:
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
>
> inodes_copied += XFS_INODES_PER_CHUNK;
>
> @@ -1303,10 +1315,10 @@ skip_processing:
> print_progress("Copied %u of %u inodes (%u of %u AGs)",
> inodes_copied, mp->m_sb.sb_icount, agno,
> mp->m_sb.sb_agcount);
> -
> + rval = 1;
> +pop_out:
> pop_cur();
> -
> - return 1;
> + return rval;
> }
>
> static int
> @@ -1401,61 +1413,66 @@ scan_ag(
> {
> xfs_agf_t *agf;
> xfs_agi_t *agi;
> + int stack_count = 0;
> + int rval = 0;
>
> /* copy the superblock of the AG */
> push_cur();
> + stack_count++;
> set_cur(&typtab[TYP_SB], XFS_AG_DADDR(mp, agno, XFS_SB_DADDR),
> XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
> if (!iocur_top->data) {
> print_warning("cannot read superblock for ag %u", agno);
> if (stop_on_read_error)
> - return 0;
> + goto pop_out;
> } else {
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
> }
>
> /* copy the AG free space btree root */
> push_cur();
> + stack_count++;
> set_cur(&typtab[TYP_AGF], XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
> agf = iocur_top->data;
> if (iocur_top->data == NULL) {
> print_warning("cannot read agf block for ag %u", agno);
> if (stop_on_read_error)
> - return 0;
> + goto pop_out;
> } else {
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
> }
>
> /* copy the AG inode btree root */
> push_cur();
> + stack_count++;
> set_cur(&typtab[TYP_AGI], XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
> agi = iocur_top->data;
> if (iocur_top->data == NULL) {
> print_warning("cannot read agi block for ag %u", agno);
> if (stop_on_read_error)
> - return 0;
> + goto pop_out;
> } else {
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
> }
>
> /* copy the AG free list header */
> push_cur();
> + stack_count++;
> set_cur(&typtab[TYP_AGFL], XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
> XFS_FSS_TO_BB(mp, 1), DB_RING_IGN, NULL);
> if (iocur_top->data == NULL) {
> print_warning("cannot read agfl block for ag %u", agno);
> if (stop_on_read_error)
> - return 0;
> + goto pop_out;
> } else {
> if (!write_buf(iocur_top))
> - return 0;
> + goto pop_out;
> }
> - pop_cur();
>
> /* copy AG free space btrees */
> if (agf) {
> @@ -1463,22 +1480,21 @@ scan_ag(
> print_progress("Copying free space trees of AG %u",
> agno);
> if (!copy_free_bno_btree(agno, agf))
> - return 0;
> + goto pop_out;
> if (!copy_free_cnt_btree(agno, agf))
> - return 0;
> + goto pop_out;
> }
>
> /* copy inode btrees and the inodes and their associated metadata */
> if (agi) {
> if (!copy_inodes(agno, agi))
> - return 0;
> + goto pop_out;
> }
> -
> - pop_cur();
> - pop_cur();
> - pop_cur();
> -
> - return 1;
> + rval = 1;
> +pop_out:
> + while (stack_count--)
> + pop_cur();
> + return rval;
> }
>
> static int
> @@ -1492,6 +1508,7 @@ copy_ino(
> xfs_dinode_t *dip;
> xfs_dinode_core_t tdic;
> int offset;
> + int rval = 0;
>
> if (ino == 0)
> return 1;
> @@ -1515,7 +1532,8 @@ copy_ino(
> if (iocur_top->data == NULL) {
> print_warning("cannot read %s inode %lld",
> typtab[itype].name, (long long)ino);
> - return !stop_on_read_error;
> + rval = !stop_on_read_error;
> + goto pop_out;
> }
> off_cur(offset << mp->m_sb.sb_inodelog, mp->m_sb.sb_inodesize);
>
> @@ -1524,7 +1542,10 @@ copy_ino(
> memcpy(&dip->di_core, &tdic, sizeof(xfs_dinode_core_t));
>
> cur_ino = ino;
> - return process_inode_data(dip, itype);
> + rval = process_inode_data(dip, itype);
> +pop_out:
> + pop_cur();
> + return rval;
> }
>
>
> @@ -1553,6 +1574,7 @@ copy_log(void)
> set_cur(&typtab[TYP_LOG], XFS_FSB_TO_DADDR(mp, mp->m_sb.sb_logstart),
> mp->m_sb.sb_logblocks * blkbb, DB_RING_IGN, NULL);
> if (iocur_top->data == NULL) {
> + pop_cur();
> print_warning("cannot read log");
> return !stop_on_read_error;
> }
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: REVIEW: xfs_metadump improvements
2008-06-30 7:53 REVIEW: xfs_metadump improvements Barry Naujok
2008-08-26 2:07 ` Barry Naujok
@ 2008-08-26 19:12 ` Christoph Hellwig
1 sibling, 0 replies; 3+ messages in thread
From: Christoph Hellwig @ 2008-08-26 19:12 UTC (permalink / raw)
To: Barry Naujok; +Cc: xfs@oss.sgi.com
On Mon, Jun 30, 2008 at 05:53:53PM +1000, Barry Naujok wrote:
> Based on what I found in xfs_check, I fixed up xfs_metadump in the
> same way.
That's the pop_cur bits and they look sane to me.
>
> Also, I've increased the default maximum expected extent size for
> a directory, as in practice, 400 block extents for directory
> structures is not rare.
Also looks good, but mixing these two up in the same commit doesn't
seem like a good idea.
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-08-26 19:10 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-06-30 7:53 REVIEW: xfs_metadump improvements Barry Naujok
2008-08-26 2:07 ` Barry Naujok
2008-08-26 19:12 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox