diff options
author | Anton Altaparmakov <aia21@cantab.net> | 2005-09-08 11:28:25 -0400 |
---|---|---|
committer | Anton Altaparmakov <aia21@cantab.net> | 2005-09-08 11:28:25 -0400 |
commit | 06d0e3cf3d527f927681773c6ffbe697ccc5db7f (patch) | |
tree | e9692f00331c8951752785481c893d242bf9a29d /fs/ntfs | |
parent | e7a1033b946f4f2622f2b338ab107f559aad542c (diff) |
NTFS: Allow highmem kmalloc() in ntfs_malloc_nofs() and add _nofail() version.
- Modify fs/ntfs/malloc.h::ntfs_malloc_nofs() to do the kmalloc() based
allocations with __GFP_HIGHMEM, analogous to how the vmalloc() based
allocations are done.
- Add fs/ntfs/malloc.h::ntfs_malloc_nofs_nofail() which is analogous to
ntfs_malloc_nofs() but it performs allocations with __GFP_NOFAIL and
hence cannot fail.
Signed-off-by: Anton Altaparmakov <aia21@cantab.net>
Diffstat (limited to 'fs/ntfs')
-rw-r--r-- | fs/ntfs/ChangeLog | 6 | ||||
-rw-r--r-- | fs/ntfs/malloc.h | 48 |
2 files changed, 48 insertions, 6 deletions
diff --git a/fs/ntfs/ChangeLog b/fs/ntfs/ChangeLog index cceec3e9e2de..c3bf17be0e19 100644 --- a/fs/ntfs/ChangeLog +++ b/fs/ntfs/ChangeLog | |||
@@ -34,6 +34,12 @@ ToDo/Notes: | |||
34 | journals with two different restart pages. We sanity check both and | 34 | journals with two different restart pages. We sanity check both and |
35 | either use the only sane one or the more recent one of the two in the | 35 | either use the only sane one or the more recent one of the two in the |
36 | case that both are valid. | 36 | case that both are valid. |
37 | - Modify fs/ntfs/malloc.h::ntfs_malloc_nofs() to do the kmalloc() based | ||
38 | allocations with __GFP_HIGHMEM, analogous to how the vmalloc() based | ||
39 | allocations are done. | ||
40 | - Add fs/ntfs/malloc.h::ntfs_malloc_nofs_nofail() which is analogous to | ||
41 | ntfs_malloc_nofs() but it performs allocations with __GFP_NOFAIL and | ||
42 | hence cannot fail. | ||
37 | 43 | ||
38 | 2.1.23 - Implement extension of resident files and make writing safe as well as | 44 | 2.1.23 - Implement extension of resident files and make writing safe as well as |
39 | many bug fixes, cleanups, and enhancements... | 45 | many bug fixes, cleanups, and enhancements... |
diff --git a/fs/ntfs/malloc.h b/fs/ntfs/malloc.h index fac5944df6d8..9994e019a3cf 100644 --- a/fs/ntfs/malloc.h +++ b/fs/ntfs/malloc.h | |||
@@ -27,27 +27,63 @@ | |||
27 | #include <linux/highmem.h> | 27 | #include <linux/highmem.h> |
28 | 28 | ||
29 | /** | 29 | /** |
30 | * ntfs_malloc_nofs - allocate memory in multiples of pages | 30 | * __ntfs_malloc - allocate memory in multiples of pages |
31 | * @size number of bytes to allocate | 31 | * @size: number of bytes to allocate |
32 | * @gfp_mask: extra flags for the allocator | ||
33 | * | ||
34 | * Internal function. You probably want ntfs_malloc_nofs()... | ||
32 | * | 35 | * |
33 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | 36 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and |
34 | * returns a pointer to the allocated memory. | 37 | * returns a pointer to the allocated memory. |
35 | * | 38 | * |
36 | * If there was insufficient memory to complete the request, return NULL. | 39 | * If there was insufficient memory to complete the request, return NULL. |
40 | * Depending on @gfp_mask the allocation may be guaranteed to succeed. | ||
37 | */ | 41 | */ |
38 | static inline void *ntfs_malloc_nofs(unsigned long size) | 42 | static inline void *__ntfs_malloc(unsigned long size, |
43 | unsigned int __nocast gfp_mask) | ||
39 | { | 44 | { |
40 | if (likely(size <= PAGE_SIZE)) { | 45 | if (likely(size <= PAGE_SIZE)) { |
41 | BUG_ON(!size); | 46 | BUG_ON(!size); |
42 | /* kmalloc() has per-CPU caches so is faster for now. */ | 47 | /* kmalloc() has per-CPU caches so is faster for now. */ |
43 | return kmalloc(PAGE_SIZE, GFP_NOFS); | 48 | return kmalloc(PAGE_SIZE, gfp_mask); |
44 | /* return (void *)__get_free_page(GFP_NOFS | __GFP_HIGHMEM); */ | 49 | /* return (void *)__get_free_page(gfp_mask); */ |
45 | } | 50 | } |
46 | if (likely(size >> PAGE_SHIFT < num_physpages)) | 51 | if (likely(size >> PAGE_SHIFT < num_physpages)) |
47 | return __vmalloc(size, GFP_NOFS | __GFP_HIGHMEM, PAGE_KERNEL); | 52 | return __vmalloc(size, gfp_mask, PAGE_KERNEL); |
48 | return NULL; | 53 | return NULL; |
49 | } | 54 | } |
50 | 55 | ||
56 | /** | ||
57 | * ntfs_malloc_nofs - allocate memory in multiples of pages | ||
58 | * @size: number of bytes to allocate | ||
59 | * | ||
60 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | ||
61 | * returns a pointer to the allocated memory. | ||
62 | * | ||
63 | * If there was insufficient memory to complete the request, return NULL. | ||
64 | */ | ||
65 | static inline void *ntfs_malloc_nofs(unsigned long size) | ||
66 | { | ||
67 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM); | ||
68 | } | ||
69 | |||
70 | /** | ||
71 | * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages | ||
72 | * @size: number of bytes to allocate | ||
73 | * | ||
74 | * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and | ||
75 | * returns a pointer to the allocated memory. | ||
76 | * | ||
77 | * This function guarantees that the allocation will succeed. It will sleep | ||
78 | * for as long as it takes to complete the allocation. | ||
79 | * | ||
80 | * If there was insufficient memory to complete the request, return NULL. | ||
81 | */ | ||
82 | static inline void *ntfs_malloc_nofs_nofail(unsigned long size) | ||
83 | { | ||
84 | return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL); | ||
85 | } | ||
86 | |||
51 | static inline void ntfs_free(void *addr) | 87 | static inline void ntfs_free(void *addr) |
52 | { | 88 | { |
53 | if (likely(((unsigned long)addr < VMALLOC_START) || | 89 | if (likely(((unsigned long)addr < VMALLOC_START) || |