From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751976AbdF3Dn4 (ORCPT ); Thu, 29 Jun 2017 23:43:56 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:35478 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751696AbdF3Dny (ORCPT ); Thu, 29 Jun 2017 23:43:54 -0400 From: Haishan Zhou To: lrg@ti.com, broonie@kernel.org Cc: linux-kernel@vger.kernel.org Subject: [PATCH] regulator: core: Fix size limit of supply_map Date: Fri, 30 Jun 2017 11:43:42 +0800 Message-Id: <1498794222-18839-1-git-send-email-zhssmail@gmail.com> X-Mailer: git-send-email 1.9.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Now the debugfs file supply_map has a size limit PAGE_SIZE and the user can not see the whole content of regulator_map_list when it is larger than this limit. This patch uses seq_file instead to make sure supply_map shows the full information of regulator_map_list. Signed-off-by: Haishan Zhou --- drivers/regulator/core.c | 36 +++++++++++++----------------------- 1 file changed, 13 insertions(+), 23 deletions(-) diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c index e3661c2..32c2fdc 100644 --- a/drivers/regulator/core.c +++ b/drivers/regulator/core.c @@ -3737,41 +3737,31 @@ void *regulator_get_init_drvdata(struct regulator_init_data *reg_init_data) EXPORT_SYMBOL_GPL(regulator_get_init_drvdata); #ifdef CONFIG_DEBUG_FS -static ssize_t supply_map_read_file(struct file *file, char __user *user_buf, - size_t count, loff_t *ppos) +static int supply_map_show(struct seq_file *sf, void *data) { - char *buf = kmalloc(PAGE_SIZE, GFP_KERNEL); - ssize_t len, ret = 0; struct regulator_map *map; - if (!buf) - return -ENOMEM; - list_for_each_entry(map, ®ulator_map_list, list) { - len = snprintf(buf + ret, PAGE_SIZE - ret, - "%s -> %s.%s\n", - rdev_get_name(map->regulator), map->dev_name, - map->supply); - if (len >= 0) - ret += len; - if (ret > PAGE_SIZE) { - ret = PAGE_SIZE; - break; - } + seq_printf(sf, "%s -> %s.%s\n", + rdev_get_name(map->regulator), map->dev_name, + map->supply); } - ret = simple_read_from_buffer(user_buf, count, ppos, buf, ret); - - kfree(buf); + return 0; +} - return ret; +static int supply_map_open(struct inode *inode, struct file *file) +{ + return single_open(file, supply_map_show, inode->i_private); } #endif static const struct file_operations supply_map_fops = { #ifdef CONFIG_DEBUG_FS - .read = supply_map_read_file, - .llseek = default_llseek, + .open = supply_map_open, + .read = seq_read, + .llseek = seq_lseek, + .release = single_release, #endif }; -- 1.9.1