[Ocfs2-tools-devel] [PATCH 1/1] Ocfs2-tools: Ocfs2-tools: Let debugfs.ocfs2 correctly (r)dump the fast symlink v2.

Sunil Mushran sunil.mushran at oracle.com
Wed Jun 3 10:38:17 PDT 2009


Yes, Tao's suggestion was correct. But the code can be further
optimized. See inlined comments.

Tristan Ye wrote:
> Currently dump and rdump command in debugfs.ocfs2 didn't handle the
> fast symlink correctly but a error encountered.
>
> With tao's suggestion, we directly dump the fast-symlink's destination from inode
> to let (r)dump command in debugs.ocfs2 correctly handle fast symlink.
>
> Signed-off-by: Tristan Ye <tristan.ye at oracle.com>
> ---
>  debugfs.ocfs2/utils.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
>  1 files changed, 45 insertions(+), 0 deletions(-)
>
> diff --git a/debugfs.ocfs2/utils.c b/debugfs.ocfs2/utils.c
> index b1494fa..b1544d9 100644
> --- a/debugfs.ocfs2/utils.c
> +++ b/debugfs.ocfs2/utils.c
> @@ -440,6 +440,25 @@ errcode_t dump_file(ocfs2_filesys *fs, uint64_t ino, int fd, char *out_file,
>  		goto bail;
>  	}
>  
> +	/* Dump the destination directly from inode if fast-symlinked*/
> +	if (S_ISLNK(ci->ci_inode->i_mode) && !ci->ci_inode->i_clusters) {
> +
> +		buf = strdup((char *)ci->ci_inode->id2.i_symlink);
> +
> +		wrote = write(fd, buf, strlen(buf));
> +
> +		if (wrote != strlen(buf)) {
> +			com_err(gbls.cmd, errno, "while writing file");
> +			ret = errno;
> +			goto bail;
> +		}
> +
> +		if (preserve)
> +			ret = fix_perms(ci->ci_inode, &fd, out_file);
> +		
> +		goto bail;
> +	}
> +
>  	buflen = 1024 * 1024;
>  
>  	ret = ocfs2_malloc_blocks(fs->fs_io,
> @@ -631,6 +650,30 @@ static errcode_t rdump_symlink(ocfs2_filesys *fs, uint64_t blkno, char *name)
>  	uint32_t len = 0;
>  	errcode_t ret;
>  
> +	char *ino_buf = NULL;
> +	struct ocfs2_dinode *inode;
> +
> +	ret = ocfs2_malloc_block(fs->fs_io, &ino_buf);
> +	if (ret) {
> +		com_err(gbls.cmd, ret, "while allocating a block");
> +		goto bail;
> +	}
> +
> +	/* Get symlink's destination directly if fast-symlinked*/
> +	ret = ocfs2_read_inode(fs, blkno, ino_buf);
> +	if (ret) {
> +		com_err(gbls.cmd, ret, "while reading inode %"PRIu64"", blkno);
> +		goto bail;
> +	}
> +
> +	inode = (struct ocfs2_dinode *)ino_buf;
> +
> +	if (S_ISLNK(inode->i_mode) && !inode->i_clusters) {
> +		if (symlink((char *)inode->id2.i_symlink, name) == -1)
> +			ret = errno;
> +		goto bail;
> +	}
> +
>   

How about we add struct ocfs2_dinode *di to the args. We won't
have to read the inode twice. The code flow could go as:

char *link;

if (!di->i_clusters)
  link = (char *)di->id2.i_symlink;
else {
  read_whole_file();
  link = buf;
}

symlink(link, name);

In dump_file(), just call rdump_symlink()... that is after 
read_cached_inode().
The current code does not look right. Hint: Use ci_inode.

>  	ret = read_whole_file(fs, blkno, &buf, &len);
>  	if (ret)
>  		goto bail;
> @@ -641,6 +684,8 @@ static errcode_t rdump_symlink(ocfs2_filesys *fs, uint64_t blkno, char *name)
>  bail:
>  	if (buf)
>  		ocfs2_free(&buf);
> +	if (ino_buf)
> +		ocfs2_free(&ino_buf);
>  
>  	return ret;
>  }
>   




More information about the Ocfs2-tools-devel mailing list