credits = ocfs2_calc_symlink_credits(sb);
 
-       handle = ocfs2_alloc_handle(osb);
-       if (handle == NULL) {
-               status = -ENOMEM;
-               mlog_errno(status);
-               goto bail;
-       }
-
        /* lock the parent directory */
-       status = ocfs2_meta_lock(dir, handle, &parent_fe_bh, 1);
+       status = ocfs2_meta_lock(dir, NULL, &parent_fe_bh, 1);
        if (status < 0) {
                if (status != -ENOENT)
                        mlog_errno(status);
-               goto bail;
+               return status;
        }
 
        dirfe = (struct ocfs2_dinode *) parent_fe_bh->b_data;
                goto bail;
        }
 
+       handle = ocfs2_alloc_handle(osb);
+       if (handle == NULL) {
+               status = -ENOMEM;
+               mlog_errno(status);
+               goto bail;
+       }
+
        status = ocfs2_reserve_new_inode(osb, handle, &inode_ac);
        if (status < 0) {
                if (status != -ENOSPC)
 bail:
        if (handle)
                ocfs2_commit_trans(handle);
+
+       ocfs2_meta_unlock(dir, 1);
+
        if (new_fe_bh)
                brelse(new_fe_bh);
        if (parent_fe_bh)