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