[Ocfs2-tools-devel] [PATCH 2/3] Ocfs2-tools: Implement new prompt codes of sparse file for fswreck.
tristan.ye
tristan.ye at oracle.com
Thu Jul 2 18:28:21 PDT 2009
On Thu, 2009-07-02 at 15:12 -0700, Joel Becker wrote:
> On Thu, Jul 02, 2009 at 02:52:38PM +0800, Tristan Ye wrote:
> > Adding new corruptions of sparse file for fswreck after fsck.ocfs2
> > supported new separated prompt codes.
>
> <snip>
>
> > diff --git a/fswreck/inode.c b/fswreck/inode.c
> > index a66ff3f..425222c 100644
> > --- a/fswreck/inode.c
> > +++ b/fswreck/inode.c
> > @@ -47,6 +47,18 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
> > errcode_t ret;
> > char *buf = NULL;
> > struct ocfs2_dinode *di;
> > + struct ocfs2_dinode *sb_di;
> > + char *sb_blk;
> > +
> > + if ((type == INODE_SPARSE_SIZE) || (type == INODE_SPARSE_CLUSTERS)) {
> > +
> > + sb_blk = (char *)fs->fs_super;
> > + sb_di = (struct ocfs2_dinode *)sb_blk;
> > + if (!(sb_di->id2.i_super.s_feature_incompat &
> > + OCFS2_FEATURE_INCOMPAT_SPARSE_ALLOC))
>
> Just use:
>
> if (!ocfs2_sparse_alloc(OCFS2_RAW_SB(fs->fs_super))
>
> > @@ -103,12 +115,25 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
> > blkno, di->i_size, (di->i_size + 100));
> > di->i_size += 100;
> > break;
> > + case INODE_SPARSE_SIZE:
> > + fprintf(stdout, "INODE_SPARSE_SIZE: "
> > + "Corrupt inode#%"PRIu64", change i_size"
> > + " from %"PRIu64" to %"PRIu64"\n",
> > + blkno, di->i_size, (di->i_size + 100));
> > + di->i_size += fs->fs_clustersize;
> > + break;
>
> This isn't a corruption. A sparse file can have i_size way past
> the last actual allocation. The INODE_SPARSE_SIZE check sees if there
> is an actual cluster *past* i_size. So this corruption should extend
> the file with a real cluster, then shrink i_size down below that
> cluster.
> I'd say create the sparse file in mess_up_inode_field like this:
>
> > @@ -130,14 +155,13 @@ static void damage_inode(ocfs2_filesys *fs, uint64_t blkno,
> >
> > void mess_up_inode_field(ocfs2_filesys *fs, enum fsck_type type, uint64_t blkno)
> > {
> > - int i;
> > errcode_t ret;
> > uint64_t tmpblkno;
> > uint32_t clusters = 10;
> >
> > create_file(fs, blkno, &tmpblkno);
> >
>
> Right here, if INODE_SPARSE_SIZE, call a function that verifies
> ocfs2_sparse_alloc(), then reads the inode, changes i_size to equal two
> clusters, then writes the inode out. Now you have a file with i_size of
> 2 * fs_clustersize and i_clusters of 0. That's a perfectly valid sparse
> file.
>
> > - if (type == INODE_CLUSTERS) {
> > + if ((type == INODE_CLUSTERS) || (type == INODE_SPARSE_CLUSTERS)) {
> > ret = ocfs2_extend_allocation(fs, tmpblkno, clusters);
> > if (ret)
> > FSWRK_COM_FATAL(progname, ret);
>
> Here you add INODE_SPARSE_SIZE to the list of types that extend
> the allocation. So when this is done, your sparse file has an i_size of
> 12 * fs_clustersize and i_clusters of 10.
> Then, in damage_inode, the INODE_SPARSE_SIZE code sets i_size to
> fs_clustersize. Right in the middle of the hole. When fsck runs, it
> should notice that the extent tree reaches out to 12 * fs_clustersize
> and ask to set i_size to 12 * fs_clustersize.
Thank you joel, you suggestion was exactly the same as tao's :-), my new
patch was doing the right way as you said.
Tristan
>
> Joel
>
More information about the Ocfs2-tools-devel
mailing list