diff options
author | Matthew Wilcox <matthew@wil.cx> | 2007-12-03 12:10:24 -0500 |
---|---|---|
committer | Matthew Wilcox <matthew@wil.cx> | 2007-12-04 10:39:56 -0500 |
commit | 399154be2dcb6a58dbde9682162c38113cf3e40b (patch) | |
tree | e8f18356056729ef104db151703018d72e9ca929 | |
parent | 2cae367e4854ff055c4f5e8aacd56b0eeec9f6cb (diff) |
dmapool: Validate parameters to dma_pool_create
Check that 'align' is a power of two, like the API specifies.
Align 'size' to 'align' correctly -- the current code has an off-by-one.
The ALIGN macro in kernel.h doesn't.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Acked-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | mm/dmapool.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/mm/dmapool.c b/mm/dmapool.c index b5ff9ce8765b..744d541df866 100644 --- a/mm/dmapool.c +++ b/mm/dmapool.c | |||
@@ -106,17 +106,18 @@ struct dma_pool *dma_pool_create(const char *name, struct device *dev, | |||
106 | { | 106 | { |
107 | struct dma_pool *retval; | 107 | struct dma_pool *retval; |
108 | 108 | ||
109 | if (align == 0) | 109 | if (align == 0) { |
110 | align = 1; | 110 | align = 1; |
111 | if (size == 0) | 111 | } else if (align & (align - 1)) { |
112 | return NULL; | 112 | return NULL; |
113 | else if (size < align) | ||
114 | size = align; | ||
115 | else if ((size % align) != 0) { | ||
116 | size += align + 1; | ||
117 | size &= ~(align - 1); | ||
118 | } | 113 | } |
119 | 114 | ||
115 | if (size == 0) | ||
116 | return NULL; | ||
117 | |||
118 | if ((size % align) != 0) | ||
119 | size = ALIGN(size, align); | ||
120 | |||
120 | if (allocation == 0) { | 121 | if (allocation == 0) { |
121 | if (PAGE_SIZE < size) | 122 | if (PAGE_SIZE < size) |
122 | allocation = size; | 123 | allocation = size; |