iomap->addr = be64_to_cpu(*ptr) << inode->i_blkbits;
        iomap->length = len << inode->i_blkbits;
        iomap->type = IOMAP_MAPPED;
--      iomap->flags = IOMAP_F_MERGED;
++      iomap->flags |= IOMAP_F_MERGED;
        if (eob)
                iomap->flags |= IOMAP_F_GFS2_BOUNDARY;
  
        struct metapath mp = { .mp_aheight = 1, };
        int ret;
  
++      iomap->flags |= IOMAP_F_BUFFER_HEAD;
++
        trace_gfs2_iomap_start(ip, pos, length, flags);
 -      if (flags & IOMAP_WRITE) {
 -              ret = gfs2_iomap_get(inode, pos, length, flags, iomap, &mp);
 -              if (!ret && iomap->type == IOMAP_HOLE)
 -                      ret = gfs2_iomap_alloc(inode, iomap, flags, &mp);
 -              release_metapath(&mp);
 +      if ((flags & IOMAP_WRITE) && !(flags & IOMAP_DIRECT)) {
 +              ret = gfs2_iomap_begin_write(inode, pos, length, flags, iomap);
        } else {
                ret = gfs2_iomap_get(inode, pos, length, flags, iomap, &mp);
                release_metapath(&mp);