Blame view

fs/ntfs/malloc.h 3.12 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
  /*
   * malloc.h - NTFS kernel memory handling. Part of the Linux-NTFS project.
   *
f6098cf44   Anton Altaparmakov   NTFS: Fix ntfs_{r...
4
   * Copyright (c) 2001-2005 Anton Altaparmakov
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
   *
   * This program/include file is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License as published
   * by the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program/include file is distributed in the hope that it will be
   * useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program (in the main directory of the Linux-NTFS
   * distribution in the file COPYING); if not, write to the Free Software
   * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   */
  
  #ifndef _LINUX_NTFS_MALLOC_H
  #define _LINUX_NTFS_MALLOC_H
  
  #include <linux/vmalloc.h>
  #include <linux/slab.h>
  #include <linux/highmem.h>
  
  /**
06d0e3cf3   Anton Altaparmakov   NTFS: Allow highm...
30
31
32
33
34
   * __ntfs_malloc - allocate memory in multiples of pages
   * @size:	number of bytes to allocate
   * @gfp_mask:	extra flags for the allocator
   *
   * Internal function.  You probably want ntfs_malloc_nofs()...
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
35
36
37
38
39
   *
   * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
   * returns a pointer to the allocated memory.
   *
   * If there was insufficient memory to complete the request, return NULL.
06d0e3cf3   Anton Altaparmakov   NTFS: Allow highm...
40
   * Depending on @gfp_mask the allocation may be guaranteed to succeed.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
41
   */
29b899051   Anton Altaparmakov   NTFS: In attrib.c...
42
  static inline void *__ntfs_malloc(unsigned long size, gfp_t gfp_mask)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
43
44
45
46
  {
  	if (likely(size <= PAGE_SIZE)) {
  		BUG_ON(!size);
  		/* kmalloc() has per-CPU caches so is faster for now. */
89ecf38c7   Anton Altaparmakov   NTFS: Mask out __...
47
  		return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
06d0e3cf3   Anton Altaparmakov   NTFS: Allow highm...
48
  		/* return (void *)__get_free_page(gfp_mask); */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  	}
4481374ce   Jan Beulich   mm: replace vario...
50
  	if (likely((size >> PAGE_SHIFT) < totalram_pages))
06d0e3cf3   Anton Altaparmakov   NTFS: Allow highm...
51
  		return __vmalloc(size, gfp_mask, PAGE_KERNEL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
  	return NULL;
  }
06d0e3cf3   Anton Altaparmakov   NTFS: Allow highm...
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
  /**
   * ntfs_malloc_nofs - allocate memory in multiples of pages
   * @size:	number of bytes to allocate
   *
   * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
   * returns a pointer to the allocated memory.
   *
   * If there was insufficient memory to complete the request, return NULL.
   */
  static inline void *ntfs_malloc_nofs(unsigned long size)
  {
  	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM);
  }
  
  /**
   * ntfs_malloc_nofs_nofail - allocate memory in multiples of pages
   * @size:	number of bytes to allocate
   *
   * Allocates @size bytes of memory, rounded up to multiples of PAGE_SIZE and
   * returns a pointer to the allocated memory.
   *
   * This function guarantees that the allocation will succeed.  It will sleep
   * for as long as it takes to complete the allocation.
   *
   * If there was insufficient memory to complete the request, return NULL.
   */
  static inline void *ntfs_malloc_nofs_nofail(unsigned long size)
  {
  	return __ntfs_malloc(size, GFP_NOFS | __GFP_HIGHMEM | __GFP_NOFAIL);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
84
85
  static inline void ntfs_free(void *addr)
  {
9e2779fa2   Christoph Lameter   is_vmalloc_addr()...
86
  	if (!is_vmalloc_addr(addr)) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
89
90
91
92
93
94
  		kfree(addr);
  		/* free_page((unsigned long)addr); */
  		return;
  	}
  	vfree(addr);
  }
  
  #endif /* _LINUX_NTFS_MALLOC_H */