goto out;
 }
 
-static int gfs2_write_lock(struct inode *inode)
-{
-       struct gfs2_inode *ip = GFS2_I(inode);
-       struct gfs2_sbd *sdp = GFS2_SB(inode);
-       int error;
-
-       gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ip->i_gh);
-       error = gfs2_glock_nq(&ip->i_gh);
-       if (error)
-               goto out_uninit;
-       if (&ip->i_inode == sdp->sd_rindex) {
-               struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
-
-               error = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE,
-                                          GL_NOCACHE, &m_ip->i_gh);
-               if (error)
-                       goto out_unlock;
-       }
-       return 0;
-
-out_unlock:
-       gfs2_glock_dq(&ip->i_gh);
-out_uninit:
-       gfs2_holder_uninit(&ip->i_gh);
-       return error;
-}
-
-static void gfs2_write_unlock(struct inode *inode)
-{
-       struct gfs2_inode *ip = GFS2_I(inode);
-       struct gfs2_sbd *sdp = GFS2_SB(inode);
-
-       if (&ip->i_inode == sdp->sd_rindex) {
-               struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
-
-               gfs2_glock_dq_uninit(&m_ip->i_gh);
-       }
-       gfs2_glock_dq_uninit(&ip->i_gh);
-}
-
 static int gfs2_iomap_page_prepare(struct inode *inode, loff_t pos,
                                   unsigned len)
 {
        return ret;
 }
 
-static inline bool gfs2_iomap_need_write_lock(unsigned flags)
-{
-       return (flags & IOMAP_WRITE) && !(flags & IOMAP_DIRECT);
-}
-
 static int gfs2_iomap_begin(struct inode *inode, loff_t pos, loff_t length,
                            unsigned flags, struct iomap *iomap,
                            struct iomap *srcmap)
                iomap->flags |= IOMAP_F_BUFFER_HEAD;
 
        trace_gfs2_iomap_start(ip, pos, length, flags);
-       if (gfs2_iomap_need_write_lock(flags)) {
-               ret = gfs2_write_lock(inode);
-               if (ret)
-                       goto out;
-       }
-
        ret = __gfs2_iomap_get(inode, pos, length, flags, iomap, &mp);
        if (ret)
                goto out_unlock;
        ret = gfs2_iomap_begin_write(inode, pos, length, flags, iomap, &mp);
 
 out_unlock:
-       if (ret && gfs2_iomap_need_write_lock(flags))
-               gfs2_write_unlock(inode);
        release_metapath(&mp);
-out:
        trace_gfs2_iomap_end(ip, iomap, ret);
        return ret;
 }
        }
 
        if (unlikely(!written))
-               goto out_unlock;
+               return 0;
 
        if (iomap->flags & IOMAP_F_SIZE_CHANGED)
                mark_inode_dirty(inode);
        set_bit(GLF_DIRTY, &ip->i_gl->gl_flags);
-
-out_unlock:
-       if (gfs2_iomap_need_write_lock(flags))
-               gfs2_write_unlock(inode);
        return 0;
 }
 
 
 {
        struct file *file = iocb->ki_filp;
        struct inode *inode = file_inode(file);
+       struct gfs2_inode *ip = GFS2_I(inode);
+       struct gfs2_sbd *sdp = GFS2_SB(inode);
        ssize_t ret;
 
+       gfs2_holder_init(ip->i_gl, LM_ST_EXCLUSIVE, 0, &ip->i_gh);
+       ret = gfs2_glock_nq(&ip->i_gh);
+       if (ret)
+               goto out_uninit;
+
+       if (inode == sdp->sd_rindex) {
+               struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
+
+               ret = gfs2_glock_nq_init(m_ip->i_gl, LM_ST_EXCLUSIVE,
+                                        GL_NOCACHE, &m_ip->i_gh);
+               if (ret)
+                       goto out_unlock;
+       }
+
        current->backing_dev_info = inode_to_bdi(inode);
        ret = iomap_file_buffered_write(iocb, from, &gfs2_iomap_ops);
        current->backing_dev_info = NULL;
        if (ret > 0)
                iocb->ki_pos += ret;
+
+       if (inode == sdp->sd_rindex) {
+               struct gfs2_inode *m_ip = GFS2_I(sdp->sd_statfs_inode);
+
+               gfs2_glock_dq_uninit(&m_ip->i_gh);
+       }
+
+out_unlock:
+       gfs2_glock_dq(&ip->i_gh);
+out_uninit:
+       gfs2_holder_uninit(&ip->i_gh);
        return ret;
 }