[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <C91A6455-139E-4E6B-935F-F00332F76616@dilger.ca>
Date: Sat, 26 Jul 2014 00:02:10 -0600
From: Andreas Dilger <adilger@...ger.ca>
To: "Darrick J. Wong" <darrick.wong@...cle.com>
Cc: "tytso@....edu" <tytso@....edu>,
"linux-ext4@...r.kernel.org" <linux-ext4@...r.kernel.org>
Subject: Re: [PATCH 04/18] e2fsck: fix rule-violating lblk->pblk mappings on bigalloc filesystems
Wouldn't it be possible to use this information to determine which
of the inodes sharing a duplicate mapped block is the right one
and which inode is the bad one?
Cheers, Andreas
> On Jul 25, 2014, at 18:34, "Darrick J. Wong" <darrick.wong@...cle.com> wrote:
>
> As far as I can tell, logical block mappings on a bigalloc filesystem are
> supposed to follow a few constraints:
>
> * The logical cluster offset must match the physical cluster offset.
> * A logical cluster may not map to multiple physical clusters.
>
> Since the multiply-claimed block recovery code can be used to fix these
> problems, teach e2fsck to find these transgressions and fix them.
>
> Signed-off-by: Darrick J. Wong <darrick.wong@...cle.com>
> ---
> e2fsck/pass1.c | 52 +++++++++++
> e2fsck/pass1b.c | 42 ++++++++-
> e2fsck/problem.c | 5 +
> e2fsck/problem.h | 3 +
> tests/f_badcluster/expect | 198 +++++++++++++++++++++++++++++++++++++++++++
> tests/f_badcluster/image.gz | Bin
> tests/f_badcluster/name | 2
> tests/f_badcluster/script | 25 +++++
> 8 files changed, 320 insertions(+), 7 deletions(-)
> create mode 100644 tests/f_badcluster/expect
> create mode 100644 tests/f_badcluster/image.gz
> create mode 100644 tests/f_badcluster/name
> create mode 100644 tests/f_badcluster/script
>
>
> diff --git a/e2fsck/pass1.c b/e2fsck/pass1.c
> index a6552e5..646ef8a 100644
> --- a/e2fsck/pass1.c
> +++ b/e2fsck/pass1.c
> @@ -1945,6 +1945,40 @@ void e2fsck_clear_inode(e2fsck_t ctx, ext2_ino_t ino,
> e2fsck_write_inode(ctx, ino, inode, source);
> }
>
> +/*
> + * Use the multiple-blocks reclamation code to fix alignment problems in
> + * a bigalloc filesystem. We want a logical cluster to map to *only* one
> + * physical cluster, and we want the block offsets within that cluster to
> + * line up.
> + */
> +static int has_unaligned_cluster_map(e2fsck_t ctx,
> + blk64_t last_pblk, e2_blkcnt_t last_lblk,
> + blk64_t pblk, blk64_t lblk)
> +{
> + blk64_t cluster_mask;
> +
> + if (!ctx->fs->cluster_ratio_bits)
> + return 0;
> + cluster_mask = EXT2FS_CLUSTER_MASK(ctx->fs);
> +
> + /*
> + * If the block in the logical cluster doesn't align with the block in
> + * the physical cluster...
> + */
> + if ((lblk & cluster_mask) != (pblk & cluster_mask))
> + return 1;
> +
> + /*
> + * If we cross a physical cluster boundary within a logical cluster...
> + */
> + if (last_pblk && (lblk & cluster_mask) != 0 &&
> + EXT2FS_B2C(ctx->fs, lblk) == EXT2FS_B2C(ctx->fs, last_lblk) &&
> + EXT2FS_B2C(ctx->fs, pblk) != EXT2FS_B2C(ctx->fs, last_pblk))
> + return 1;
> +
> + return 0;
> +}
> +
> static void scan_extent_node(e2fsck_t ctx, struct problem_context *pctx,
> struct process_block_struct *pb,
> blk64_t start_block, blk64_t end_block,
> @@ -2249,7 +2283,16 @@ alloc_later:
> mark_block_used(ctx, blk);
> pb->num_blocks++;
> }
> -
> + if (has_unaligned_cluster_map(ctx, pb->previous_block,
> + pb->last_block, blk,
> + blockcnt)) {
> + pctx->blk = blockcnt;
> + pctx->blk2 = blk;
> + fix_problem(ctx, PR_1_MISALIGNED_CLUSTER, pctx);
> + mark_block_used(ctx, blk);
> + mark_block_used(ctx, blk);
> + }
> + pb->last_block = blockcnt;
> pb->previous_block = blk;
>
> if (is_dir) {
> @@ -2815,6 +2858,13 @@ static int process_block(ext2_filsys fs,
> ((unsigned) blockcnt & EXT2FS_CLUSTER_MASK(ctx->fs)))) {
> mark_block_used(ctx, blk);
> p->num_blocks++;
> + } else if (has_unaligned_cluster_map(ctx, p->previous_block,
> + p->last_block, blk, blockcnt)) {
> + pctx->blk = blockcnt;
> + pctx->blk2 = blk;
> + fix_problem(ctx, PR_1_MISALIGNED_CLUSTER, pctx);
> + mark_block_used(ctx, blk);
> + mark_block_used(ctx, blk);
> }
> if (blockcnt >= 0)
> p->last_block = blockcnt;
> diff --git a/e2fsck/pass1b.c b/e2fsck/pass1b.c
> index 8d42d10..c0bfa07 100644
> --- a/e2fsck/pass1b.c
> +++ b/e2fsck/pass1b.c
> @@ -261,7 +261,7 @@ struct process_block_struct {
> e2fsck_t ctx;
> ext2_ino_t ino;
> int dup_blocks;
> - blk64_t cur_cluster;
> + blk64_t cur_cluster, phys_cluster;
> blk64_t last_blk;
> struct ext2_inode *inode;
> struct problem_context *pctx;
> @@ -317,6 +317,7 @@ static void pass1b(e2fsck_t ctx, char *block_buf)
> pb.dup_blocks = 0;
> pb.inode = &inode;
> pb.cur_cluster = ~0;
> + pb.phys_cluster = ~0;
> pb.last_blk = 0;
> pb.pctx->blk = pb.pctx->blk2 = 0;
>
> @@ -360,7 +361,7 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)),
> {
> struct process_block_struct *p;
> e2fsck_t ctx;
> - blk64_t lc;
> + blk64_t lc, pc;
> problem_t op;
>
> if (HOLE_BLKADDR(*block_nr))
> @@ -368,6 +369,7 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)),
> p = (struct process_block_struct *) priv_data;
> ctx = p->ctx;
> lc = EXT2FS_B2C(fs, blockcnt);
> + pc = EXT2FS_B2C(fs, *block_nr);
>
> if (!ext2fs_test_block_bitmap2(ctx->block_dup_map, *block_nr))
> goto finish;
> @@ -389,11 +391,19 @@ static int process_pass1b_block(ext2_filsys fs EXT2FS_ATTR((unused)),
> p->dup_blocks++;
> ext2fs_mark_inode_bitmap2(inode_dup_map, p->ino);
>
> - if (blockcnt < 0 || lc != p->cur_cluster)
> + /*
> + * Qualifications for submitting a block for duplicate processing:
> + * It's an extent/indirect block (and has a negative logical offset);
> + * we've crossed a logical cluster boundary; or the physical cluster
> + * suddenly changed, which indicates that blocks in a logical cluster
> + * are mapped to multiple physical clusters.
> + */
> + if (blockcnt < 0 || lc != p->cur_cluster || pc != p->phys_cluster)
> add_dupe(ctx, p->ino, EXT2FS_B2C(fs, *block_nr), p->inode);
>
> finish:
> p->cur_cluster = lc;
> + p->phys_cluster = pc;
> return 0;
> }
>
> @@ -563,7 +573,11 @@ static void pass1d(e2fsck_t ctx, char *block_buf)
> pctx.dir = t->dir;
> fix_problem(ctx, PR_1D_DUP_FILE_LIST, &pctx);
> }
> - if (file_ok) {
> + /*
> + * Even if the file shares blocks with itself, we still need to
> + * clone the blocks.
> + */
> + if (file_ok && (meta_data ? shared_len+1 : shared_len) != 0) {
> fix_problem(ctx, PR_1D_DUP_BLOCKS_DEALT, &pctx);
> continue;
> }
> @@ -706,9 +720,10 @@ struct clone_struct {
> errcode_t errcode;
> blk64_t dup_cluster;
> blk64_t alloc_block;
> - ext2_ino_t dir;
> + ext2_ino_t dir, ino;
> char *buf;
> e2fsck_t ctx;
> + struct ext2_inode *inode;
> };
>
> static int clone_file_block(ext2_filsys fs,
> @@ -756,13 +771,26 @@ static int clone_file_block(ext2_filsys fs,
> decrement_badcount(ctx, *block_nr, p);
>
> cs->dup_cluster = c;
> -
> + /*
> + * Let's try an implied cluster allocation. If we get the same
> + * cluster back, then we need to find a new block; otherwise,
> + * we're merely fixing the problem of one logical cluster being
> + * mapped to multiple physical clusters.
> + */
> + new_block = 0;
> + retval = ext2fs_map_cluster_block(fs, cs->ino, cs->inode,
> + blockcnt, &new_block);
> + if (retval == 0 && new_block != 0 &&
> + EXT2FS_B2C(ctx->fs, new_block) !=
> + EXT2FS_B2C(ctx->fs, *block_nr))
> + goto cluster_alloc_ok;
> retval = ext2fs_new_block2(fs, 0, ctx->block_found_map,
> &new_block);
> if (retval) {
> cs->errcode = retval;
> return BLOCK_ABORT;
> }
> +cluster_alloc_ok:
> cs->alloc_block = new_block;
>
> got_block:
> @@ -817,6 +845,8 @@ static errcode_t clone_file(e2fsck_t ctx, ext2_ino_t ino,
> cs.dup_cluster = ~0;
> cs.alloc_block = 0;
> cs.ctx = ctx;
> + cs.ino = ino;
> + cs.inode = &dp->inode;
> retval = ext2fs_get_mem(fs->blocksize, &cs.buf);
> if (retval)
> return retval;
> diff --git a/e2fsck/problem.c b/e2fsck/problem.c
> index 60c02af..4da8ba8 100644
> --- a/e2fsck/problem.c
> +++ b/e2fsck/problem.c
> @@ -1048,6 +1048,11 @@ static struct e2fsck_problem problem_table[] = {
> N_("@d @i %i has @x marked uninitialized at @b %c. "),
> PROMPT_FIX, PR_PREEN_OK },
>
> + /* Inode logical block (physical block ) is misaligned. */
> + { PR_1_MISALIGNED_CLUSTER,
> + N_("@i %i logical @b %b (physical @b %c) violates cluster allocation rules.\nWill fix in pass 1B.\n"),
> + PROMPT_NONE, 0 },
> +
> /* Pass 1b errors */
>
> /* Pass 1B: Rescan for duplicate/bad blocks */
> diff --git a/e2fsck/problem.h b/e2fsck/problem.h
> index 6cd3d50..80ef4a2 100644
> --- a/e2fsck/problem.h
> +++ b/e2fsck/problem.h
> @@ -609,6 +609,9 @@ struct problem_context {
> /* uninit directory block */
> #define PR_1_UNINIT_DBLOCK 0x010073
>
> +/* Inode logical block is misaligned */
> +#define PR_1_MISALIGNED_CLUSTER 0x010074
> +
> /*
> * Pass 1b errors
> */
> diff --git a/tests/f_badcluster/expect b/tests/f_badcluster/expect
> new file mode 100644
> index 0000000..eb3bcf0
> --- /dev/null
> +++ b/tests/f_badcluster/expect
> @@ -0,0 +1,198 @@
> +Pass 1: Checking inodes, blocks, and sizes
> +Inode 12 logical block 2 (physical block 1154) violates cluster allocation rules.
> +Will fix in pass 1B.
> +Inode 12, i_blocks is 32, should be 64. Fix? yes
> +
> +Inode 16 logical block 5 (physical block 1173) violates cluster allocation rules.
> +Will fix in pass 1B.
> +Inode 16, i_size is 3072, should be 6144. Fix? yes
> +
> +Inode 16, i_blocks is 32, should be 64. Fix? yes
> +
> +Inode 17 logical block 0 (physical block 1186) violates cluster allocation rules.
> +Will fix in pass 1B.
> +Inode 17 logical block 2 (physical block 1184) violates cluster allocation rules.
> +Will fix in pass 1B.
> +Inode 17, i_blocks is 32, should be 64. Fix? yes
> +
> +Inode 18 logical block 3 (physical block 1201) violates cluster allocation rules.
> +Will fix in pass 1B.
> +Inode 18, i_blocks is 32, should be 64. Fix? yes
> +
> +
> +Running additional passes to resolve blocks claimed by more than one inode...
> +Pass 1B: Rescanning for multiply-claimed blocks
> +Multiply-claimed block(s) in inode 12: 1154
> +Multiply-claimed block(s) in inode 13: 1152--1154
> +Multiply-claimed block(s) in inode 14: 1648--1650
> +Multiply-claimed block(s) in inode 15: 1650
> +Multiply-claimed block(s) in inode 16: 1173
> +Multiply-claimed block(s) in inode 17: 1186 1185 1184
> +Multiply-claimed block(s) in inode 18: 1201
> +Pass 1C: Scanning directories for inodes with multiply-claimed blocks
> +Pass 1D: Reconciling multiply-claimed blocks
> +(There are 7 inodes containing multiply-claimed blocks.)
> +
> +File /a (inode #12, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 1 file(s):
> + /b (inode #13, mod time Tue Jun 17 08:00:50 2014)
> +Clone multiply-claimed blocks? yes
> +
> +File /b (inode #13, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 1 file(s):
> + /a (inode #12, mod time Tue Jun 17 08:00:50 2014)
> +Multiply-claimed blocks already reassigned or cloned.
> +
> +File /c (inode #14, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 1 file(s):
> + /d (inode #15, mod time Tue Jun 17 08:00:50 2014)
> +Clone multiply-claimed blocks? yes
> +
> +File /d (inode #15, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 1 file(s):
> + /c (inode #14, mod time Tue Jun 17 08:00:50 2014)
> +Multiply-claimed blocks already reassigned or cloned.
> +
> +File /e (inode #16, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 0 file(s):
> +Clone multiply-claimed blocks? yes
> +
> +File /f (inode #17, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 0 file(s):
> +Clone multiply-claimed blocks? yes
> +
> +File /g (inode #18, mod time Tue Jun 17 08:00:50 2014)
> + has 1 multiply-claimed block(s), shared with 0 file(s):
> +Clone multiply-claimed blocks? yes
> +
> +Pass 2: Checking directory structure
> +Pass 3: Checking directory connectivity
> +Pass 4: Checking reference counts
> +Pass 5: Checking group summary information
> +Free blocks count wrong for group #0 (50, counted=47).
> +Fix? yes
> +
> +Free blocks count wrong (800, counted=752).
> +Fix? yes
> +
> +
> +test_fs: ***** FILE SYSTEM WAS MODIFIED *****
> +test_fs: 18/128 files (22.2% non-contiguous), 1296/2048 blocks
> +Pass 1: Checking inodes, blocks, and sizes
> +Inode 12, i_blocks is 64, should be 32. Fix? yes
> +
> +Inode 16, i_blocks is 64, should be 32. Fix? yes
> +
> +Inode 17, i_blocks is 64, should be 32. Fix? yes
> +
> +Inode 18, i_blocks is 64, should be 32. Fix? yes
> +
> +Pass 2: Checking directory structure
> +Pass 3: Checking directory connectivity
> +Pass 4: Checking reference counts
> +Pass 5: Checking group summary information
> +Block bitmap differences: -(1168--1200)
> +Fix? yes
> +
> +Free blocks count wrong for group #0 (47, counted=50).
> +Fix? yes
> +
> +Free blocks count wrong (752, counted=800).
> +Fix? yes
> +
> +
> +test_fs: ***** FILE SYSTEM WAS MODIFIED *****
> +test_fs: 18/128 files (5.6% non-contiguous), 1248/2048 blocks
> +Pass 1: Checking inodes, blocks, and sizes
> +Pass 2: Checking directory structure
> +Pass 3: Checking directory connectivity
> +Pass 4: Checking reference counts
> +Pass 5: Checking group summary information
> +test_fs: 18/128 files (5.6% non-contiguous), 1248/2048 blocks
> +debugfs: stat /a
> +Inode: 12 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152157 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0-1):1136-1137, (2):1138
> +debugfs: stat /b
> +Inode: 13 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152158 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0-2):1152-1154
> +debugfs: stat /c
> +Inode: 14 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152159 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0-1):1216-1217, (2):1218
> +debugfs: stat /d
> +Inode: 15 Type: regular Mode: 0644 Flags: 0x0
> +Generation: 1117152160 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +BLOCKS:
> +(TIND):1650
> +TOTAL: 1
> +
> +debugfs: stat /e
> +Inode: 16 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152161 Version: 0x00000001
> +User: 0 Group: 0 Size: 6144
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0-2):1664-1666, (5):1669
> +debugfs: stat /f
> +Inode: 17 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152162 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0):1232, (1):1233, (2):1234
> +debugfs: stat /g
> +Inode: 18 Type: regular Mode: 0644 Flags: 0x80000
> +Generation: 1117152163 Version: 0x00000001
> +User: 0 Group: 0 Size: 3072
> +File ACL: 0 Directory ACL: 0
> +Links: 1 Blockcount: 32
> +Fragment: Address: 0 Number: 0 Size: 0
> +ctime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +atime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +mtime: 0x539ff5b2 -- Tue Jun 17 08:00:50 2014
> +EXTENTS:
> +(0-2):1680-1682, (3):1683
> +debugfs:
> \ No newline at end of file
> diff --git a/tests/f_badcluster/image.gz b/tests/f_badcluster/image.gz
> new file mode 100644
> index 0000000000000000000000000000000000000000..e02ee1866868361e6e82bfbe29982365b2e3aa55
> GIT binary patch
> literal 3131
> zcmeH`eNfVO9LF)YGArHAl6flRwbV_eOvC0A4VPY_dFBj}kaU;3`An&ypmc4h9VhIf
> zG;+!qGBs1@...+2gU*y0Y50JcUV;y)D1xAjhu^x}b(h}$+@E~@...|7`F=jH&*u%L
> z*?=Z=?ARUF%2(nv2aF3y#X5Z+g%u<)LiS(y@}tx>cPz)&G0Qe&A*OK@...{8^q_F-
> zbB{#>iF|Dz=b)|E490O%W`;sOzn*Dtd$W+q>f!h2aWn3xA)rK!kjYY12Cz2VS^ia?
> zJKzn{oZ*j8$vKNhzKW^O#IziXdU8FzD*|<eD@...Ud~^Sa_N2j2lXf(hj_l!WF(Xz
> z^@...XFN;5_JiKlfolqV3uj7S$m~OhGOU?ARvy2Z3xiBLmvwf9s?~oQZlIxv;1!zu
> zbzM+@...Gj2G3`h`BuLoys*(veF#j!uuCmX7XnXQP{(9>l8|3~Qb0L3W_@...ou2S
> z#LwPyeSHU4SGh|_3O@<jVw-ulMAQSCYtw-BmUoczrKImN`3b_5sj-MBHFstycPr9Q
> zyDc_LT!%)FD#_s5hLIl5UXnDPD@...7ViyT0SH2%u*0u$j#2PSivDR6be36cLR7JI
> z>P9Io$LN#}Hy;+P)k<}%cC(5=1%>EC`mJ`K9DhLsMXNnTY7b5%xHS-GMy*X>nRI$s
> zn4{EJv>{B*zOB8Z6U4SCeQg`RoRS%(Z&ez2MRsCB5pII*p9!eO5eo6@...5Fv~;uk
> zMYgdE|JNdavOxx(M+a9JGE#v?A50YtD7>vh#2-d%9rOK)Okcl?dlmE3Udha-PBwlx
> zw<*_LcZb-D6dfZP2dfe{<%37d#Ki?z2z!rK7Yx~>r3c$JM1<s%-6TO8VzA^PvIA2p
> zr@^=X@...NrWr5+)70e+;E{U_fA>jX*E;3D-245!%MWU2YQwru2>?*S{bGVA^+1FB
> z8-;3y!|ILos18QJB|+U;YN8OP0+aw@s+)wy9IvNaJ!a&tRX-rM!{|#hNL**Yt+QAN
> zJh9_Kysv$_Bh~mb8`5JR&ddJMoa1}#T#i6&vzy$;rqF-rzqsGWd$8<0N-IB0;jPp~
> z22J;hV9a6Hf&ScQfGR<EF*<B2wZ4daZ;nx^i0)Iqacq`d{&rb6l&4^4_yVusv+Swi
> z1ak*`wtFPmFfS9Bu<1ZooEm+61;F<$9g=?5M=jQYQ<c*bH6}vQ?^dJ9a3$sY-ekEM
> zucY8tA{+GF>N<>h`Nd1)Ci8h@...iSpmOlA7MwV}^GPJS^lC&^e~*O6GRb2rQ1h+d
> zB*q7XIxlAAlVK8>hUhH`Qg4!ZahPpe$wQ2fuN{FV4;STob=J3cl1ux;sphvTO-et5
> za=9(yX3Y%vwwp~zE$z|267_p4(cyK{(@S=d<tY<GLiz(@c9y?d_xCfA^QuQ;p;6U-
> zgkHj3QM@#;1&o%EeQo}R%l?CeiQ{1XPRZF1iUXvrAI<|wei)IyMDNH*+K}a%dA%B_
> zeZmRAs#0yds@p(lDKZT^e7?L|o5?bXMz^W(-3eHtg@A>Cg@A>Cg@A>?|4(4iWQ{Gq
> K#Rh>6g8l&!3vo*T
>
> literal 0
> HcmV?d00001
>
> diff --git a/tests/f_badcluster/name b/tests/f_badcluster/name
> new file mode 100644
> index 0000000..266f81c
> --- /dev/null
> +++ b/tests/f_badcluster/name
> @@ -0,0 +1,2 @@
> +test alignment problems with bigalloc clusters
> +
> diff --git a/tests/f_badcluster/script b/tests/f_badcluster/script
> new file mode 100644
> index 0000000..ba6b248
> --- /dev/null
> +++ b/tests/f_badcluster/script
> @@ -0,0 +1,25 @@
> +if test -x $DEBUGFS_EXE; then
> + IMAGE=$test_dir/../f_badcluster/image.gz
> + OUT=$test_name.log
> + EXP=$test_dir/expect
> + gzip -d < $IMAGE > $TMPFILE
> + ../misc/tune2fs -L test_fs $TMPFILE
> + ../e2fsck/e2fsck -fy $TMPFILE > $OUT
> + ../e2fsck/e2fsck -fy $TMPFILE >> $OUT
> + ../e2fsck/e2fsck -fy $TMPFILE >> $OUT
> + for i in a b c d e f g; do echo "stat /$i"; done | $DEBUGFS_EXE $TMPFILE >> $OUT
> +
> + cmp -s $OUT $EXP
> + status=$?
> +
> + if [ "$status" = 0 ]; then
> + echo "$test_name: $test_description: ok"
> + touch $test_name.ok
> + else
> + echo "$test_name: $test_description: failed"
> + diff $DIFF_OPTS $EXP $OUT > $test_name.failed
> + rm -f $test_name.tmp
> + fi
> +else
> + echo "$test_name: skipped"
> +fi
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
> the body of a message to majordomo@...r.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists