diff options
Diffstat (limited to 'fs/nilfs2/ioctl.c')
-rw-r--r-- | fs/nilfs2/ioctl.c | 20 |
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 | |||
40 | static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, | 37 | static 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 | ||