Re: [PATCH 3/4 RESEND] btrfs: open code btrfs_set_prop in inherit_prop

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.jain@xxxxxxxxxx>
> > ---
> >  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.



[Index of Archives]     [Linux Filesystem Development]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux