lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ