Received: by 2002:a5b:505:0:0:0:0:0 with SMTP id o5csp5486119ybp; Tue, 8 Oct 2019 03:42:41 -0700 (PDT) X-Google-Smtp-Source: APXvYqxDc/jp9vJmEFiOzPLMt/pXuU//7UR17MI7Oyp2YhhJ+xZliHV+Xcf2JGetZSPPSdUiNh/b X-Received: by 2002:aa7:d816:: with SMTP id v22mr21140270edq.28.1570531361167; Tue, 08 Oct 2019 03:42:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570531361; cv=none; d=google.com; s=arc-20160816; b=bWOHWGqCZ+zUyYslbwopCatKWPeROpVbhtxSmmTTHBtabpRrlrmbfGkNuw5IhbKWdI vLXmr1cmD/BT2bOstKkOQjAyrKamMUtX4oSpLy1jn7I2dhhC/bYSF6lU9zLC9TMFhZ+d LBf3u7iwx87BZRFovWCB3fc3jC1bHeNGrB0ezgj040zwx17nkKfxriDsaK5MT0S1ifc4 /6LvC6KJt3o21RiHgCRe9iUc6G0FEojhZ/C5zcYGtt0u4Vxkji0b5ZDwsIA9aZv0KSJ7 qxbXF2fbQp2HgXq/1oozGaSSvP3/QmUldTOObaYjdTL1GKimWWMISm9B1ptWt2hOFjXV k13Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=VjWcNmGcT/uq4MeZ4cp42rzvIp0ImN+ZxNvhANVRBE8=; b=WjD9XMDPfdsCkntddMbxiz8ZocgngRbfb1a38m0KytTcKL3r9rqzPbw1e4VLws6Poh xKw6hmY2T++Nbtj9ZjdS0hfSLQalgA5F1xAgJEpURri8jvWzG91YSedpQVCgv2Db7Aox aXrMnwJTfU/pvZxwSEzQcN+v9pMDr97xobzeFExNKssrC1pT1k0lehrbBmJdb4EcuFWP P+dQbXoQA+s5fYhNOhYgpFesS+PVtJkymsxHsBG3zz5WwxlHaqLNtp2d6q2aJGc0n4ih vQ64hOdqBQD4F8q6Bfu3m8dMQa7kqyQBUXKDqIePRs17QROWATML7Vg8SNIKhFfI0F5Y qM+A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f6si8792296ejx.293.2019.10.08.03.42.15; Tue, 08 Oct 2019 03:42:41 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-ext4-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-ext4-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730358AbfJHKmN (ORCPT + 99 others); Tue, 8 Oct 2019 06:42:13 -0400 Received: from mx2.suse.de ([195.135.220.15]:42794 "EHLO mx1.suse.de" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729876AbfJHKmM (ORCPT ); Tue, 8 Oct 2019 06:42:12 -0400 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 64D21AF0B; Tue, 8 Oct 2019 10:42:10 +0000 (UTC) Received: by quack2.suse.cz (Postfix, from userid 1000) id CAA9A1E4827; Tue, 8 Oct 2019 12:42:09 +0200 (CEST) Date: Tue, 8 Oct 2019 12:42:09 +0200 From: Jan Kara To: Matthew Bobrowski Cc: tytso@mit.edu, jack@suse.cz, adilger.kernel@dilger.ca, linux-ext4@vger.kernel.org, linux-fsdevel@vger.kernel.org, hch@infradead.org, david@fromorbit.com, darrick.wong@oracle.com Subject: Re: [PATCH v4 3/8] ext4: introduce new callback for IOMAP_REPORT operations Message-ID: <20191008104209.GF5078@quack2.suse.cz> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-ext4-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-ext4@vger.kernel.org On Thu 03-10-19 21:33:45, Matthew Bobrowski wrote: > As part of ext4_iomap_begin() cleanups and port across direct I/O path > to make use of iomap infrastructure, we split IOMAP_REPORT operations > into a separate ->iomap_begin() handler. > > Signed-off-by: Matthew Bobrowski The patch looks good to me. You can add: Reviewed-by: Jan Kara It would just need small adjustments if you change patch 1 as I suggested: > +static u16 ext4_iomap_check_delalloc(struct inode *inode, > + struct ext4_map_blocks *map) > +{ > + struct extent_status es; > + ext4_lblk_t end = map->m_lblk + map->m_len - 1; > + > + ext4_es_find_extent_range(inode, &ext4_es_is_delayed, map->m_lblk, > + end, &es); > + > + /* Entire range is a hole */ > + if (!es.es_len || es.es_lblk > end) > + return IOMAP_HOLE; > + if (es.es_lblk <= map->m_lblk) { > + ext4_lblk_t offset = 0; > + > + if (es.es_lblk < map->m_lblk) > + offset = map->m_lblk - es.es_lblk; > + map->m_lblk = es.es_lblk + offset; > + map->m_len = es.es_len - offset; > + return IOMAP_DELALLOC; > + } > + > + /* Range starts with a hole */ > + map->m_len = es.es_lblk - map->m_lblk; > + return IOMAP_HOLE; > +} This function would then be IMO better off to directly update 'iomap' as needed after ext4_set_iomap() sets hole there. Honza > + > +static int ext4_iomap_begin_report(struct inode *inode, loff_t offset, > + loff_t length, unsigned flags, > + struct iomap *iomap) > +{ > + int ret; > + u16 type = 0; > + struct ext4_map_blocks map; > + u8 blkbits = inode->i_blkbits; > + unsigned long first_block, last_block; > + > + if ((offset >> blkbits) > EXT4_MAX_LOGICAL_BLOCK) > + return -EINVAL; > + first_block = offset >> blkbits; > + last_block = min_t(loff_t, (offset + length - 1) >> blkbits, > + EXT4_MAX_LOGICAL_BLOCK); > + > + if (ext4_has_inline_data(inode)) { > + ret = ext4_inline_data_iomap(inode, iomap); > + if (ret != -EAGAIN) { > + if (ret == 0 && offset >= iomap->length) > + ret = -ENOENT; > + return ret; > + } > + } > + > + map.m_lblk = first_block; > + map.m_len = last_block = first_block + 1; > + ret = ext4_map_blocks(NULL, inode, &map, 0); > + if (ret < 0) > + return ret; > + if (ret == 0) > + type = ext4_iomap_check_delalloc(inode, &map); > + return ext4_set_iomap(inode, iomap, type, first_block, &map); > +} > + > +const struct iomap_ops ext4_iomap_report_ops = { > + .iomap_begin = ext4_iomap_begin_report, > +}; > + > static int ext4_iomap_alloc(struct inode *inode, > unsigned flags, > unsigned long first_block, > @@ -3498,12 +3564,10 @@ static int ext4_iomap_alloc(struct inode *inode, > static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, > unsigned flags, struct iomap *iomap) > { > - u16 type = 0; > - unsigned int blkbits = inode->i_blkbits; > - unsigned long first_block, last_block; > - struct ext4_map_blocks map; > - bool delalloc = false; > int ret; > + struct ext4_map_blocks map; > + u8 blkbits = inode->i_blkbits; > + unsigned long first_block, last_block; > > if ((offset >> blkbits) > EXT4_MAX_LOGICAL_BLOCK) > return -EINVAL; > @@ -3511,64 +3575,21 @@ static int ext4_iomap_begin(struct inode *inode, loff_t offset, loff_t length, > last_block = min_t(loff_t, (offset + length - 1) >> blkbits, > EXT4_MAX_LOGICAL_BLOCK); > > - if (flags & IOMAP_REPORT) { > - if (ext4_has_inline_data(inode)) { > - ret = ext4_inline_data_iomap(inode, iomap); > - if (ret != -EAGAIN) { > - if (ret == 0 && offset >= iomap->length) > - ret = -ENOENT; > - return ret; > - } > - } > - } else { > - if (WARN_ON_ONCE(ext4_has_inline_data(inode))) > - return -ERANGE; > - } > + if (WARN_ON_ONCE(ext4_has_inline_data(inode))) > + return -ERANGE; > > map.m_lblk = first_block; > map.m_len = last_block - first_block + 1; > > - if (flags & IOMAP_REPORT) { > - ret = ext4_map_blocks(NULL, inode, &map, 0); > - if (ret < 0) > - return ret; > - > - if (ret == 0) { > - ext4_lblk_t end = map.m_lblk + map.m_len - 1; > - struct extent_status es; > - > - ext4_es_find_extent_range(inode, &ext4_es_is_delayed, > - map.m_lblk, end, &es); > - > - if (!es.es_len || es.es_lblk > end) { > - /* entire range is a hole */ > - } else if (es.es_lblk > map.m_lblk) { > - /* range starts with a hole */ > - map.m_len = es.es_lblk - map.m_lblk; > - } else { > - ext4_lblk_t offs = 0; > - > - if (es.es_lblk < map.m_lblk) > - offs = map.m_lblk - es.es_lblk; > - map.m_lblk = es.es_lblk + offs; > - map.m_len = es.es_len - offs; > - delalloc = true; > - } > - } > - } else if (flags & IOMAP_WRITE) { > + if (flags & IOMAP_WRITE) > ret = ext4_iomap_alloc(inode, flags, first_block, &map); > - } else { > + else > ret = ext4_map_blocks(NULL, inode, &map, 0); > - if (ret < 0) > - return ret; > - } > > if (ret < 0) > return ret; > - > - if (!ret) > - type = delalloc ? IOMAP_DELALLOC : IOMAP_HOLE; > - return ext4_set_iomap(inode, iomap, type, first_block, &map); > + return ext4_set_iomap(inode, iomap, ret ? 0 : IOMAP_HOLE, first_block, > + &map); > } > > static int ext4_iomap_end(struct inode *inode, loff_t offset, loff_t length, > -- > 2.20.1 > -- Jan Kara SUSE Labs, CR