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: [EMAIL PROTECTED]
Phone: (650) 506-8127

_______________________________________________
Ocfs2-devel mailing list
[email protected]
http://oss.oracle.com/mailman/listinfo/ocfs2-devel

Reply via email to