[Ocfs2-devel] [PATCH] ocfs2: fix a refcount condition checking

Tao Ma tao.ma at oracle.com
Mon Feb 8 17:15:42 PST 2010



Joel Becker wrote:
> On Thu, Feb 04, 2010 at 04:20:18PM -0500, Wengang Wang wrote:
>> index 06ccf6a..77ebb6e 100644
>> --- a/fs/ocfs2/file.c
>> +++ b/fs/ocfs2/file.c
>> @@ -1775,7 +1775,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
>>  					 int *direct_io,
>>  					 int *has_refcount)
>>  {
>> -	int ret = 0, meta_level = 0;
>> +	int ret = 0, meta_level = 0, refcount = 0;
>>  	struct inode *inode = dentry->d_inode;
>>  	loff_t saved_pos, end;
>>  
>> @@ -1834,6 +1834,7 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
>>  							       saved_pos,
>>  							       count,
>>  							       &meta_level);
>> +			refcount = 1;
>>  			if (has_refcount)
>>  				*has_refcount = 1;
>>  		}
> 
> 	Tao is right that this is redundant - we're setting two refcount
> bits, which is pointless.
> 	Here's the thing: we know that refcounted extents mean no direct
> io.  Instead of adding your 'refcount' bit or Tao's comment, why not
> just clear direct_io right here?
> 
> @@ -1834,6 +1834,8 @@ static int ocfs2_prepare_inode_for_write(struct dentry *dentry,
>  							       saved_pos,
>  							       count,
>  							       &meta_level);
>  			if (has_refcount)
>  				*has_refcount = 1;
> +			if (direct_io)
> +				*direct_io = 0;
>  		}
> 
> It's safe to clear if it exists - whether it was zero before, it must be
> zero now.
yeah, this is better.
btw, we also need to remove the latter lines.

-	if (has_refcount && *has_refcount == 1) {
-		*direct_io = 0;
-		break;
-}

Regards,
Tao



More information about the Ocfs2-devel mailing list