[Ocfs2-devel] [PATCH 2/3] ocfs2: throttle back local alloc when low on disk space

Joel Becker Joel.Becker at oracle.com
Thu Jul 31 14:11:32 PDT 2008


On Thu, Jul 31, 2008 at 01:42:01PM -0700, Mark Fasheh wrote:
> @@ -476,16 +515,18 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
>  
>  	mutex_lock(&local_alloc_inode->i_mutex);
>  
> -	if (osb->local_alloc_state != OCFS2_LA_ENABLED) {
> -		status = -ENOSPC;
> -		goto bail;
> -	}
> -
> -	if (bits_wanted > osb->local_alloc_bits) {
> -		mlog(0, "Asking for more than my max window size!\n");
> +	/*
> +	 * We must double check state and allocator bits because
> +	 * another process may have changed them while holding i_mutex.
> +	 */
> +	spin_lock(&osb->osb_lock);
> +	if (!ocfs2_la_state_enabled(osb) ||
> +	    (bits_wanted > osb->local_alloc_bits)) {
> +		spin_unlock(&osb->osb_lock);
>  		status = -ENOSPC;
>  		goto bail;
>  	}
> +	spin_unlock(&osb->osb_lock);
>  
>  	alloc = (struct ocfs2_dinode *) osb->local_alloc_bh->b_data;
>  
> @@ -513,6 +554,21 @@ int ocfs2_reserve_local_alloc_bits(struct ocfs2_super *osb,
>  				mlog_errno(status);
>  			goto bail;
>  		}
> +
> +		/*
> +		 * Under certain conditions, the window slide code
> +		 * might have reduced the number of bits available or
> +		 * disabled the the local alloc entirely. Re-check
> +		 * here and return -ENOSPC if necessary.
> +		 */
> +		status = -ENOSPC;
> +		if (!ocfs2_la_state_enabled(osb))
> +			goto bail;
> +

	Up above you take osb_lock, here you don't.  Now, if I read your
later comment correctly, you don't need osb_lock in either place,
because the read is safe under the mutex.

Joel

-- 

"Get right to the heart of matters.
 It's the heart that matters more."

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