single_open() returns -ENOMEM when malloc failed, so the caller function rtl_debugfs_open_rw() should not always return 0. In addition, when using single_open(), we should use single_release() instead of seq_release() in the file_operations structure to avoid a memory leak. Signed-off-by: Tiezhu Yang <kernelpatch@xxxxxxx> --- drivers/staging/rtlwifi/debug.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/staging/rtlwifi/debug.c b/drivers/staging/rtlwifi/debug.c index c041bc3..bf360f8 100644 --- a/drivers/staging/rtlwifi/debug.c +++ b/drivers/staging/rtlwifi/debug.c @@ -95,7 +95,7 @@ static int dl_debug_open_common(struct inode *inode, struct file *file) .open = dl_debug_open_common, .read = seq_read, .llseek = seq_lseek, - .release = seq_release, + .release = single_release, }; static int rtl_debug_get_mac_page(struct seq_file *m, void *v) @@ -485,18 +485,20 @@ static int rtl_debug_get_phydm_cmd(struct seq_file *m, void *v) static int rtl_debugfs_open_rw(struct inode *inode, struct file *filp) { + int ret = 0; + if (filp->f_mode & FMODE_READ) - single_open(filp, rtl_debug_get_common, inode->i_private); + ret = single_open(filp, rtl_debug_get_common, inode->i_private); else filp->private_data = inode->i_private; - return 0; + return ret; } static int rtl_debugfs_close_rw(struct inode *inode, struct file *filp) { if (filp->f_mode == FMODE_READ) - seq_release(inode, filp); + single_release(inode, filp); return 0; } -- 1.8.3.1 _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel