Received: by 2002:ab2:6816:0:b0:1f9:5764:f03e with SMTP id t22csp1096838lqo; Fri, 17 May 2024 10:29:41 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCV9Jzp9saCtDdxNa0Cq6PnuMXHLaU0LfRu416q6wagd2Im3PIa/alGVeyt6Rmcm+nFZoBjoVgg28ZGYnqiqFpoL3GPUNutNde+nzI+qhQ== X-Google-Smtp-Source: AGHT+IEBgb7+8zAFJaUW1Md3n25K1xZEeZG2ywcLsjmtSc6+LJfdWNxuNDQNWF5T0ijv/z+2/Y6V X-Received: by 2002:a05:6214:2c03:b0:69b:683b:8686 with SMTP id 6a1803df08f44-6a168147e59mr235353956d6.3.1715966981128; Fri, 17 May 2024 10:29:41 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1715966981; cv=pass; d=google.com; s=arc-20160816; b=OfgbMWMmwhpxjN1XuYpaJ/0tTmyF6N2LhhZqPEnam5oSTTLnOIE8xNdgrrqvtaonup giR0quzSCvOldoEz3dufLInMezIKNtE3EV6n3m00yfpy5F0rLyMg+crDIEAIENJhzJxx qUJIoHomz7AE6akR3c6fuUVdPuu+KzP8SxidnVA3Ao7hJg/fVpzr/PSF5n/sdygTtgVB /0mJmyJOxMPUTjv1O3Dc2FvvkitkGp/r+aXJY2J8pDZ/69fLjycyKh54E5oTjN9vB6sY L+R5kv4RjhTPfloswL7zIthLvste4TvAnfiTUjkzqawZiCku+4Gof0Lhx/o8JBWMtbd4 Y5AQ== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=uFMZU7iCMflywhAEyOKFw2ePXlfv7jkE6f2vd3u3d/Y=; fh=6WwiASeLMxbLfANc8gOKq1jt9KCR81tAWQlpKslJwx4=; b=gPS2L7prRE1R7cpxeg3yIav/SlA1azGWzYO6XI9D/YmnqxMswDA46+7ax5vGCB1ZJw xsiX+4gasZKdom1upYYujSMzMHPL57HkvN9KbJBWoQEcH7vO4Yhbp5T8AtHtLo+wbQva jxiW6useB0k+qkFD2rWWkaf2h4tElifj4Q02nXRvlylu51Hvyfm/PT+DvHEWmpOkXv5D h/iu4441nQpgfoAYsBOVjFivnlQwHt2v/o1cPxlelQWBtYuSEbX/PBkDVhBPGr7VZ3uD +UyOolb5paHdl1WIp06cYos81pm9JlHHzn8dDBYUWKdR8C4sVh1JC/D2OB0xfDZY/UyO a9qg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=UkHlWu8o; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-182414-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-182414-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [2604:1380:45d1:ec00::1]) by mx.google.com with ESMTPS id 6a1803df08f44-6a15f2b689fsi195159916d6.369.2024.05.17.10.29.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 17 May 2024 10:29:41 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-182414-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) client-ip=2604:1380:45d1:ec00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=UkHlWu8o; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-182414-linux.lists.archive=gmail.com@vger.kernel.org designates 2604:1380:45d1:ec00::1 as permitted sender) smtp.mailfrom="linux-kernel+bounces-182414-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id D15D71C20D50 for ; Fri, 17 May 2024 17:29:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 35A0A13DDD7; Fri, 17 May 2024 17:29:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="UkHlWu8o" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 423AB13DDAE; Fri, 17 May 2024 17:29:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715966967; cv=none; b=Mv5BLHX1JZhZQHR/HTS4N3h85rM1tfjDewS9d48hYDIWEFVwY6xxAN7WVvytJwmSJuG0DMBqAQmTXh/KpHr1ZJ+N+WDtM8JhpRBV+w37Ag5YeshBRiw1W9b5UkhS0IRXrniiKNrd1lFm32cPDPpc8VCab+mlPFNzs4BUu33LumM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715966967; c=relaxed/simple; bh=57KFeH0CJFk0IzHj81Sv7aQwV6ykCtUoa0gInran8lg=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=h2NyictQVcLIwJG4RE49Io214+eBSVgH4OURCMTTaPWp6zlN3Pum11E0zk5+uOereqh3YeXOLzDbtM4ZbfHMPZ7y9aPJOEbBqIouh+6mVt1TLSMu8Rse4pFzEW6uv1NCvPbmtYwdI26osa3jgBZMd4QkvMb/XPRmyN3U7UscIhs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=UkHlWu8o; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id BE023C32781; Fri, 17 May 2024 17:29:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1715966965; bh=57KFeH0CJFk0IzHj81Sv7aQwV6ykCtUoa0gInran8lg=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=UkHlWu8oa+Nx+is/m+EUrtWpqkEy/6Sx4md8tGvZ2JT9k8MbnP1W5uEo6/LZyeBbW OI7l0NP0HpHJACnEW4EsYEjMrl3bBNMod8OWb69XZDcL8I4r1uNjisGXq7IyS6HUYJ U1gJARxBb45EbET8F6aekp0eMsmRuLL3aEBUaUU9Ik0/GRWn6vy7CXPMetq+u2Fms4 RjSX0Twoy77rm0d9/nALnfF4giaddzQIycA4oGkXSAiazIO1enn15srMcxP8iZB3Uw r+5JVE6lI9dy/uQU+7zfUaKFAdvb3eOWZCWxszK7yC+Rww4ng+v73ZrJOWse609zyz N9wQxlHnunqaQ== Date: Fri, 17 May 2024 10:29:25 -0700 From: "Darrick J. Wong" To: Zhang Yi Cc: linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-ext4@vger.kernel.org, hch@infradead.org, brauner@kernel.org, david@fromorbit.com, chandanbabu@kernel.org, jack@suse.cz, yi.zhang@huawei.com, chengzhihao1@huawei.com, yukuai3@huawei.com Subject: Re: [PATCH v3 1/3] iomap: pass blocksize to iomap_truncate_page() Message-ID: <20240517172925.GB360919@frogsfrogsfrogs> References: <20240517111355.233085-1-yi.zhang@huaweicloud.com> <20240517111355.233085-2-yi.zhang@huaweicloud.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20240517111355.233085-2-yi.zhang@huaweicloud.com> On Fri, May 17, 2024 at 07:13:53PM +0800, Zhang Yi wrote: > From: Zhang Yi > > iomap_truncate_page() always assumes the block size of the truncating > inode is i_blocksize(), this is not always true for some filesystems, > e.g. XFS does extent size alignment for realtime inodes. Drop this > assumption and pass the block size for zeroing into > iomap_truncate_page(), allow filesystems to indicate the correct block > size. > > Suggested-by: Dave Chinner > Signed-off-by: Zhang Yi > --- > fs/iomap/buffered-io.c | 13 +++++++++---- > fs/xfs/xfs_iomap.c | 3 ++- > include/linux/iomap.h | 4 ++-- > 3 files changed, 13 insertions(+), 7 deletions(-) > > diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c > index 0926d216a5af..a0a0ac2c659c 100644 > --- a/fs/iomap/buffered-io.c > +++ b/fs/iomap/buffered-io.c > @@ -17,6 +17,7 @@ > #include > #include > #include > +#include > #include "trace.h" > > #include "../internal.h" > @@ -1445,11 +1446,15 @@ iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, bool *did_zero, > EXPORT_SYMBOL_GPL(iomap_zero_range); > > int > -iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, > - const struct iomap_ops *ops) > +iomap_truncate_page(struct inode *inode, loff_t pos, unsigned int blocksize, > + bool *did_zero, const struct iomap_ops *ops) > { > - unsigned int blocksize = i_blocksize(inode); > - unsigned int off = pos & (blocksize - 1); > + unsigned int off; > + > + if (is_power_of_2(blocksize)) > + off = pos & (blocksize - 1); > + else > + div_u64_rem(pos, blocksize, &off); I wish this was a helper in math64.h somewhere. static inline u32 rem_u64(u64 dividend, u32 divisor) { if (likely(is_power_of_2(divisor))) return dividend & (divisor - 1); return dividend % divisor; } That way we skip the second division in div_u64_rem entirely, and the iomap/dax code becomes: unsigned int off = rem_u64(pos, blocksize); /* pos in block */ Otherwise this looks like a straightforward mechanical change to me. --D > > /* Block boundary? Nothing to do */ > if (!off) > diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c > index 2857ef1b0272..31ac07bb8425 100644 > --- a/fs/xfs/xfs_iomap.c > +++ b/fs/xfs/xfs_iomap.c > @@ -1467,10 +1467,11 @@ xfs_truncate_page( > bool *did_zero) > { > struct inode *inode = VFS_I(ip); > + unsigned int blocksize = i_blocksize(inode); > > if (IS_DAX(inode)) > return dax_truncate_page(inode, pos, did_zero, > &xfs_dax_write_iomap_ops); > - return iomap_truncate_page(inode, pos, did_zero, > + return iomap_truncate_page(inode, pos, blocksize, did_zero, > &xfs_buffered_write_iomap_ops); > } > diff --git a/include/linux/iomap.h b/include/linux/iomap.h > index 6fc1c858013d..d67bf86ec582 100644 > --- a/include/linux/iomap.h > +++ b/include/linux/iomap.h > @@ -273,8 +273,8 @@ int iomap_file_unshare(struct inode *inode, loff_t pos, loff_t len, > const struct iomap_ops *ops); > int iomap_zero_range(struct inode *inode, loff_t pos, loff_t len, > bool *did_zero, const struct iomap_ops *ops); > -int iomap_truncate_page(struct inode *inode, loff_t pos, bool *did_zero, > - const struct iomap_ops *ops); > +int iomap_truncate_page(struct inode *inode, loff_t pos, unsigned int blocksize, > + bool *did_zero, const struct iomap_ops *ops); > vm_fault_t iomap_page_mkwrite(struct vm_fault *vmf, > const struct iomap_ops *ops); > int iomap_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo, > -- > 2.39.2 > >