error = gfs2_glock_nq_init(dip->i_gl, LM_ST_EXCLUSIVE, 0, ghs);
        if (error)
                goto fail;
+       gfs2_holder_mark_uninitialized(ghs + 1);
 
        error = create_ok(dip, name, mode);
        if (error)
 fail_gunlock2:
        if (io_gl)
                clear_bit(GLF_INODE_CREATING, &io_gl->gl_flags);
-       gfs2_glock_dq_uninit(ghs + 1);
 fail_free_inode:
        if (ip->i_gl)
                gfs2_glock_put(ip->i_gl);
                        &GFS2_I(inode)->i_flags);
                iput(inode);
        }
+       if (gfs2_holder_initialized(ghs + 1))
+               gfs2_glock_dq_uninit(ghs + 1);
 fail:
        return error;
 }
 
        if (inode->i_nlink || (sb->s_flags & MS_RDONLY))
                goto out;
 
+       if (test_bit(GIF_ALLOC_FAILED, &ip->i_flags)) {
+               BUG_ON(!gfs2_glock_is_locked_by_me(ip->i_gl));
+               gfs2_holder_mark_uninitialized(&gh);
+               goto alloc_failed;
+       }
+
        /* Must not read inode block until block type has been verified */
        error = gfs2_glock_nq_init(ip->i_gl, LM_ST_EXCLUSIVE, GL_SKIP, &gh);
        if (unlikely(error)) {
                goto out;
        }
 
-       if (!test_bit(GIF_ALLOC_FAILED, &ip->i_flags)) {
-               error = gfs2_check_blk_type(sdp, ip->i_no_addr, GFS2_BLKST_UNLINKED);
-               if (error)
-                       goto out_truncate;
-       }
+       error = gfs2_check_blk_type(sdp, ip->i_no_addr, GFS2_BLKST_UNLINKED);
+       if (error)
+               goto out_truncate;
 
        if (test_bit(GIF_INVALID, &ip->i_flags)) {
                error = gfs2_inode_refresh(ip);
                        goto out_truncate;
        }
 
+alloc_failed:
        if (gfs2_holder_initialized(&ip->i_iopen_gh) &&
            test_bit(HIF_HOLDER, &ip->i_iopen_gh.gh_iflags)) {
                ip->i_iopen_gh.gh_flags |= GL_NOCACHE;
                }
                gfs2_holder_uninit(&ip->i_iopen_gh);
        }
-       gfs2_glock_dq_uninit(&gh);
+       if (gfs2_holder_initialized(&gh))
+               gfs2_glock_dq_uninit(&gh);
        if (error && error != GLR_TRYFAILED && error != -EROFS)
                fs_warn(sdp, "gfs2_evict_inode: %d\n", error);
 out: