|
@@ -1691,6 +1691,7 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
|
|
|
struct dm_ioctl *dmi;
|
|
|
int secure_data;
|
|
|
const size_t minimum_data_size = offsetof(struct dm_ioctl, data);
|
|
|
+ unsigned noio_flag;
|
|
|
|
|
|
if (copy_from_user(param_kernel, user, minimum_data_size))
|
|
|
return -EFAULT;
|
|
@@ -1713,15 +1714,9 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl *param_kern
|
|
|
* Use kmalloc() rather than vmalloc() when we can.
|
|
|
*/
|
|
|
dmi = NULL;
|
|
|
- if (param_kernel->data_size <= KMALLOC_MAX_SIZE)
|
|
|
- dmi = kmalloc(param_kernel->data_size, GFP_NOIO | __GFP_NORETRY | __GFP_NOMEMALLOC | __GFP_NOWARN);
|
|
|
-
|
|
|
- if (!dmi) {
|
|
|
- unsigned noio_flag;
|
|
|
- noio_flag = memalloc_noio_save();
|
|
|
- dmi = __vmalloc(param_kernel->data_size, GFP_NOIO | __GFP_HIGH | __GFP_HIGHMEM, PAGE_KERNEL);
|
|
|
- memalloc_noio_restore(noio_flag);
|
|
|
- }
|
|
|
+ noio_flag = memalloc_noio_save();
|
|
|
+ dmi = kvmalloc(param_kernel->data_size, GFP_KERNEL);
|
|
|
+ memalloc_noio_restore(noio_flag);
|
|
|
|
|
|
if (!dmi) {
|
|
|
if (secure_data && clear_user(user, param_kernel->data_size))
|