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