diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/kmem.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_acl.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 14 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_buf.c | 83 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_ioctl32.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_iops.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 1 |
8 files changed, 22 insertions, 81 deletions
diff --git a/fs/xfs/linux-2.6/kmem.c b/fs/xfs/linux-2.6/kmem.c index bc7405585de..666c9db48eb 100644 --- a/fs/xfs/linux-2.6/kmem.c +++ b/fs/xfs/linux-2.6/kmem.c | |||
@@ -17,6 +17,7 @@ | |||
17 | */ | 17 | */ |
18 | #include <linux/mm.h> | 18 | #include <linux/mm.h> |
19 | #include <linux/highmem.h> | 19 | #include <linux/highmem.h> |
20 | #include <linux/slab.h> | ||
20 | #include <linux/swap.h> | 21 | #include <linux/swap.h> |
21 | #include <linux/blkdev.h> | 22 | #include <linux/blkdev.h> |
22 | #include <linux/backing-dev.h> | 23 | #include <linux/backing-dev.h> |
diff --git a/fs/xfs/linux-2.6/xfs_acl.c b/fs/xfs/linux-2.6/xfs_acl.c index bf85bbe4a9a..a7bc925c4d6 100644 --- a/fs/xfs/linux-2.6/xfs_acl.c +++ b/fs/xfs/linux-2.6/xfs_acl.c | |||
@@ -22,6 +22,7 @@ | |||
22 | #include "xfs_inode.h" | 22 | #include "xfs_inode.h" |
23 | #include "xfs_vnodeops.h" | 23 | #include "xfs_vnodeops.h" |
24 | #include "xfs_trace.h" | 24 | #include "xfs_trace.h" |
25 | #include <linux/slab.h> | ||
25 | #include <linux/xattr.h> | 26 | #include <linux/xattr.h> |
26 | #include <linux/posix_acl_xattr.h> | 27 | #include <linux/posix_acl_xattr.h> |
27 | 28 | ||
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index 9083357f9e4..0f8b9968a80 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include "xfs_vnodeops.h" | 40 | #include "xfs_vnodeops.h" |
41 | #include "xfs_trace.h" | 41 | #include "xfs_trace.h" |
42 | #include "xfs_bmap.h" | 42 | #include "xfs_bmap.h" |
43 | #include <linux/gfp.h> | ||
43 | #include <linux/mpage.h> | 44 | #include <linux/mpage.h> |
44 | #include <linux/pagevec.h> | 45 | #include <linux/pagevec.h> |
45 | #include <linux/writeback.h> | 46 | #include <linux/writeback.h> |
@@ -932,6 +933,9 @@ xfs_aops_discard_page( | |||
932 | if (!xfs_is_delayed_page(page, IOMAP_DELAY)) | 933 | if (!xfs_is_delayed_page(page, IOMAP_DELAY)) |
933 | goto out_invalidate; | 934 | goto out_invalidate; |
934 | 935 | ||
936 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | ||
937 | goto out_invalidate; | ||
938 | |||
935 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, | 939 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, |
936 | "page discard on page %p, inode 0x%llx, offset %llu.", | 940 | "page discard on page %p, inode 0x%llx, offset %llu.", |
937 | page, ip->i_ino, offset); | 941 | page, ip->i_ino, offset); |
@@ -964,8 +968,10 @@ xfs_aops_discard_page( | |||
964 | 968 | ||
965 | if (error) { | 969 | if (error) { |
966 | /* something screwed, just bail */ | 970 | /* something screwed, just bail */ |
967 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, | 971 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { |
968 | "page discard failed delalloc mapping lookup."); | 972 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, |
973 | "page discard failed delalloc mapping lookup."); | ||
974 | } | ||
969 | break; | 975 | break; |
970 | } | 976 | } |
971 | if (!nimaps) { | 977 | if (!nimaps) { |
@@ -991,8 +997,10 @@ xfs_aops_discard_page( | |||
991 | ASSERT(!flist.xbf_count && !flist.xbf_first); | 997 | ASSERT(!flist.xbf_count && !flist.xbf_first); |
992 | if (error) { | 998 | if (error) { |
993 | /* something screwed, just bail */ | 999 | /* something screwed, just bail */ |
994 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, | 1000 | if (!XFS_FORCED_SHUTDOWN(ip->i_mount)) { |
1001 | xfs_fs_cmn_err(CE_ALERT, ip->i_mount, | ||
995 | "page discard unable to remove delalloc mapping."); | 1002 | "page discard unable to remove delalloc mapping."); |
1003 | } | ||
996 | break; | 1004 | break; |
997 | } | 1005 | } |
998 | next_buffer: | 1006 | next_buffer: |
diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c index 6f76ba85f19..44c2b0ef9a4 100644 --- a/fs/xfs/linux-2.6/xfs_buf.c +++ b/fs/xfs/linux-2.6/xfs_buf.c | |||
@@ -18,7 +18,7 @@ | |||
18 | #include "xfs.h" | 18 | #include "xfs.h" |
19 | #include <linux/stddef.h> | 19 | #include <linux/stddef.h> |
20 | #include <linux/errno.h> | 20 | #include <linux/errno.h> |
21 | #include <linux/slab.h> | 21 | #include <linux/gfp.h> |
22 | #include <linux/pagemap.h> | 22 | #include <linux/pagemap.h> |
23 | #include <linux/init.h> | 23 | #include <linux/init.h> |
24 | #include <linux/vmalloc.h> | 24 | #include <linux/vmalloc.h> |
@@ -168,75 +168,6 @@ test_page_region( | |||
168 | } | 168 | } |
169 | 169 | ||
170 | /* | 170 | /* |
171 | * Mapping of multi-page buffers into contiguous virtual space | ||
172 | */ | ||
173 | |||
174 | typedef struct a_list { | ||
175 | void *vm_addr; | ||
176 | struct a_list *next; | ||
177 | } a_list_t; | ||
178 | |||
179 | static a_list_t *as_free_head; | ||
180 | static int as_list_len; | ||
181 | static DEFINE_SPINLOCK(as_lock); | ||
182 | |||
183 | /* | ||
184 | * Try to batch vunmaps because they are costly. | ||
185 | */ | ||
186 | STATIC void | ||
187 | free_address( | ||
188 | void *addr) | ||
189 | { | ||
190 | a_list_t *aentry; | ||
191 | |||
192 | #ifdef CONFIG_XEN | ||
193 | /* | ||
194 | * Xen needs to be able to make sure it can get an exclusive | ||
195 | * RO mapping of pages it wants to turn into a pagetable. If | ||
196 | * a newly allocated page is also still being vmap()ed by xfs, | ||
197 | * it will cause pagetable construction to fail. This is a | ||
198 | * quick workaround to always eagerly unmap pages so that Xen | ||
199 | * is happy. | ||
200 | */ | ||
201 | vunmap(addr); | ||
202 | return; | ||
203 | #endif | ||
204 | |||
205 | aentry = kmalloc(sizeof(a_list_t), GFP_NOWAIT); | ||
206 | if (likely(aentry)) { | ||
207 | spin_lock(&as_lock); | ||
208 | aentry->next = as_free_head; | ||
209 | aentry->vm_addr = addr; | ||
210 | as_free_head = aentry; | ||
211 | as_list_len++; | ||
212 | spin_unlock(&as_lock); | ||
213 | } else { | ||
214 | vunmap(addr); | ||
215 | } | ||
216 | } | ||
217 | |||
218 | STATIC void | ||
219 | purge_addresses(void) | ||
220 | { | ||
221 | a_list_t *aentry, *old; | ||
222 | |||
223 | if (as_free_head == NULL) | ||
224 | return; | ||
225 | |||
226 | spin_lock(&as_lock); | ||
227 | aentry = as_free_head; | ||
228 | as_free_head = NULL; | ||
229 | as_list_len = 0; | ||
230 | spin_unlock(&as_lock); | ||
231 | |||
232 | while ((old = aentry) != NULL) { | ||
233 | vunmap(aentry->vm_addr); | ||
234 | aentry = aentry->next; | ||
235 | kfree(old); | ||
236 | } | ||
237 | } | ||
238 | |||
239 | /* | ||
240 | * Internal xfs_buf_t object manipulation | 171 | * Internal xfs_buf_t object manipulation |
241 | */ | 172 | */ |
242 | 173 | ||
@@ -337,7 +268,8 @@ xfs_buf_free( | |||
337 | uint i; | 268 | uint i; |
338 | 269 | ||
339 | if (xfs_buf_is_vmapped(bp)) | 270 | if (xfs_buf_is_vmapped(bp)) |
340 | free_address(bp->b_addr - bp->b_offset); | 271 | vm_unmap_ram(bp->b_addr - bp->b_offset, |
272 | bp->b_page_count); | ||
341 | 273 | ||
342 | for (i = 0; i < bp->b_page_count; i++) { | 274 | for (i = 0; i < bp->b_page_count; i++) { |
343 | struct page *page = bp->b_pages[i]; | 275 | struct page *page = bp->b_pages[i]; |
@@ -457,10 +389,8 @@ _xfs_buf_map_pages( | |||
457 | bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; | 389 | bp->b_addr = page_address(bp->b_pages[0]) + bp->b_offset; |
458 | bp->b_flags |= XBF_MAPPED; | 390 | bp->b_flags |= XBF_MAPPED; |
459 | } else if (flags & XBF_MAPPED) { | 391 | } else if (flags & XBF_MAPPED) { |
460 | if (as_list_len > 64) | 392 | bp->b_addr = vm_map_ram(bp->b_pages, bp->b_page_count, |
461 | purge_addresses(); | 393 | -1, PAGE_KERNEL); |
462 | bp->b_addr = vmap(bp->b_pages, bp->b_page_count, | ||
463 | VM_MAP, PAGE_KERNEL); | ||
464 | if (unlikely(bp->b_addr == NULL)) | 394 | if (unlikely(bp->b_addr == NULL)) |
465 | return -ENOMEM; | 395 | return -ENOMEM; |
466 | bp->b_addr += bp->b_offset; | 396 | bp->b_addr += bp->b_offset; |
@@ -1955,9 +1885,6 @@ xfsbufd( | |||
1955 | xfs_buf_iostrategy(bp); | 1885 | xfs_buf_iostrategy(bp); |
1956 | count++; | 1886 | count++; |
1957 | } | 1887 | } |
1958 | |||
1959 | if (as_list_len > 0) | ||
1960 | purge_addresses(); | ||
1961 | if (count) | 1888 | if (count) |
1962 | blk_run_address_space(target->bt_mapping); | 1889 | blk_run_address_space(target->bt_mapping); |
1963 | 1890 | ||
diff --git a/fs/xfs/linux-2.6/xfs_ioctl.c b/fs/xfs/linux-2.6/xfs_ioctl.c index 4ea1ee18ade..7b26cc2fd28 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl.c +++ b/fs/xfs/linux-2.6/xfs_ioctl.c | |||
@@ -58,6 +58,7 @@ | |||
58 | #include <linux/mount.h> | 58 | #include <linux/mount.h> |
59 | #include <linux/namei.h> | 59 | #include <linux/namei.h> |
60 | #include <linux/pagemap.h> | 60 | #include <linux/pagemap.h> |
61 | #include <linux/slab.h> | ||
61 | #include <linux/exportfs.h> | 62 | #include <linux/exportfs.h> |
62 | 63 | ||
63 | /* | 64 | /* |
diff --git a/fs/xfs/linux-2.6/xfs_ioctl32.c b/fs/xfs/linux-2.6/xfs_ioctl32.c index 0bf6d61f052..593c05b4df8 100644 --- a/fs/xfs/linux-2.6/xfs_ioctl32.c +++ b/fs/xfs/linux-2.6/xfs_ioctl32.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/compat.h> | 18 | #include <linux/compat.h> |
19 | #include <linux/ioctl.h> | 19 | #include <linux/ioctl.h> |
20 | #include <linux/mount.h> | 20 | #include <linux/mount.h> |
21 | #include <linux/slab.h> | ||
21 | #include <asm/uaccess.h> | 22 | #include <asm/uaccess.h> |
22 | #include "xfs.h" | 23 | #include "xfs.h" |
23 | #include "xfs_fs.h" | 24 | #include "xfs_fs.h" |
diff --git a/fs/xfs/linux-2.6/xfs_iops.c b/fs/xfs/linux-2.6/xfs_iops.c index 61a99608731..e65a7937f3a 100644 --- a/fs/xfs/linux-2.6/xfs_iops.c +++ b/fs/xfs/linux-2.6/xfs_iops.c | |||
@@ -56,6 +56,7 @@ | |||
56 | #include <linux/security.h> | 56 | #include <linux/security.h> |
57 | #include <linux/falloc.h> | 57 | #include <linux/falloc.h> |
58 | #include <linux/fiemap.h> | 58 | #include <linux/fiemap.h> |
59 | #include <linux/slab.h> | ||
59 | 60 | ||
60 | /* | 61 | /* |
61 | * Bring the timestamps in the XFS inode uptodate. | 62 | * Bring the timestamps in the XFS inode uptodate. |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 71345a370d9..52e06b487ce 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -61,6 +61,7 @@ | |||
61 | 61 | ||
62 | #include <linux/namei.h> | 62 | #include <linux/namei.h> |
63 | #include <linux/init.h> | 63 | #include <linux/init.h> |
64 | #include <linux/slab.h> | ||
64 | #include <linux/mount.h> | 65 | #include <linux/mount.h> |
65 | #include <linux/mempool.h> | 66 | #include <linux/mempool.h> |
66 | #include <linux/writeback.h> | 67 | #include <linux/writeback.h> |