1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project.
4  *
5  * Copyright (c) 2001-2005 Anton Altaparmakov
6  */
7 
8 #ifndef _LINUX_NTFS_MALLOC_H
9 #define _LINUX_NTFS_MALLOC_H
10 
11 #include <linux/vmalloc.h>
12 #include <linux/slab.h>
13 #include <linux/highmem.h>
14 
15 /**
16  * __ntfs_malloc - allocate memory in multiples of pages
17  * @size:	number of bytes to allocate
18  * @gfp_mask:	extra flags for the allocator
19  *
20  * Internal function.  You probably want ntfs_malloc_nofs()...
21  *
22  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
23  * returns a pointer to the allocated memory.
24  *
25  * If there was insufficient memory to complete the request, return NULL.
26  * Depending on @gfp_mask the allocation may be guaranteed to succeed.
27  */
__ntfs_malloc(unsigned long size,gfp_t gfp_mask)28 static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask)
29 {
30 	if (likely(size <= PAGE_SIZE)) {
31 		BUG_ON(!size);
32 		/* kmalloc() has per-CPU caches so is faster for now. */
33 		return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
34 		/* return (void *)__get_free_page(gfp_mask); */
35 	}
36 	if (likely((size >> PAGE_SHIFT) < totalram_pages()))
37 		return __vmalloc(size, gfp_mask);
38 	return NULL;
39 }
40 
41 /**
42  * ntfs_malloc_nofs - allocate memory in multiples of pages
43  * @size:	number of bytes to allocate
44  *
45  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
46  * returns a pointer to the allocated memory.
47  *
48  * If there was insufficient memory to complete the request, return NULL.
49  */
ntfs_malloc_nofs(unsigned long size)50 static inline void *ntfs_malloc_nofs(unsigned long size)
51 {
52 	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM);
53 }
54 
55 /**
56  * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages
57  * @size:	number of bytes to allocate
58  *
59  * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
60  * returns a pointer to the allocated memory.
61  *
62  * This function guarantees that the allocation will succeed.  It will sleep
63  * for as long as it takes to complete the allocation.
64  *
65  * If there was insufficient memory to complete the request, return NULL.
66  */
ntfs_malloc_nofs_nofail(unsigned long size)67 static inline void *ntfs_malloc_nofs_nofail(unsigned long size)
68 {
69 	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL);
70 }
71 
ntfs_free(void * addr)72 static inline void ntfs_free(void *addr)
73 {
74 	kvfree(addr);
75 }
76 
77 #endif /* _LINUX_NTFS_MALLOC_H */
78