--- /dev/null
+From nobody Mon Sep 17 00:00:00 2001
+From: Oleg Drokin <green@linuxhacker.ru>
+Date: Sat, 25 Mar 2006 03:06:54 -0800
+Subject: [PATCH] Missed error checking for intent's filp in open_namei().
+
+It seems there is error check missing in open_namei for errors returned
+through intent.open.file (from lookup_instantiate_filp).
+
+If there is plain open performed, then such a check done inside
+__path_lookup_intent_open called from path_lookup_open(), but when the open
+is performed with O_CREAT flag set, then __path_lookup_intent_open is only
+called with LOOKUP_PARENT set where no file opening can occur yet.
+
+Later on lookup_hash is called where exact opening might take place and
+intent.open.file may be filled. If it is filled with error value of some
+sort, then we get kernel attempting to dereference this error value as
+address (and corresponding oops) in nameidata_to_filp() called from
+filp_open().
+
+While this is relatively simple to workaround in ->lookup() method by just
+checking lookup_instantiate_filp() return value and returning error as
+needed, this is not so easy in ->d_revalidate(), where we can only return
+"yes, dentry is valid" or "no, dentry is invalid, perform full lookup
+again", and just returning 0 on error would cause extra lookup (with
+potential extra costly RPCs).
+
+So in short, I believe that there should be no difference in error handling
+for opening a file and creating a file in open_namei() and propose this
+simple patch as a solution.
+
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Linus Torvalds <torvalds@osdl.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ fs/namei.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+--- linux-2.6.16.20.orig/fs/namei.c
++++ linux-2.6.16.20/fs/namei.c
+@@ -1628,6 +1628,12 @@ do_last:
+ goto exit;
+ }
+
++ if (IS_ERR(nd->intent.open.file)) {
++ mutex_unlock(&dir->d_inode->i_mutex);
++ error = PTR_ERR(nd->intent.open.file);
++ goto exit_dput;
++ }
++
+ /* Negative dentry, just create the file */
+ if (!path.dentry->d_inode) {
+ if (!IS_POSIXACL(dir->d_inode))
drivers/usb/serial/whiteheat.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
---- gregkh-2.6.orig/drivers/usb/serial/whiteheat.c
-+++ gregkh-2.6/drivers/usb/serial/whiteheat.c
+--- linux-2.6.16.20.orig/drivers/usb/serial/whiteheat.c
++++ linux-2.6.16.20/drivers/usb/serial/whiteheat.c
@@ -388,7 +388,7 @@ static int whiteheat_attach (struct usb_
if (ret) {
err("%s: Couldn't send command [%d]", serial->type->description, ret);