[Ocfs2-tools-devel] [PATCH 06/10] Dir operation modification for inline data.

Tao Ma tao.ma at oracle.com
Fri Jul 11 21:27:50 PDT 2008



Joel Becker wrote:
> On Sat, Jul 12, 2008 at 10:13:07AM +0800, Tao Ma wrote:
>> Joel Becker wrote:
>>> On Fri, Jul 11, 2008 at 02:20:59PM +0800, Tao Ma wrote:
>>>> +	ocfs2_dinode_new_extent_list(fs, di);
>>>> +
>>>> +	di->i_size = 0;
>>>> +	di->i_ctime = di->i_mtime = time(NULL);
>>>> +
>>>> +	ret = ocfs2_write_inode(fs, dir, di_buf);
>>> 	This is a little weird, writing out a zero size, even
>>> temporarily.  If we crash, we lose the dir entries, right?
>> yes, you see ocfs2_insert_extent below needs us to send the blkno and  
>> read the inode info by itself, so I have to write it out here. by now, I  
>> haven't find a perfect way to handle this(no journal in user space is  
>> really painful).
> 
> 	I know why you did it, I just don't like the consequences.
> ocfs2_insert_extent() can't handle an i_size that isn't 0?
no, ocfs2_insert_extent need the initialized extent list. So I 
initialized it and write it out(actually it doesn't care i_size).
> 
>>>> @@ -128,15 +129,24 @@ errcode_t ocfs2_link(ocfs2_filesys *fs, uint64_t dir, const char *name,
>>>>  	ls.flags = flags;
>>>>  	ls.done = 0;
>>>>  	ls.sb = fs->fs_super;
>>>> -
>>>> +again:
>>>>  	retval = ocfs2_dir_iterate(fs, dir,
>>>>                                     OCFS2_DIRENT_FLAG_INCLUDE_EMPTY,
>>>>                                     NULL, link_proc, &ls);
>>>>  	if (retval)
>>>>  		return retval;
>>>>  -	if (!ls.done)
>>>> -		return OCFS2_ET_DIR_NO_SPACE;
>>>> +	if (!ls.done) {
>>>> +		if (allocation)
>>>> +			return OCFS2_ET_INTERNAL_FAILURE;
>>>> +
>>>> +		retval = ocfs2_expand_dir(fs, dir);
>>>> +		if (retval)
>>>> +			return retval;
>>>> +
>>>> +		allocation = 1;
>>>> +		goto again;
>>>> +	}
>>> 	Can we make this a loop instead of a goto?  It's not complex.
>> en, not agree, if we use loop, use "for" or "while"?
>> if with "for", then use "for(i=0;i<2;i++)" isn't looks as clear as this  
>> one. the same goes with "whle(i<2)".
> 
> 	Sure, but you don't even need to loop - you can just code it
> like we used to in other functions.  Saving 3 whole lines of code isn't
> worth gotos.  Here's a few ways to do it:
> 
> [Loop]
> 	do {
>  		retval = ocfs2_dir_iterate(fs, dir,
> 					   OCFS2_DIRENT_FLAG_INCLUDE_EMPTY,
> 					   NULL, link_proc, &ls);
> 		if (retval)
> 			return retval;
> 		if (ls.done)
> 			break;
> 		if (allocation)
> 			return OCFS2_ET_INTERNAL_FAILURE;
> 
> 		retval = ocfs2_expand_dir(fs, dir);
> 		if (retval)
> 			return retval;
> 
> 		allocation = 1;
> 	} while (1);
> 
> [No loop at all]
>  	retval = ocfs2_dir_iterate(fs, dir,
>                                    OCFS2_DIRENT_FLAG_INCLUDE_EMPTY,
>                                    NULL, link_proc, &ls);
> 	if (retval)
> 		return retval;
> 	if (!ls.done) {
> 		retval = ocfs2_expand_dir(fs, dir);
> 		if (retval)
> 			return retval;
> 
> 		retval = ocfs2_dir_iterate(fs, dir,
> 					   OCFS2_DIRENT_FLAG_INCLUDE_EMPTY,
> 					   NULL, link_proc, &ls);
> 		if (retval)
> 			return retval;
> 		if (!ls.done)
> 			return OCFS2_ET_INTERNAL_FAILURE;
> 	}
Yeah, I like the 2nd one. It is a little like what we used to call 
ocfs2_link/ocfs2_expand_dir, hehe. Thanks.

Regards,
Tao



More information about the Ocfs2-tools-devel mailing list