common: extract rt extent size for _get_file_block_size

_get_file_block_size is intended to return the size (in bytes) of the
fundamental allocation unit for a file.  This is required for remapping
operations like fallocate and reflink, which can only operate on
allocation units.  Since the XFS realtime volume can be configure for
allocation units larger than 1 fs block, we need to factor that in here.

Note that ext* with bigalloc does not allocations to be aligned to the
cluster size, so no update is needed there.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Eryu Guan <guaneryu@gmail.com>
This commit is contained in:
Darrick J. Wong
2020-11-10 16:42:59 -08:00
committed by Eryu Guan
parent ac23422a8c
commit f02ccfb24b
2 changed files with 30 additions and 3 deletions
+10 -3
View File
@@ -3991,11 +3991,18 @@ _get_file_block_size()
echo "Missing mount point argument for _get_file_block_size"
exit 1
fi
if [ "$FSTYP" = "ocfs2" ]; then
case "$FSTYP" in
"ocfs2")
stat -c '%o' $1
else
;;
"xfs")
_xfs_get_file_block_size $1
;;
*)
_get_block_size $1
fi
;;
esac
}
# Get the minimum block size of an fs.
+20
View File
@@ -174,6 +174,26 @@ _scratch_mkfs_xfs()
return $mkfs_status
}
# Get the size of an allocation unit of a file. Normally this is just the
# block size of the file, but for realtime files, this is the realtime extent
# size.
_xfs_get_file_block_size()
{
local path="$1"
if ! ($XFS_IO_PROG -c "stat -v" "$path" 2>&1 | egrep -q '(rt-inherit|realtime)'); then
_get_block_size "$path"
return
fi
# Otherwise, call xfs_info until we find a mount point or the root.
path="$(readlink -m "$path")"
while ! $XFS_INFO_PROG "$path" &>/dev/null && [ "$path" != "/" ]; do
path="$(dirname "$path")"
done
$XFS_INFO_PROG "$path" | grep realtime | sed -e 's/^.*extsz=\([0-9]*\).*$/\1/g'
}
# xfs_check script is planned to be deprecated. But, we want to
# be able to invoke "xfs_check" behavior in xfstests in order to
# maintain the current verification levels.