On Tue, Apr 02, 2019 at 04:35:12PM +0300, Nikolay Borisov wrote: > On 2.04.19 г. 13:07 ч., Anand Jain wrote: > > When an inode inherits property from its parent, we call btrfs_set_prop(). > > btrfs_set_prop() does an elaborate checks, which is not required in the > > context of inheriting a property. Instead just open-code only the required > > items from btrfs_set_prop() and then call btrfs_setxattr() directly. So > > now the only user of btrfs_set_prop() is gone, (except for the wraper > > function btrfs_set_prop_trans()). > > > > Signed-off-by: Anand Jain <anand.j...@oracle.com> > > --- > > fs/btrfs/props.c | 27 +++++++++++++++++++++------ > > 1 file changed, 21 insertions(+), 6 deletions(-) > > > > diff --git a/fs/btrfs/props.c b/fs/btrfs/props.c > > index 72a06c4d3c70..fb84e76f3b1d 100644 > > --- a/fs/btrfs/props.c > > +++ b/fs/btrfs/props.c > > @@ -367,20 +367,35 @@ static int inherit_props(struct btrfs_trans_handle > > *trans, > > if (!value) > > continue; > > > > + /* may be removed */ > > This comment brings no value. Either explain *why* it can be removed or > remove it altogether. > > > + ret = h->validate(value, strlen(value)); > > + if (ret) > > + continue; > > + > > num_bytes = btrfs_calc_trans_metadata_size(fs_info, 1); > > ret = btrfs_block_rsv_add(root, trans->block_rsv, > > num_bytes, BTRFS_RESERVE_NO_FLUSH); > > if (ret) > > - goto out; > > - ret = btrfs_set_prop(trans, inode, h->xattr_name, value, > > + return ret; > > + > > + ret = btrfs_setxattr(trans, inode, h->xattr_name, value, > > strlen(value), 0); > > + if (!ret) { > > + ret = h->apply(inode, value, strlen(value)); > > + if (ret) > > + btrfs_setxattr(trans, inode, h->xattr_name, > > + NULL, 0, 0); > > + else > > + set_bit(BTRFS_INODE_HAS_PROPS, > > + &BTRFS_I(inode)->runtime_flags); > > + } > > + > > btrfs_block_rsv_release(fs_info, trans->block_rsv, num_bytes); > > (not related to this patch) but should the reservation be released after > setxattr is called, even if it succeeds, since we need to hold it until > the reservation is committed. E.g. if we have to inherit 2 props then in > the first iteration of the loop we reserve space, we call btrfs_Setxattr > with enough reserved space, then in the 2nd reservation we need another > reservation on top of the previous one, no ?
I think that's the problem Josef's patches were supposed to fix.