From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752464Ab0HXEyi (ORCPT ); Tue, 24 Aug 2010 00:54:38 -0400 Received: from filtteri2.pp.htv.fi ([213.243.153.185]:37733 "EHLO filtteri2.pp.htv.fi" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751357Ab0HXEyg (ORCPT ); Tue, 24 Aug 2010 00:54:36 -0400 X-Greylist: delayed 359 seconds by postgrey-1.27 at vger.kernel.org; Tue, 24 Aug 2010 00:54:36 EDT From: Pekka Enberg To: gregkh@suse.de Cc: linux-kernel@vger.kernel.org, Pekka Enberg , Andrew Morton , Alan Cox , Arnd Bergmann , David Rientjes Subject: [PATCH v2] tty: Remove __GFP_NOFAIL from tty_add_file() Date: Tue, 24 Aug 2010 07:48:34 +0300 Message-Id: <1282625314-2445-1-git-send-email-penberg@kernel.org> X-Mailer: git-send-email 1.6.3.3 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch removes __GFP_NOFAIL use from tty_add_file() and adds proper error handling to the call-sites of the function. Cc: Andrew Morton Cc: Alan Cox Cc: Arnd Bergmann Cc: David Rientjes Signed-off-by: Pekka Enberg --- - v1 -> v2: Use devpts_kill_index() for tty_add_file() failures in ptmx_open() as suggested by David Rientjes. drivers/char/pty.c | 4 +++- drivers/char/tty_io.c | 15 +++++++++++---- include/linux/tty.h | 2 +- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/drivers/char/pty.c b/drivers/char/pty.c index c350d01..923a485 100644 --- a/drivers/char/pty.c +++ b/drivers/char/pty.c @@ -676,7 +676,9 @@ static int ptmx_open(struct inode *inode, struct file *filp) set_bit(TTY_PTY_LOCK, &tty->flags); /* LOCK THE SLAVE */ - tty_add_file(tty, filp); + retval = tty_add_file(tty, filp); + if (retval) + goto out; retval = devpts_pty_new(inode, tty->link); if (retval) diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index 949067a..1587f93 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -194,12 +194,13 @@ static inline struct tty_struct *file_tty(struct file *file) } /* Associate a new file with the tty structure */ -void tty_add_file(struct tty_struct *tty, struct file *file) +int tty_add_file(struct tty_struct *tty, struct file *file) { struct tty_file_private *priv; - /* XXX: must implement proper error handling in callers */ - priv = kmalloc(sizeof(*priv), GFP_KERNEL|__GFP_NOFAIL); + priv = kmalloc(sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; priv->tty = tty; priv->file = file; @@ -208,6 +209,8 @@ void tty_add_file(struct tty_struct *tty, struct file *file) spin_lock(&tty_files_lock); list_add(&priv->list, &tty->tty_files); spin_unlock(&tty_files_lock); + + return 0; } /* Delete file from its tty */ @@ -1875,7 +1878,11 @@ got_driver: return PTR_ERR(tty); } - tty_add_file(tty, filp); + retval = tty_add_file(tty, filp); + if (retval) { + tty_unlock(); + return retval; + } check_tty_count(tty, "tty_open"); if (tty->driver->type == TTY_DRIVER_TYPE_PTY && diff --git a/include/linux/tty.h b/include/linux/tty.h index 67d64e6..a3f4388 100644 --- a/include/linux/tty.h +++ b/include/linux/tty.h @@ -465,7 +465,7 @@ extern void proc_clear_tty(struct task_struct *p); extern struct tty_struct *get_current_tty(void); extern void tty_default_fops(struct file_operations *fops); extern struct tty_struct *alloc_tty_struct(void); -extern void tty_add_file(struct tty_struct *tty, struct file *file); +extern int tty_add_file(struct tty_struct *tty, struct file *file); extern void free_tty_struct(struct tty_struct *tty); extern void initialize_tty_struct(struct tty_struct *tty, struct tty_driver *driver, int idx); -- 1.6.3.3