18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (c) 2001-2005 Anton Altaparmakov 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef _LINUX_NTFS_MALLOC_H 98c2ecf20Sopenharmony_ci#define _LINUX_NTFS_MALLOC_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <linux/vmalloc.h> 128c2ecf20Sopenharmony_ci#include <linux/slab.h> 138c2ecf20Sopenharmony_ci#include <linux/highmem.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/** 168c2ecf20Sopenharmony_ci * __ntfs_malloc - allocate memory in multiples of pages 178c2ecf20Sopenharmony_ci * @size: number of bytes to allocate 188c2ecf20Sopenharmony_ci * @gfp_mask: extra flags for the allocator 198c2ecf20Sopenharmony_ci * 208c2ecf20Sopenharmony_ci * Internal function. You probably want ntfs_malloc_nofs()... 218c2ecf20Sopenharmony_ci * 228c2ecf20Sopenharmony_ci * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and 238c2ecf20Sopenharmony_ci * returns a pointer to the allocated memory. 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * If there was insufficient memory to complete the request, return NULL. 268c2ecf20Sopenharmony_ci * Depending on @gfp_mask the allocation may be guaranteed to succeed. 278c2ecf20Sopenharmony_ci */ 288c2ecf20Sopenharmony_cistatic inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask) 298c2ecf20Sopenharmony_ci{ 308c2ecf20Sopenharmony_ci if (likely(size <= PAGE_SIZE)) { 318c2ecf20Sopenharmony_ci BUG_ON(!size); 328c2ecf20Sopenharmony_ci /* kmalloc() has per-CPU caches so is faster for now. */ 338c2ecf20Sopenharmony_ci return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM); 348c2ecf20Sopenharmony_ci /* return (void *)__get_free_page(gfp_mask); */ 358c2ecf20Sopenharmony_ci } 368c2ecf20Sopenharmony_ci if (likely((size >> PAGE_SHIFT) < totalram_pages())) 378c2ecf20Sopenharmony_ci return __vmalloc(size, gfp_mask); 388c2ecf20Sopenharmony_ci return NULL; 398c2ecf20Sopenharmony_ci} 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci/** 428c2ecf20Sopenharmony_ci * ntfs_malloc_nofs - allocate memory in multiples of pages 438c2ecf20Sopenharmony_ci * @size: number of bytes to allocate 448c2ecf20Sopenharmony_ci * 458c2ecf20Sopenharmony_ci * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and 468c2ecf20Sopenharmony_ci * returns a pointer to the allocated memory. 478c2ecf20Sopenharmony_ci * 488c2ecf20Sopenharmony_ci * If there was insufficient memory to complete the request, return NULL. 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cistatic inline void *ntfs_malloc_nofs(unsigned long size) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM); 538c2ecf20Sopenharmony_ci} 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci/** 568c2ecf20Sopenharmony_ci * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages 578c2ecf20Sopenharmony_ci * @size: number of bytes to allocate 588c2ecf20Sopenharmony_ci * 598c2ecf20Sopenharmony_ci * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and 608c2ecf20Sopenharmony_ci * returns a pointer to the allocated memory. 618c2ecf20Sopenharmony_ci * 628c2ecf20Sopenharmony_ci * This function guarantees that the allocation will succeed. It will sleep 638c2ecf20Sopenharmony_ci * for as long as it takes to complete the allocation. 648c2ecf20Sopenharmony_ci * 658c2ecf20Sopenharmony_ci * If there was insufficient memory to complete the request, return NULL. 668c2ecf20Sopenharmony_ci */ 678c2ecf20Sopenharmony_cistatic inline void *ntfs_malloc_nofs_nofail(unsigned long size) 688c2ecf20Sopenharmony_ci{ 698c2ecf20Sopenharmony_ci return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL); 708c2ecf20Sopenharmony_ci} 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_cistatic inline void ntfs_free(void *addr) 738c2ecf20Sopenharmony_ci{ 748c2ecf20Sopenharmony_ci kvfree(addr); 758c2ecf20Sopenharmony_ci} 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#endif /* _LINUX_NTFS_MALLOC_H */ 78