Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / fs / ntfs / malloc.h
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  */
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  */
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  */
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
72 static inline void ntfs_free(void *addr)
73 {
74         kvfree(addr);
75 }
76
77 #endif /* _LINUX_NTFS_MALLOC_H */