From: Dave Chinner <david@fromorbit.com>
To: John Garry <john.g.garry@oracle.com>
Cc: djwong@kernel.org, hch@lst.de, viro@zeniv.linux.org.uk,
brauner@kernel.org, jack@suse.cz, chandan.babu@oracle.com,
willy@infradead.org, axboe@kernel.dk, martin.petersen@oracle.com,
linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org,
tytso@mit.edu, jbongio@google.com, ojaswin@linux.ibm.com,
ritesh.list@gmail.com, mcgrof@kernel.org, p.raghav@samsung.com,
linux-xfs@vger.kernel.org, catherine.hoang@oracle.com
Subject: Re: [PATCH v3 08/21] xfs: Introduce FORCEALIGN inode flag
Date: Wed, 1 May 2024 09:22:45 +1000 [thread overview]
Message-ID: <ZjF9RVetf+Xt70BX@dread.disaster.area> (raw)
In-Reply-To: <20240429174746.2132161-9-john.g.garry@oracle.com>
On Mon, Apr 29, 2024 at 05:47:33PM +0000, John Garry wrote:
> From: "Darrick J. Wong" <djwong@kernel.org>
>
> Add a new inode flag to require that all file data extent mappings must
> be aligned (both the file offset range and the allocated space itself)
> to the extent size hint. Having a separate COW extent size hint is no
> longer allowed.
>
> The goal here is to enable sysadmins and users to mandate that all space
> mappings in a file must have a startoff/blockcount that are aligned to
> (say) a 2MB alignment and that the startblock/blockcount will follow the
> same alignment.
>
> jpg: Enforce extsize is a power-of-2 and aligned with afgsize + stripe
> alignment for forcealign
> Signed-off-by: "Darrick J. Wong" <djwong@kernel.org>
> Co-developed-by: John Garry <john.g.garry@oracle.com>
> Signed-off-by: John Garry <john.g.garry@oracle.com>
> ---
....
> @@ -783,3 +791,45 @@ xfs_inode_validate_cowextsize(
>
> return NULL;
> }
> +
> +/* Validate the forcealign inode flag */
> +xfs_failaddr_t
> +xfs_inode_validate_forcealign(
> + struct xfs_mount *mp,
> + uint16_t mode,
umode_t mode,
> + uint16_t flags,
> + uint32_t extsize,
> + uint32_t cowextsize)
extent sizes are xfs_extlen_t types.
> +{
> + /* superblock rocompat feature flag */
> + if (!xfs_has_forcealign(mp))
> + return __this_address;
> +
> + /* Only regular files and directories */
> + if (!S_ISDIR(mode) && !S_ISREG(mode))
> + return __this_address;
> +
> + /* Doesn't apply to realtime files */
> + if (flags & XFS_DIFLAG_REALTIME)
> + return __this_address;
Why not? A rt device with an extsize of 1 fsb could make use of
forced alignment just like the data device to allow larger atomic
writes to be done. I mean, just because we haven't written the code
to do this yet doesn't mean it is an illegal on-disk format state.
> + /* Requires a non-zero power-of-2 extent size hint */
> + if (extsize == 0 || !is_power_of_2(extsize) ||
> + (mp->m_sb.sb_agblocks % extsize))
> + return __this_address;
Please do these as indiviual checks with their own fail address.
That way we can tell which check failed from the console output.
Also, the agblocks check is already split out below, so it's being
checked twice...
Also, why does force-align require a power-of-2 extent size? Why
does it require the extent size to be an exact divisor of the AG
size? Aren't these atomic write alignment restrictions? i.e.
shouldn't these only be enforced when the atomic writes inode flag
is set?
> + /* Requires agsize be a multiple of extsize */
> + if (mp->m_sb.sb_agblocks % extsize)
> + return __this_address;
> +
> + /* Requires stripe unit+width (if set) be a multiple of extsize */
> + if ((mp->m_dalign && (mp->m_dalign % extsize)) ||
> + (mp->m_swidth && (mp->m_swidth % extsize)))
> + return __this_address;
Again, this is an atomic write constraint, isn't it?
> + /* Requires no cow extent size hint */
> + if (cowextsize != 0)
> + return __this_address;
What if it's a reflinked file?
.....
> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index d0e2cec6210d..d1126509ceb9 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -1110,6 +1110,8 @@ xfs_flags2diflags2(
> di_flags2 |= XFS_DIFLAG2_DAX;
> if (xflags & FS_XFLAG_COWEXTSIZE)
> di_flags2 |= XFS_DIFLAG2_COWEXTSIZE;
> + if (xflags & FS_XFLAG_FORCEALIGN)
> + di_flags2 |= XFS_DIFLAG2_FORCEALIGN;
>
> return di_flags2;
> }
> @@ -1146,6 +1148,22 @@ xfs_ioctl_setattr_xflags(
> if (i_flags2 && !xfs_has_v3inodes(mp))
> return -EINVAL;
>
> + /*
> + * Force-align requires a nonzero extent size hint and a zero cow
> + * extent size hint. It doesn't apply to realtime files.
> + */
> + if (fa->fsx_xflags & FS_XFLAG_FORCEALIGN) {
> + if (!xfs_has_forcealign(mp))
> + return -EINVAL;
> + if (fa->fsx_xflags & FS_XFLAG_COWEXTSIZE)
> + return -EINVAL;
> + if (!(fa->fsx_xflags & (FS_XFLAG_EXTSIZE |
> + FS_XFLAG_EXTSZINHERIT)))
> + return -EINVAL;
> + if (fa->fsx_xflags & FS_XFLAG_REALTIME)
> + return -EINVAL;
> + }
What about if the file already has shared extents on it (i.e.
reflinked or deduped?)
Also, why is this getting checked here instead of in
xfs_ioctl_setattr_check_extsize()?
> @@ -1263,7 +1283,19 @@ xfs_ioctl_setattr_check_extsize(
> failaddr = xfs_inode_validate_extsize(ip->i_mount,
> XFS_B_TO_FSB(mp, fa->fsx_extsize),
> VFS_I(ip)->i_mode, new_diflags);
> - return failaddr != NULL ? -EINVAL : 0;
> + if (failaddr)
> + return -EINVAL;
> +
> + if (new_diflags2 & XFS_DIFLAG2_FORCEALIGN) {
> + failaddr = xfs_inode_validate_forcealign(ip->i_mount,
> + VFS_I(ip)->i_mode, new_diflags,
> + XFS_B_TO_FSB(mp, fa->fsx_extsize),
> + XFS_B_TO_FSB(mp, fa->fsx_cowextsize));
> + if (failaddr)
> + return -EINVAL;
> + }
Oh, it's because you're trying to use on-disk format validation
routines for user API validation. That, IMO, is a bad idea because
the on-disk format and kernel/user APIs should not be tied
together as they have different constraints and error conditions.
That also explains why xfs_inode_validate_forcealign() doesn't just
get passed the inode to validate - it's because you want to pass
information from the user API to it. This results in sub-optimal
code for both on-disk format validation and user API validation.
Can you please separate these and put all the force align user API
validation checks in the one function?
-Dave.
--
Dave Chinner
david@fromorbit.com
next prev parent reply other threads:[~2024-04-30 23:22 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-29 17:47 [PATCH v3 00/21] block atomic writes for XFS John Garry
2024-04-29 17:47 ` [PATCH v3 01/21] fs: Add generic_atomic_write_valid_size() John Garry
2024-04-29 17:47 ` [PATCH v3 02/21] xfs: only allow minlen allocations when near ENOSPC John Garry
2024-04-29 17:47 ` [PATCH v3 03/21] xfs: always tail align maxlen allocations John Garry
2024-04-29 17:47 ` [PATCH v3 04/21] xfs: simplify extent allocation alignment John Garry
2024-04-29 17:47 ` [PATCH v3 05/21] xfs: make EOF allocation simpler John Garry
2024-04-29 17:47 ` [PATCH v3 06/21] xfs: introduce forced allocation alignment John Garry
2024-04-29 17:47 ` [PATCH v3 07/21] fs: xfs: align args->minlen for " John Garry
2024-06-05 14:26 ` John Garry
2024-06-06 8:47 ` Dave Chinner
2024-06-06 16:22 ` John Garry
2024-06-07 6:04 ` John Garry
2024-04-29 17:47 ` [PATCH v3 08/21] xfs: Introduce FORCEALIGN inode flag John Garry
2024-04-30 23:22 ` Dave Chinner [this message]
2024-05-01 10:03 ` John Garry
2024-05-02 0:50 ` Dave Chinner
2024-05-02 7:56 ` John Garry
2024-06-12 2:10 ` Long Li
2024-06-12 6:55 ` John Garry
2024-06-12 15:43 ` Darrick J. Wong
2024-06-13 2:04 ` Long Li
2024-04-29 17:47 ` [PATCH v3 09/21] xfs: Do not free EOF blocks for forcealign John Garry
2024-04-30 22:54 ` Dave Chinner
2024-05-01 8:30 ` John Garry
2024-05-02 1:11 ` Dave Chinner
2024-05-02 8:55 ` John Garry
2024-04-29 17:47 ` [PATCH v3 10/21] xfs: Update xfs_is_falloc_aligned() mask " John Garry
2024-04-30 23:35 ` Dave Chinner
2024-05-01 10:48 ` John Garry
2024-05-01 23:45 ` Darrick J. Wong
2024-04-29 17:47 ` [PATCH RFC v3 11/21] xfs: Unmap blocks according to forcealign John Garry
2024-05-01 0:10 ` Dave Chinner
2024-05-01 10:54 ` John Garry
2024-06-06 9:50 ` John Garry
2024-04-29 17:47 ` [PATCH RFC v3 12/21] xfs: Only free full extents for forcealign John Garry
2024-05-01 0:53 ` Dave Chinner
2024-05-01 11:24 ` John Garry
2024-05-01 23:53 ` Darrick J. Wong
2024-05-02 3:12 ` Dave Chinner
2024-04-29 17:47 ` [PATCH v3 13/21] xfs: Enable file data forcealign feature John Garry
2024-04-29 17:47 ` [PATCH v3 14/21] iomap: Sub-extent zeroing John Garry
2024-05-01 1:07 ` Dave Chinner
2024-05-01 10:23 ` John Garry
2024-05-30 10:40 ` John Garry
2024-07-26 14:29 ` John Garry
2024-07-26 17:13 ` Christoph Hellwig
2024-07-29 17:02 ` John Garry
2024-08-22 20:35 ` Darrick J. Wong
2024-06-11 3:10 ` Long Li
2024-06-11 7:29 ` John Garry
2024-04-29 17:47 ` [PATCH v3 15/21] fs: xfs: " John Garry
2024-05-01 1:32 ` Dave Chinner
2024-05-01 11:36 ` John Garry
2024-05-02 1:26 ` Dave Chinner
2024-04-29 17:47 ` [PATCH v3 16/21] fs: Add FS_XFLAG_ATOMICWRITES flag John Garry
2024-04-29 17:47 ` [PATCH v3 17/21] iomap: Atomic write support John Garry
2024-05-01 1:47 ` Dave Chinner
2024-05-01 11:08 ` John Garry
2024-05-02 1:43 ` Dave Chinner
2024-05-02 9:12 ` John Garry
2024-04-29 17:47 ` [PATCH v3 18/21] xfs: Support FS_XFLAG_ATOMICWRITES for forcealign John Garry
2024-04-29 17:47 ` [PATCH v3 19/21] xfs: Support atomic write for statx John Garry
2024-04-29 17:47 ` [PATCH v3 20/21] xfs: Validate atomic writes John Garry
2024-04-29 17:47 ` [PATCH v3 21/21] xfs: Support setting FMODE_CAN_ATOMIC_WRITE John Garry
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZjF9RVetf+Xt70BX@dread.disaster.area \
--to=david@fromorbit.com \
--cc=axboe@kernel.dk \
--cc=brauner@kernel.org \
--cc=catherine.hoang@oracle.com \
--cc=chandan.babu@oracle.com \
--cc=djwong@kernel.org \
--cc=hch@lst.de \
--cc=jack@suse.cz \
--cc=jbongio@google.com \
--cc=john.g.garry@oracle.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-xfs@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=mcgrof@kernel.org \
--cc=ojaswin@linux.ibm.com \
--cc=p.raghav@samsung.com \
--cc=ritesh.list@gmail.com \
--cc=tytso@mit.edu \
--cc=viro@zeniv.linux.org.uk \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome