81 lines
3.0 KiB
Diff
81 lines
3.0 KiB
Diff
From 77773385270db9f6f06ea16fd3183795e94068d5 Mon Sep 17 00:00:00 2001
|
|
From: Mike Galbraith <efault@gmx.de>
|
|
Date: Fri, 3 Jul 2009 08:44:12 -0500
|
|
Subject: [PATCH 201/365] fs: ntfs: disable interrupt only on !RT
|
|
|
|
On Sat, 2007-10-27 at 11:44 +0200, Ingo Molnar wrote:
|
|
> * Nick Piggin <nickpiggin@yahoo.com.au> wrote:
|
|
>
|
|
> > > [10138.175796] [<c0105de3>] show_trace+0x12/0x14
|
|
> > > [10138.180291] [<c0105dfb>] dump_stack+0x16/0x18
|
|
> > > [10138.184769] [<c011609f>] native_smp_call_function_mask+0x138/0x13d
|
|
> > > [10138.191117] [<c0117606>] smp_call_function+0x1e/0x24
|
|
> > > [10138.196210] [<c012f85c>] on_each_cpu+0x25/0x50
|
|
> > > [10138.200807] [<c0115c74>] flush_tlb_all+0x1e/0x20
|
|
> > > [10138.205553] [<c016caaf>] kmap_high+0x1b6/0x417
|
|
> > > [10138.210118] [<c011ec88>] kmap+0x4d/0x4f
|
|
> > > [10138.214102] [<c026a9d8>] ntfs_end_buffer_async_read+0x228/0x2f9
|
|
> > > [10138.220163] [<c01a0e9e>] end_bio_bh_io_sync+0x26/0x3f
|
|
> > > [10138.225352] [<c01a2b09>] bio_endio+0x42/0x6d
|
|
> > > [10138.229769] [<c02c2a08>] __end_that_request_first+0x115/0x4ac
|
|
> > > [10138.235682] [<c02c2da7>] end_that_request_chunk+0x8/0xa
|
|
> > > [10138.241052] [<c0365943>] ide_end_request+0x55/0x10a
|
|
> > > [10138.246058] [<c036dae3>] ide_dma_intr+0x6f/0xac
|
|
> > > [10138.250727] [<c0366d83>] ide_intr+0x93/0x1e0
|
|
> > > [10138.255125] [<c015afb4>] handle_IRQ_event+0x5c/0xc9
|
|
> >
|
|
> > Looks like ntfs is kmap()ing from interrupt context. Should be using
|
|
> > kmap_atomic instead, I think.
|
|
>
|
|
> it's not atomic interrupt context but irq thread context - and -rt
|
|
> remaps kmap_atomic() to kmap() internally.
|
|
|
|
Hm. Looking at the change to mm/bounce.c, perhaps I should do this
|
|
instead?
|
|
|
|
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
fs/ntfs/aops.c | 8 ++++----
|
|
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/fs/ntfs/aops.c b/fs/ntfs/aops.c
|
|
index 8bb79f5fda59..e89da4fb14c2 100644
|
|
--- a/fs/ntfs/aops.c
|
|
+++ b/fs/ntfs/aops.c
|
|
@@ -92,13 +92,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
|
ofs = 0;
|
|
if (file_ofs < init_size)
|
|
ofs = init_size - file_ofs;
|
|
- local_irq_save(flags);
|
|
+ local_irq_save_nort(flags);
|
|
kaddr = kmap_atomic(page);
|
|
memset(kaddr + bh_offset(bh) + ofs, 0,
|
|
bh->b_size - ofs);
|
|
flush_dcache_page(page);
|
|
kunmap_atomic(kaddr);
|
|
- local_irq_restore(flags);
|
|
+ local_irq_restore_nort(flags);
|
|
}
|
|
} else {
|
|
clear_buffer_uptodate(bh);
|
|
@@ -143,13 +143,13 @@ static void ntfs_end_buffer_async_read(struct buffer_head *bh, int uptodate)
|
|
recs = PAGE_SIZE / rec_size;
|
|
/* Should have been verified before we got here... */
|
|
BUG_ON(!recs);
|
|
- local_irq_save(flags);
|
|
+ local_irq_save_nort(flags);
|
|
kaddr = kmap_atomic(page);
|
|
for (i = 0; i < recs; i++)
|
|
post_read_mst_fixup((NTFS_RECORD*)(kaddr +
|
|
i * rec_size), rec_size);
|
|
kunmap_atomic(kaddr);
|
|
- local_irq_restore(flags);
|
|
+ local_irq_restore_nort(flags);
|
|
flush_dcache_page(page);
|
|
if (likely(page_uptodate && !PageError(page)))
|
|
SetPageUptodate(page);
|
|
--
|
|
2.28.0
|
|
|