[Ocfs2-devel] [PATCH 02/15] ocfs2: Add clusters free in dealloc_ctxt.

Joel Becker Joel.Becker at oracle.com
Mon Nov 3 19:01:57 PST 2008


On Tue, Nov 04, 2008 at 09:34:40AM +0800, Tao Ma wrote:
> Joel Becker wrote:
>>> +{
>>> +	struct ocfs2_cached_block_free *tmp;
>>> +	struct inode *tl_inode = osb->osb_tl_inode;
>>> +	handle_t *handle;
>>> +	int ret = 0;
>>> +
>>> +	mutex_lock(&tl_inode->i_mutex);
>>> +
>>> +	handle = ocfs2_start_trans(osb, OCFS2_TRUNCATE_LOG_UPDATE);
>>> +	if (IS_ERR(handle)) {
>>> +		ret = PTR_ERR(handle);
>>> +		mlog_errno(ret);
>>> +		goto out_mutex;
>>> +	}
>>> +
>>> +	while (head) {
>>> +		ret = ocfs2_truncate_log_append(osb, handle, head->free_blk,
>>> +						head->free_bit);
>>> +		if (ret) {
>>> +			mlog_errno(ret);
>>> +			break;
>>> +		}
>>
>> 	What happens if the truncate log fills up?
> currently, it is only used in one xattr set. So the total size is only  
> 64K bytes and I don't think the chance is very high. I have also gone  
> through ocfs2_commit_truncate, no error handler there, and even if it is  
> filled up and error out, fsck should be able to find them. But you are  
> probably right, if in future we use it in truncating file, it may be a  
> very high risk. But it could be in another separate patch, agree?

	ocfs2_commit_truncate() is a loop from start: to bail:.  It
calls ocfs2_do_truncate() for each extent it removes.  Before each call
to ocfs2_do_truncate(), it checks ocfs2_truncate_log_needs_flush().
That is, it never adds more than one record to the truncate log at a
time, and it checks for a full log before adding each record.
	Your 64K can be 16 clusters at a 4K cluster size.  That's 16
records.  What if the truncate log had only space for three records from
a previous operation?  Your fourth call to ocfs2_truncate_log_append()
will mlog_bug_on_msg() like so:

5319         mlog_bug_on_msg(tl_count > ocfs2_truncate_recs_per_inode(osb->sb) ||

	That is not acceptable.  We don't introduce known bugs and say
they are OK if they are rare.

Joel

-- 

"Sometimes one pays most for the things one gets for nothing."
        - Albert Einstein

Joel Becker
Principal Software Developer
Oracle
E-mail: joel.becker at oracle.com
Phone: (650) 506-8127



More information about the Ocfs2-devel mailing list