aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nilfs2/ioctl.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c
index 35ba60ea9617..02e91e167ca2 100644
--- a/fs/nilfs2/ioctl.c
+++ b/fs/nilfs2/ioctl.c
@@ -34,9 +34,6 @@
34#include "dat.h" 34#include "dat.h"
35 35
36 36
37#define KMALLOC_SIZE_MIN 4096 /* 4KB */
38#define KMALLOC_SIZE_MAX 131072 /* 128 KB */
39
40static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, 37static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
41 struct nilfs_argv *argv, int dir, 38 struct nilfs_argv *argv, int dir,
42 ssize_t (*dofunc)(struct the_nilfs *, 39 ssize_t (*dofunc)(struct the_nilfs *,
@@ -44,21 +41,20 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
44 void *, size_t, size_t)) 41 void *, size_t, size_t))
45{ 42{
46 void *buf; 43 void *buf;
47 size_t ksize, maxmembs, total, n; 44 size_t maxmembs, total, n;
48 ssize_t nr; 45 ssize_t nr;
49 int ret, i; 46 int ret, i;
50 47
51 if (argv->v_nmembs == 0) 48 if (argv->v_nmembs == 0)
52 return 0; 49 return 0;
53 50
54 for (ksize = KMALLOC_SIZE_MAX; ksize >= KMALLOC_SIZE_MIN; ksize /= 2) { 51 if (argv->v_size > PAGE_SIZE)
55 buf = kmalloc(ksize, GFP_NOFS); 52 return -EINVAL;
56 if (buf != NULL) 53
57 break; 54 buf = (void *)__get_free_pages(GFP_NOFS, 0);
58 } 55 if (unlikely(!buf))
59 if (ksize < KMALLOC_SIZE_MIN)
60 return -ENOMEM; 56 return -ENOMEM;
61 maxmembs = ksize / argv->v_size; 57 maxmembs = PAGE_SIZE / argv->v_size;
62 58
63 ret = 0; 59 ret = 0;
64 total = 0; 60 total = 0;
@@ -89,7 +85,7 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs,
89 } 85 }
90 argv->v_nmembs = total; 86 argv->v_nmembs = total;
91 87
92 kfree(buf); 88 free_pages((unsigned long)buf, 0);
93 return ret; 89 return ret;
94} 90}
95 91