mirror of
git://git.yoctoproject.org/linux-yocto.git
synced 2025-10-22 23:13:01 +02:00
xfs: enable realtime reflink
Enable reflink for realtime devices, as long as the realtime allocation unit is a single fsblock. Signed-off-by: "Darrick J. Wong" <djwong@kernel.org> Reviewed-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
fd97fe1112
commit
155debbe7e
|
@ -1822,3 +1822,28 @@ out:
|
||||||
trace_xfs_reflink_unshare_error(ip, error, _RET_IP_);
|
trace_xfs_reflink_unshare_error(ip, error, _RET_IP_);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Can we use reflink with this realtime extent size? Note that we don't check
|
||||||
|
* for rblocks > 0 here because this can be called as part of attaching a new
|
||||||
|
* rt section.
|
||||||
|
*/
|
||||||
|
bool
|
||||||
|
xfs_reflink_supports_rextsize(
|
||||||
|
struct xfs_mount *mp,
|
||||||
|
unsigned int rextsize)
|
||||||
|
{
|
||||||
|
/* reflink on the realtime device requires rtgroups */
|
||||||
|
if (!xfs_has_rtgroups(mp))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reflink doesn't support rt extent size larger than a single fsblock
|
||||||
|
* because we would have to perform CoW-around for unaligned write
|
||||||
|
* requests to guarantee that we always remap entire rt extents.
|
||||||
|
*/
|
||||||
|
if (rextsize != 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
|
@ -62,4 +62,6 @@ extern int xfs_reflink_remap_blocks(struct xfs_inode *src, loff_t pos_in,
|
||||||
extern int xfs_reflink_update_dest(struct xfs_inode *dest, xfs_off_t newlen,
|
extern int xfs_reflink_update_dest(struct xfs_inode *dest, xfs_off_t newlen,
|
||||||
xfs_extlen_t cowextsize, unsigned int remap_flags);
|
xfs_extlen_t cowextsize, unsigned int remap_flags);
|
||||||
|
|
||||||
|
bool xfs_reflink_supports_rextsize(struct xfs_mount *mp, unsigned int rextsize);
|
||||||
|
|
||||||
#endif /* __XFS_REFLINK_H */
|
#endif /* __XFS_REFLINK_H */
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "xfs_error.h"
|
#include "xfs_error.h"
|
||||||
#include "xfs_trace.h"
|
#include "xfs_trace.h"
|
||||||
#include "xfs_rtrefcount_btree.h"
|
#include "xfs_rtrefcount_btree.h"
|
||||||
|
#include "xfs_reflink.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return whether there are any free extents in the size range given
|
* Return whether there are any free extents in the size range given
|
||||||
|
@ -1292,8 +1293,10 @@ xfs_growfs_rt(
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
if (xfs_has_quota(mp))
|
if (xfs_has_quota(mp))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
if (xfs_has_reflink(mp))
|
||||||
if (xfs_has_reflink(mp))
|
goto out_unlock;
|
||||||
|
} else if (xfs_has_reflink(mp) &&
|
||||||
|
!xfs_reflink_supports_rextsize(mp, in->extsize))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
error = xfs_sb_validate_fsb_count(&mp->m_sb, in->newblocks);
|
error = xfs_sb_validate_fsb_count(&mp->m_sb, in->newblocks);
|
||||||
|
|
|
@ -1754,9 +1754,11 @@ xfs_fs_fill_super(
|
||||||
xfs_warn_experimental(mp, XFS_EXPERIMENTAL_METADIR);
|
xfs_warn_experimental(mp, XFS_EXPERIMENTAL_METADIR);
|
||||||
|
|
||||||
if (xfs_has_reflink(mp)) {
|
if (xfs_has_reflink(mp)) {
|
||||||
if (mp->m_sb.sb_rblocks) {
|
if (xfs_has_realtime(mp) &&
|
||||||
|
!xfs_reflink_supports_rextsize(mp, mp->m_sb.sb_rextsize)) {
|
||||||
xfs_alert(mp,
|
xfs_alert(mp,
|
||||||
"reflink not compatible with realtime device!");
|
"reflink not compatible with realtime extent size %u!",
|
||||||
|
mp->m_sb.sb_rextsize);
|
||||||
error = -EINVAL;
|
error = -EINVAL;
|
||||||
goto out_filestream_unmount;
|
goto out_filestream_unmount;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user