[Ocfs2-tools-devel] [PATCH v2] o2image: back-up xattr tree for regular file

piaojun piaojun at huawei.com
Mon Jun 5 17:50:14 PDT 2017



On 2017/6/5 11:57, Joseph Qi wrote:
> 
> 
> On 17/6/2 19:38, piaojun wrote:
>> when traversing regular file's inode with 'OCFS2_HAS_XATTR_FL' but no
>> xattr btree in traverse_inode(), we will get into traverse_extents()
>> rather than traverse_xb(). so xattr btree is not back-up actually.
>> we need distinguish this situation, and back-up xattr btree.
> Still confused.
> Since no xattr tree, why should we back-up it?
> And why moving up will run into traverse_xb? The condition doesn't
> change.
> 
> Thanks,
> Joseph
> 
There are two conditions we need handle:
1. inode with 'OCFS2_HAS_XATTR_FL' but no xattr btree
we should back-up the inode, and no need go into traverse_xb().

2. inode has xattr btree
we need go into traverse_xb() to back-up its xattr btree.

move up the judge condition will distinguish the situation that regular
file with 'OCFS2_HAS_XATTR_FL' but no btree.

Thanks,
Jun

>>
>> Signed-off-by: Jun Piao <piaojun at huawei.com>
>> ---
>>  o2image/o2image.c | 18 ++++++++++--------
>>  1 file changed, 10 insertions(+), 8 deletions(-)
>>
>> diff --git a/o2image/o2image.c b/o2image/o2image.c
>> index ee62acf..c56bbcf 100644
>> --- a/o2image/o2image.c
>> +++ b/o2image/o2image.c
>> @@ -256,9 +256,16 @@ static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>>  	 *
>>  	 * NOTE: we do need to handle its xattr btree if exists.
>>  	 */
>> -	if (!S_ISDIR(di->i_mode) && !(di->i_flags & OCFS2_SYSTEM_FL) &&
>> -	    !(di->i_dyn_features & OCFS2_HAS_XATTR_FL))
>> +	if (!S_ISDIR(di->i_mode) && !(di->i_flags & OCFS2_SYSTEM_FL)) {
>> +		if ((di->i_dyn_features & OCFS2_HAS_XATTR_FL) && di->i_xattr_loc) {
>> +			/* traverse xattr btree to map bucket leaves */
>> +			ret = traverse_xb(ofs, di->i_xattr_loc);
>> +			if (ret)
>> +				com_err(program_name, ret, "while traversing xattr tree"
>> +					" %"PRIu64"", inode);
>> +		}
>>  		goto out;
>> +	}
>>
>>  	/* Read and traverse group descriptors */
>>  	if (di->i_flags & OCFS2_SYSTEM_FL)
>> @@ -291,9 +298,6 @@ static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>>  		ret = traverse_chains(ofs, &(di->id2.i_chain), dump_type);
>>  	else if (di->i_flags & OCFS2_DEALLOC_FL)
>>  		ret = mark_dealloc_bits(ofs, &(di->id2.i_dealloc));
>> -	else if ((di->i_dyn_features & OCFS2_HAS_XATTR_FL) && di->i_xattr_loc)
>> -		/* Do need to traverse xattr btree to map bucket leaves */
>> -		ret = traverse_xb(ofs, di->i_xattr_loc);
>>  	else {
>>  		/*
>>  		 * Don't check superblock flag for the dir indexing
>> @@ -318,11 +322,9 @@ static errcode_t traverse_inode(ocfs2_filesys *ofs, uint64_t inode)
>>  	}
>>
>>  out_error:
>> -	if (ret) {
>> +	if (ret)
>>  		com_err(program_name, ret, "while scanning inode %"PRIu64"",
>>  			inode);
>> -		goto out;
>> -	}
>>  out:
>>  	if (buf)
>>  		ocfs2_free(&buf);
>>
> .
> 



More information about the Ocfs2-tools-devel mailing list