The current memory copy function of nilfs2 ioctl has following problems: (1) It tries to allocate 128KB size of memory even for small objects. (2) Though the function repeatedly tries large memory allocations while reducing the size, GFP_NOWAIT flag is not specified. This increases the possibility of system memory shortage. (3) During the retries of (2), verbose warnings are printed because _GFP_NOWARN flag is not used for the kmalloc calls. This will fix these problems. Signed-off-by: Ryusuke Konishi <konishi.ryusuke@xxxxxxxxxxxxx> --- fs/nilfs2/ioctl.c | 17 ++++++++++++----- 1 files changed, 12 insertions(+), 5 deletions(-) diff --git a/fs/nilfs2/ioctl.c b/fs/nilfs2/ioctl.c index 35ba60e..5ba6e4e 100644 --- a/fs/nilfs2/ioctl.c +++ b/fs/nilfs2/ioctl.c @@ -51,13 +51,20 @@ static int nilfs_ioctl_wrap_copy(struct the_nilfs *nilfs, if (argv->v_nmembs == 0) return 0; - for (ksize = KMALLOC_SIZE_MAX; ksize >= KMALLOC_SIZE_MIN; ksize /= 2) { - buf = kmalloc(ksize, GFP_NOFS); - if (buf != NULL) - break; + ksize = min_t(unsigned long, argv->v_nmembs * argv->v_size, + KMALLOC_SIZE_MAX); + while (ksize >= KMALLOC_SIZE_MIN) { + buf = kmalloc(ksize, GFP_NOWAIT | __GFP_NOWARN); + if (buf) + goto allocated; + ksize >>= 1; } - if (ksize < KMALLOC_SIZE_MIN) + ksize = max_t(size_t, ksize, argv->v_size); + buf = kmalloc(ksize, GFP_NOFS); + if (unlikely(!buf)) return -ENOMEM; + + allocated: maxmembs = ksize / argv->v_size; ret = 0; -- 1.5.6.5 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html