diff options
Diffstat (limited to 'fs/ntfs/malloc.h')
| -rw-r--r-- | fs/ntfs/malloc.h | 48 |
1 files changed, 42 insertions, 6 deletions
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) || |
