diff options
author | Jens Axboe <jens.axboe@oracle.com> | 2007-10-19 09:23:07 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-09-25 11:03:57 -0400 |
commit | bbf0d0062da2b3e1e239e381f8ac20971ef1b2ed (patch) | |
tree | 6102eca045793cf1384d39d2fb2061f4dd3d23d8 /fs | |
parent | 0a2118dfd4c328e8823cdcfebf839dff73ac21e9 (diff) |
Btrfs: KM_IRQ0 usage in end_io handling
endio handling is typically called with interrupts disabled, but can
also be called with it enabled. So save interrupts before using KM_IRQ0
to be completely safe.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/inode.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 0e1ca423e22d..02d802cdd59b 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -168,8 +168,10 @@ int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end) | |||
168 | int ret; | 168 | int ret; |
169 | struct btrfs_root *root = BTRFS_I(inode)->root; | 169 | struct btrfs_root *root = BTRFS_I(inode)->root; |
170 | u32 csum = ~(u32)0; | 170 | u32 csum = ~(u32)0; |
171 | unsigned long flags; | ||
171 | 172 | ||
172 | ret = get_state_private(em_tree, start, &private); | 173 | ret = get_state_private(em_tree, start, &private); |
174 | local_irq_save(flags); | ||
173 | kaddr = kmap_atomic(page, KM_IRQ0); | 175 | kaddr = kmap_atomic(page, KM_IRQ0); |
174 | if (ret) { | 176 | if (ret) { |
175 | goto zeroit; | 177 | goto zeroit; |
@@ -180,6 +182,7 @@ int btrfs_readpage_end_io_hook(struct page *page, u64 start, u64 end) | |||
180 | goto zeroit; | 182 | goto zeroit; |
181 | } | 183 | } |
182 | kunmap_atomic(kaddr, KM_IRQ0); | 184 | kunmap_atomic(kaddr, KM_IRQ0); |
185 | local_irq_restore(flags); | ||
183 | return 0; | 186 | return 0; |
184 | 187 | ||
185 | zeroit: | 188 | zeroit: |
@@ -188,6 +191,7 @@ zeroit: | |||
188 | memset(kaddr + offset, 1, end - start + 1); | 191 | memset(kaddr + offset, 1, end - start + 1); |
189 | flush_dcache_page(page); | 192 | flush_dcache_page(page); |
190 | kunmap_atomic(kaddr, KM_IRQ0); | 193 | kunmap_atomic(kaddr, KM_IRQ0); |
194 | local_irq_restore(flags); | ||
191 | return 0; | 195 | return 0; |
192 | } | 196 | } |
193 | 197 | ||