| From 15ce741fff667bcb5e8be47707e626cac2d83a52 Mon Sep 17 00:00:00 2001 |
| From: Ingo Molnar <mingo@elte.hu> |
| Date: Fri, 3 Jul 2009 08:29:55 -0500 |
| Subject: [PATCH] fs: replace bh_uptodate_lock for -rt |
| |
| commit da29da1490f45febf0e6a3d9a4cc608fa504a04f in tip. |
| |
| Signed-off-by: Ingo Molnar <mingo@elte.hu> |
| Signed-off-by: Thomas Gleixner <tglx@linutronix.de> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/fs/buffer.c b/fs/buffer.c |
| index bc3212e..26c00cc 100644 |
| --- a/fs/buffer.c |
| +++ b/fs/buffer.c |
| @@ -330,8 +330,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| * decide that the page is now completely done. |
| */ |
| first = page_buffers(page); |
| - local_irq_save(flags); |
| - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); |
| + spin_lock_irqsave(&first->b_uptodate_lock, flags); |
| clear_buffer_async_read(bh); |
| unlock_buffer(bh); |
| tmp = bh; |
| @@ -344,8 +343,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| } |
| tmp = tmp->b_this_page; |
| } while (tmp != bh); |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| |
| /* |
| * If none of the buffers had errors and they are all |
| @@ -357,8 +355,7 @@ static void end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| return; |
| |
| still_busy: |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| return; |
| } |
| |
| @@ -393,8 +390,7 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate) |
| } |
| |
| first = page_buffers(page); |
| - local_irq_save(flags); |
| - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); |
| + spin_lock_irqsave(&first->b_uptodate_lock, flags); |
| |
| clear_buffer_async_write(bh); |
| unlock_buffer(bh); |
| @@ -406,14 +402,12 @@ void end_buffer_async_write(struct buffer_head *bh, int uptodate) |
| } |
| tmp = tmp->b_this_page; |
| } |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| end_page_writeback(page); |
| return; |
| |
| still_busy: |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| return; |
| } |
| EXPORT_SYMBOL(end_buffer_async_write); |
| @@ -3268,6 +3262,7 @@ struct buffer_head *alloc_buffer_head(gfp_t gfp_flags) |
| struct buffer_head *ret = kmem_cache_zalloc(bh_cachep, gfp_flags); |
| if (ret) { |
| INIT_LIST_HEAD(&ret->b_assoc_buffers); |
| + spin_lock_init(&ret->b_uptodate_lock); |
| get_cpu_var(bh_accounting).nr++; |
| recalc_bh_state(); |
| put_cpu_var(bh_accounting); |
| @@ -3279,6 +3274,7 @@ EXPORT_SYMBOL(alloc_buffer_head); |
| void free_buffer_head(struct buffer_head *bh) |
| { |
| BUG_ON(!list_empty(&bh->b_assoc_buffers)); |
| + BUG_ON(spin_is_locked(&bh->b_uptodate_lock)); |
| kmem_cache_free(bh_cachep, bh); |
| get_cpu_var(bh_accounting).nr--; |
| recalc_bh_state(); |
| diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c |
| index cfce53c..8d7118e 100644 |
| --- a/fs/ntfs/aops.c |
| +++ b/fs/ntfs/aops.c |
| @@ -107,8 +107,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| "0x%llx.", (unsigned long long)bh->b_blocknr); |
| } |
| first = page_buffers(page); |
| - local_irq_save(flags); |
| - bit_spin_lock(BH_Uptodate_Lock, &first->b_state); |
| + spin_lock_irqsave(&first->b_uptodate_lock, flags); |
| clear_buffer_async_read(bh); |
| unlock_buffer(bh); |
| tmp = bh; |
| @@ -123,8 +122,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| } |
| tmp = tmp->b_this_page; |
| } while (tmp != bh); |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| /* |
| * If none of the buffers had errors then we can set the page uptodate, |
| * but we first have to perform the post read mst fixups, if the |
| @@ -159,8 +157,7 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate) |
| unlock_page(page); |
| return; |
| still_busy: |
| - bit_spin_unlock(BH_Uptodate_Lock, &first->b_state); |
| - local_irq_restore(flags); |
| + spin_unlock_irqrestore(&first->b_uptodate_lock, flags); |
| return; |
| } |
| |
| diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h |
| index 16ed028..cc6a758 100644 |
| --- a/include/linux/buffer_head.h |
| +++ b/include/linux/buffer_head.h |
| @@ -21,10 +21,6 @@ enum bh_state_bits { |
| BH_Dirty, /* Is dirty */ |
| BH_Lock, /* Is locked */ |
| BH_Req, /* Has been submitted for I/O */ |
| - BH_Uptodate_Lock,/* Used by the first bh in a page, to serialise |
| - * IO completion of other buffers in the page |
| - */ |
| - |
| BH_Mapped, /* Has a disk mapping */ |
| BH_New, /* Disk mapping was newly created by get_block */ |
| BH_Async_Read, /* Is under end_buffer_async_read I/O */ |
| @@ -74,6 +70,7 @@ struct buffer_head { |
| struct address_space *b_assoc_map; /* mapping this buffer is |
| associated with */ |
| atomic_t b_count; /* users using this buffer_head */ |
| + spinlock_t b_uptodate_lock; |
| }; |
| |
| /* |
| -- |
| 1.7.1.1 |
| |