Re: [PATCH 38/63] xfs: cancel CoW reservations and clear inode reflink flag when freeing blocks

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

 



On Thu, Oct 06, 2016 at 12:44:33PM -0400, Brian Foster wrote:
> On Thu, Sep 29, 2016 at 08:09:46PM -0700, Darrick J. Wong wrote:
> > When we're freeing blocks (truncate, punch, etc.), clear all CoW
> > reservations in the range being freed.  If the file block count
> > drops to zero, also clear the inode reflink flag.
> > 
> > Signed-off-by: Darrick J. Wong <darrick.wong@xxxxxxxxxx>
> > ---
> >  fs/xfs/xfs_inode.c |   13 +++++++++++++
> >  1 file changed, 13 insertions(+)
> > 
> > 
> > diff --git a/fs/xfs/xfs_inode.c b/fs/xfs/xfs_inode.c
> > index 0c25a76..8c971fd 100644
> > --- a/fs/xfs/xfs_inode.c
> > +++ b/fs/xfs/xfs_inode.c
> > @@ -49,6 +49,7 @@
> >  #include "xfs_trans_priv.h"
> >  #include "xfs_log.h"
> >  #include "xfs_bmap_btree.h"
> > +#include "xfs_reflink.h"
> >  
> >  kmem_zone_t *xfs_inode_zone;
> >  
> > @@ -1586,6 +1587,18 @@ xfs_itruncate_extents(
> >  			goto out;
> >  	}
> >  
> > +	/* Remove all pending CoW reservations. */
> > +	error = xfs_reflink_cancel_cow_blocks(ip, &tp, first_unmap_block,
> > +			last_block);
> > +	if (error)
> > +		goto out;
> > +
> > +	/*
> > +	 * Clear the reflink flag if we truncated everything.
> > +	 */
> > +	if (ip->i_d.di_nblocks == 0 && xfs_is_reflink_inode(ip))
> > +		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
> > +
> 
> So this implies the reflink flag is more of an optimization than an
> accurate assessment of reflink state (e.g., we can have DIFLAG2_REFLINK
> w/o shared extents, but we should never have shared extents w/o the
> flag) because this wouldn't clear the flag on a partial truncate that
> happened to unmap all of the shared extents from the file.

Yes, not to mention that (bugs notwithstanding) all the CoW stuff
shuts off if the inode flag isn't set.

> That seems fine, I'll just note there's one small potential conflict
> ahead where we (dis)allow setting the realtime state based on the
> reflink flag.

Hmm.  You're right, if we're able to set the rt flag (i.e. data size is zero)
then we ought to just clear the reflink flag.

--D

> 
> Brian
> 
> >  	/*
> >  	 * Always re-log the inode so that our permanent transaction can keep
> >  	 * on rolling it forward in the log.
> > 
> > --
> > To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> > the body of a message to majordomo@xxxxxxxxxxxxxxx
> > More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux