Whamcloud - gitweb
LU-506 dcache: check lookup_instantiate_filp() return value
authorLai Siyao <laisiyao@whamcloud.com>
Mon, 9 Apr 2012 07:06:03 +0000 (15:06 +0800)
committerOleg Drokin <green@whamcloud.com>
Tue, 22 May 2012 05:24:52 +0000 (01:24 -0400)
For new kernels, nd->intent.open.file may not be checked before use,
but it may be an error code. To avoid this, return error when
the original open in lookup_instantiate_filp() fails.

Signed-off-by: Lai Siyao <laisiyao@whamcloud.com>
Change-Id: Ibfbc4eef284962302418872b9f1af8dce2f95db5
Reviewed-on: http://review.whamcloud.com/2491
Reviewed-by: Peng Tao <tao.peng@emc.com>
Tested-by: Hudson
Reviewed-by: Fan Yong <yong.fan@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
lustre/llite/dcache.c
lustre/llite/namei.c

index 830eca1..45543de 100644 (file)
@@ -676,21 +676,12 @@ int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
                                                (struct ptlrpc_request *)
                                                   it->d.lustre.it_data);
                         } else {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
-/* 2.6.1[456] have a bug in open_namei() that forgets to check
- * nd->intent.open.file for error, so we need to return it as lookup's result
- * instead */
-                                struct file *filp;
-
-                                nd->intent.open.file->private_data = it;
-                                filp = lookup_instantiate_filp(nd, dentry,NULL);
-                                if (IS_ERR(filp)) {
-                                        rc = PTR_ERR(filp);
-                                }
-#else
-                                nd->intent.open.file->private_data = it;
-                                (void)lookup_instantiate_filp(nd, dentry,NULL);
-#endif
+                               struct file *filp;
+
+                               nd->intent.open.file->private_data = it;
+                               filp = lookup_instantiate_filp(nd, dentry,NULL);
+                               if (IS_ERR(filp))
+                                       rc = PTR_ERR(filp);
                         }
                 }
                 if (!rc && (nd->flags & LOOKUP_CREATE) &&
index 64bbd87..d5c9fbe 100644 (file)
@@ -669,25 +669,17 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
                                                        (struct ptlrpc_request *)
                                                           it->d.lustre.it_data);
                                 } else {
-#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
-/* 2.6.1[456] have a bug in open_namei() that forgets to check
- * nd->intent.open.file for error, so we need to return it as lookup's result
- * instead */
-                                        struct file *filp;
-                                        nd->intent.open.file->private_data = it;
-                                        filp =lookup_instantiate_filp(nd,dentry,
-                                                                      NULL);
-                                        if (IS_ERR(filp)) {
-                                                if (de)
-                                                        dput(de);
-                                                de = (struct dentry *) filp;
-                                        }
-#else
-                                        nd->intent.open.file->private_data = it;
-                                        (void)lookup_instantiate_filp(nd,dentry,
-                                                                      NULL);
-#endif
-
+                                       struct file *filp;
+
+                                       nd->intent.open.file->private_data = it;
+                                       filp = lookup_instantiate_filp(nd,
+                                                                      dentry,
+                                                                      NULL);
+                                       if (IS_ERR(filp)) {
+                                               if (de)
+                                                       dput(de);
+                                               de = (struct dentry *)filp;
+                                       }
                                 }
                         } else if (it_disposition(it, DISP_OPEN_CREATE)) {
                                 // XXX This can only reliably work on assumption
@@ -908,8 +900,12 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
 
         rc = ll_create_it(dir, dentry, mode, it);
         if (nd && (nd->flags & LOOKUP_OPEN) && dentry->d_inode) { /* Open */
-                nd->intent.open.file->private_data = it;
-                lookup_instantiate_filp(nd, dentry, NULL);
+               struct file *filp;
+
+               nd->intent.open.file->private_data = it;
+               filp = lookup_instantiate_filp(nd, dentry, NULL);
+               if (IS_ERR(filp))
+                       rc = PTR_ERR(filp);
         }
 
 out: