xfs: reject per-inode dax flag on reflink filesystems
diff mbox series

Message ID c1ad993d-5330-88c3-b859-06e33dcd75d8@redhat.com
State New
Headers show
Series
  • xfs: reject per-inode dax flag on reflink filesystems
Related show

Commit Message

Eric Sandeen Oct. 17, 2018, 10:20 p.m. UTC
Today we reject this flag on an already-reflinked inode, but we really
need to reject it for any inode on a reflink-capable filesystem until
reflink+dax is supported.

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
---

(um, do we need to catch this when reading from disk as well?  If we
found a dax-flagged inode on a reflinked fs, then what would we do with it?)

Comments

Darrick J. Wong Oct. 17, 2018, 10:30 p.m. UTC | #1
On Wed, Oct 17, 2018 at 05:20:56PM -0500, Eric Sandeen wrote:
> Today we reject this flag on an already-reflinked inode, but we really
> need to reject it for any inode on a reflink-capable filesystem until
> reflink+dax is supported.
> 
> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
> ---
> 
> (um, do we need to catch this when reading from disk as well?  If we
> found a dax-flagged inode on a reflinked fs, then what would we do with it?)

Ignore the DAX flag.  See xfs_inode_supports_dax.

> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
> index 0ef5ece5634c..63d579c652f2 100644
> --- a/fs/xfs/xfs_ioctl.c
> +++ b/fs/xfs/xfs_ioctl.c
> @@ -1031,8 +1031,9 @@ xfs_ioctl_setattr_xflags(
>  	if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
>  		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
>  
> -	/* Don't allow us to set DAX mode for a reflinked file for now. */
> -	if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
> +	/* Don't allow us to set DAX mode on a reflink filesystem for now. */
> +	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
> +	    xfs_sb_version_hasreflink(&ip->i_mount->m_sb))
>  		return -EINVAL;

Not sure we need this, since DAX always loses to REFLINK, whether it's
at inode loading time or if someone's trying to set it in the ioctl.
Ofc it's hard to say what the behavior should be since the dax iflag
semantics are poorly defined (it's been more or less advisory this whole
time)...

...but I gather you're sending this patch because you don't like this
wishy washy "ok you change this flag but it doesn't tell you if that had
any effect and there's no way to find out either" behavior? :)

--D

>  
>  	/*
>
Eric Sandeen Oct. 17, 2018, 10:49 p.m. UTC | #2
On 10/17/18 5:30 PM, Darrick J. Wong wrote:
> On Wed, Oct 17, 2018 at 05:20:56PM -0500, Eric Sandeen wrote:
>> Today we reject this flag on an already-reflinked inode, but we really
>> need to reject it for any inode on a reflink-capable filesystem until
>> reflink+dax is supported.
>>
>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>> ---
>>
>> (um, do we need to catch this when reading from disk as well?  If we
>> found a dax-flagged inode on a reflinked fs, then what would we do with it?)
> 
> Ignore the DAX flag.  See xfs_inode_supports_dax.

Oh, ok.

Hohum, by that measure shouldn't we allow mount -o dax on reflink filesystems,
and just ignore/reject dax behavior on actually reflinked inodes?

>> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
>> index 0ef5ece5634c..63d579c652f2 100644
>> --- a/fs/xfs/xfs_ioctl.c
>> +++ b/fs/xfs/xfs_ioctl.c
>> @@ -1031,8 +1031,9 @@ xfs_ioctl_setattr_xflags(
>>  	if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
>>  		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
>>  
>> -	/* Don't allow us to set DAX mode for a reflinked file for now. */
>> -	if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
>> +	/* Don't allow us to set DAX mode on a reflink filesystem for now. */
>> +	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
>> +	    xfs_sb_version_hasreflink(&ip->i_mount->m_sb))
>>  		return -EINVAL;
> 
> Not sure we need this, since DAX always loses to REFLINK, whether it's
> at inode loading time or if someone's trying to set it in the ioctl.

loses to a reflinked /inode/ but not to a reflink-capable fs, like
mount does.

> Ofc it's hard to say what the behavior should be since the dax iflag
> semantics are poorly defined (it's been more or less advisory this whole
> time)...
> 
> ...but I gather you're sending this patch because you don't like this
> wishy washy "ok you change this flag but it doesn't tell you if that had
> any effect and there's no way to find out either" behavior? :)

Just aiming for some semblance of consistency.  Today we have:

mount -o dax + xfs_sb_version_hasreflink =>
	ignore mount option, disable dax for all inodes regardless of reflinked status

chattr +x + xfs_sb_version_hasreflink =>
	inode is dax until it gets reflinked, then it's ignored

right?

(and what happens if we have a daxified inode that gets reflinked later?)

-Eric
Eric Sandeen Oct. 17, 2018, 11:03 p.m. UTC | #3
On 10/17/18 5:49 PM, Eric Sandeen wrote:
> 
> 
> On 10/17/18 5:30 PM, Darrick J. Wong wrote:
>> On Wed, Oct 17, 2018 at 05:20:56PM -0500, Eric Sandeen wrote:
>>> Today we reject this flag on an already-reflinked inode, but we really
>>> need to reject it for any inode on a reflink-capable filesystem until
>>> reflink+dax is supported.
>>>
>>> Signed-off-by: Eric Sandeen <sandeen@redhat.com>
>>> ---
>>>
>>> (um, do we need to catch this when reading from disk as well?  If we
>>> found a dax-flagged inode on a reflinked fs, then what would we do with it?)
>>
>> Ignore the DAX flag.  See xfs_inode_supports_dax.
> 
> Oh, ok.
> 
> Hohum, by that measure shouldn't we allow mount -o dax on reflink filesystems,
> and just ignore/reject dax behavior on actually reflinked inodes?
> 
>>> diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
>>> index 0ef5ece5634c..63d579c652f2 100644
>>> --- a/fs/xfs/xfs_ioctl.c
>>> +++ b/fs/xfs/xfs_ioctl.c
>>> @@ -1031,8 +1031,9 @@ xfs_ioctl_setattr_xflags(
>>>  	if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
>>>  		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
>>>  
>>> -	/* Don't allow us to set DAX mode for a reflinked file for now. */
>>> -	if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
>>> +	/* Don't allow us to set DAX mode on a reflink filesystem for now. */
>>> +	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
>>> +	    xfs_sb_version_hasreflink(&ip->i_mount->m_sb))
>>>  		return -EINVAL;
>>
>> Not sure we need this, since DAX always loses to REFLINK, whether it's
>> at inode loading time or if someone's trying to set it in the ioctl.
> 
> loses to a reflinked /inode/ but not to a reflink-capable fs, like
> mount does.
> 
>> Ofc it's hard to say what the behavior should be since the dax iflag
>> semantics are poorly defined (it's been more or less advisory this whole
>> time)...
>>
>> ...but I gather you're sending this patch because you don't like this
>> wishy washy "ok you change this flag but it doesn't tell you if that had
>> any effect and there's no way to find out either" behavior? :)
> 
> Just aiming for some semblance of consistency.  Today we have:
> 
> mount -o dax + xfs_sb_version_hasreflink =>
> 	ignore mount option, disable dax for all inodes regardless of reflinked status
> 
> chattr +x + xfs_sb_version_hasreflink =>
> 	inode is dax until it gets reflinked, then it's ignored
> 
> right?
> 
> (and what happens if we have a daxified inode that gets reflinked later?)

              Bit 15 (0x8000) - XFS_XFLAG_DAX
                        If the filesystem lives on directly accessible persistent  mem‐
                        ory, reads and writes to this file will go straight to the per‐
                        sistent memory, bypassing the page cache.   A  file  cannot  be
                        reflinked  and  have  the  XFS_XFLAG_DAX  set at the same time.
                        That is to say that DAX files cannot share blocks.

# xfs_io -c "lsattr" /mnt/test/dax
--------------x- /mnt/test/dax 

# cp --reflink=always /mnt/test/dax /mnt/test/reflink

# xfs_io -c "lsattr" /mnt/test/reflink 
---------------- /mnt/test/reflink 

# xfs_bmap -v /mnt/test/dax /mnt/test/reflink
/mnt/test/dax:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL
   0: [0..7]:          104..111          0 (104..111)           8 100000
/mnt/test/reflink:
 EXT: FILE-OFFSET      BLOCK-RANGE      AG AG-OFFSET        TOTAL
   0: [0..7]:          104..111          0 (104..111)           8 100000

# xfs_io -c "lsattr" /mnt/test/dax
--------------x- /mnt/test/dax

Patch
diff mbox series

diff --git a/fs/xfs/xfs_ioctl.c b/fs/xfs/xfs_ioctl.c
index 0ef5ece5634c..63d579c652f2 100644
--- a/fs/xfs/xfs_ioctl.c
+++ b/fs/xfs/xfs_ioctl.c
@@ -1031,8 +1031,9 @@  xfs_ioctl_setattr_xflags(
 	if ((fa->fsx_xflags & FS_XFLAG_REALTIME) && xfs_is_reflink_inode(ip))
 		ip->i_d.di_flags2 &= ~XFS_DIFLAG2_REFLINK;
 
-	/* Don't allow us to set DAX mode for a reflinked file for now. */
-	if ((fa->fsx_xflags & FS_XFLAG_DAX) && xfs_is_reflink_inode(ip))
+	/* Don't allow us to set DAX mode on a reflink filesystem for now. */
+	if ((fa->fsx_xflags & FS_XFLAG_DAX) &&
+	    xfs_sb_version_hasreflink(&ip->i_mount->m_sb))
 		return -EINVAL;
 
 	/*