}
                return -ENOSPC;
        }
+
+       /*
+        * Protect against obviously corrupt allocation btree records. Later
+        * xfs_iget checks will catch re-allocation of other active in-memory
+        * and on-disk inodes. If we don't catch reallocating the parent inode
+        * here we will deadlock in xfs_iget() so we have to do these checks
+        * first.
+        */
+       if (ino == parent || !xfs_verify_dir_ino(mp, ino)) {
+               xfs_alert(mp, "Allocated a known in-use inode 0x%llx!", ino);
+               xfs_agno_mark_sick(mp, XFS_INO_TO_AGNO(mp, ino),
+                               XFS_SICK_AG_INOBT);
+               return -EFSCORRUPTED;
+       }
+
        *new_ino = ino;
        return 0;
 }
 
        }
 }
 
-/*
- * Initialise a newly allocated inode and return the in-core inode to the
- * caller locked exclusively.
- *
- * Caller is responsible for unlocking the inode manually upon return
- */
-int
-xfs_icreate(
+/* Initialise an inode's attributes. */
+static void
+xfs_inode_init(
        struct xfs_trans        *tp,
-       xfs_ino_t               ino,
        const struct xfs_icreate_args *args,
-       struct xfs_inode        **ipp)
+       struct xfs_inode        *ip)
 {
        struct xfs_inode        *pip = args->pip;
        struct inode            *dir = pip ? VFS_I(pip) : NULL;
        struct xfs_mount        *mp = tp->t_mountp;
-       struct xfs_inode        *ip;
-       struct inode            *inode;
+       struct inode            *inode = VFS_I(ip);
        unsigned int            flags;
        int                     times = XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG |
                                        XFS_ICHGTIME_ACCESS;
-       int                     error;
-
-       /*
-        * Protect against obviously corrupt allocation btree records. Later
-        * xfs_iget checks will catch re-allocation of other active in-memory
-        * and on-disk inodes. If we don't catch reallocating the parent inode
-        * here we will deadlock in xfs_iget() so we have to do these checks
-        * first.
-        */
-       if ((pip && ino == pip->i_ino) || !xfs_verify_dir_ino(mp, ino)) {
-               xfs_alert(mp, "Allocated a known in-use inode 0x%llx!", ino);
-               xfs_agno_mark_sick(mp, XFS_INO_TO_AGNO(mp, ino),
-                               XFS_SICK_AG_INOBT);
-               return -EFSCORRUPTED;
-       }
-
-       /*
-        * Get the in-core inode with the lock held exclusively to prevent
-        * others from looking at until we're done.
-        */
-       error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip);
-       if (error)
-               return error;
-
-       ASSERT(ip != NULL);
-       inode = VFS_I(ip);
 
        if (args->flags & XFS_ICREATE_TMPFILE)
                set_nlink(inode, 0);
                }
        }
 
+       xfs_trans_log_inode(tp, ip, flags);
+}
+
+/*
+ * Initialise a newly allocated inode and return the in-core inode to the
+ * caller locked exclusively.
+ *
+ * Caller is responsible for unlocking the inode manually upon return
+ */
+int
+xfs_icreate(
+       struct xfs_trans        *tp,
+       xfs_ino_t               ino,
+       const struct xfs_icreate_args *args,
+       struct xfs_inode        **ipp)
+{
+       struct xfs_mount        *mp = tp->t_mountp;
+       struct xfs_inode        *ip = NULL;
+       int                     error;
+
        /*
-        * Log the new values stuffed into the inode.
+        * Get the in-core inode with the lock held exclusively to prevent
+        * others from looking at until we're done.
         */
+       error = xfs_iget(mp, tp, ino, XFS_IGET_CREATE, XFS_ILOCK_EXCL, &ip);
+       if (error)
+               return error;
+
+       ASSERT(ip != NULL);
        xfs_trans_ijoin(tp, ip, 0);
-       xfs_trans_log_inode(tp, ip, flags);
+       xfs_inode_init(tp, args, ip);
 
        /* now that we have an i_mode we can setup the inode structure */
        xfs_setup_inode(ip);