Whamcloud - gitweb
LU-3807 dcache: Unsafe error handling arnd ll_splice_alias
[fs/lustre-release.git] / lustre / llite / namei.c
index 1aebd26..c01e2e4 100644 (file)
@@ -434,12 +434,12 @@ struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de)
 int ll_lookup_it_finish(struct ptlrpc_request *request,
                         struct lookup_intent *it, void *data)
 {
-        struct it_cb_data *icbd = data;
-        struct dentry **de = icbd->icbd_childp;
-        struct inode *parent = icbd->icbd_parent;
-        struct inode *inode = NULL;
-       __u64 bits = 0;
-       int rc;
+       struct it_cb_data        *icbd = data;
+       struct dentry           **de = icbd->icbd_childp;
+       struct inode             *parent = icbd->icbd_parent;
+       struct inode             *inode = NULL;
+       __u64                     bits = 0;
+       int                       rc;
        ENTRY;
 
        /* NB 1 request reference will be taken away by ll_intent_lock()
@@ -467,9 +467,12 @@ int ll_lookup_it_finish(struct ptlrpc_request *request,
         * Atoimc_open may passin hashed dentries for open.
         */
        if (d_unhashed(*de)) {
-               *de = ll_splice_alias(inode, *de);
-               if (IS_ERR(*de))
-                       RETURN(PTR_ERR(*de));
+               struct dentry *alias;
+
+               alias = ll_splice_alias(inode, *de);
+               if (IS_ERR(alias))
+                       RETURN(PTR_ERR(alias));
+               *de = alias;
        }
 
        if (!it_disposition(it, DISP_LOOKUP_NEG)) {