On Fri, Oct 02, 2020 at 03:36:14AM +0900, Naohiro Aota wrote: > NODATACOW implies overwriting the file data on a device, which is > impossible in sequential required zones. Disable NODATACOW globally with > mount option and per-file NODATACOW attribute by masking FS_NOCOW_FL. > > Reviewed-by: Johannes Thumshirn <jthumshirn@xxxxxxx> > Reviewed-by: Josef Bacik <josef@xxxxxxxxxxxxxx> > Signed-off-by: Naohiro Aota <naohiro.aota@xxxxxxx> > --- > fs/btrfs/ioctl.c | 3 +++ > fs/btrfs/zoned.c | 6 ++++++ > 2 files changed, 9 insertions(+) > > diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c > index ab408a23ba32..5d592da4e2ff 100644 > --- a/fs/btrfs/ioctl.c > +++ b/fs/btrfs/ioctl.c > @@ -91,6 +91,9 @@ struct btrfs_ioctl_send_args_32 { > static unsigned int btrfs_mask_fsflags_for_type(struct inode *inode, > unsigned int flags) > { > + if (btrfs_fs_incompat(btrfs_sb(inode->i_sb), ZONED)) > + flags &= ~FS_NOCOW_FL; > + This can't be inside the function, the 'type' here is for inode that does not know anything about zoned mode. The right place is after check_fsflags in btrfs_ioctl_setflags in a helper like: ret = check_fsflags_compatible(fs_info, flags)); if (ret) goto out_unlock; and check_fsflags_compatible checks for zoned mode and NOCOW and returns -EPERM, not silently unmasking it. > if (S_ISDIR(inode->i_mode)) > return flags; > else if (S_ISREG(inode->i_mode))