On 8/13/15 10:07 AM, Zorro Lang wrote:
> When I run xfstests xfs/032 in ppc64le, I hit a failure:
>
> xfs_copy: read failed: Invalid argument
> xfs_copy: size check failed
> xfs_copy: /dev/sda5 filesystem failed to initialize
> xfs_copy: Aborting.
> Copy failed for Sector size 4096 Block size 4096
>
> I try to use gdb trace xfs_copy. I find it try to open the
> source device with DIRECT flag, then read the device with
> ((1<<BBSHIFT))=512 bytes length. If the source device is
> 4k sector, directly read 512 bytes will be failed.
>
> xfs_copy '-b' option only work for target file/device, to
> sure it will open the target without DIRECT flag. But useless
> for source device open.
>
> So I make DIRECT flag only be enabled when source device
> sector size equal BBSIZE.
Which version of xfsprogs did you test? This is recently upstream:
commit c63ce10a9450020382bbbe2c48788961b19830f4
Author: Eric Sandeen <sandeen@xxxxxxxxxx>
Date: Fri Jul 31 09:03:11 2015 +1000
xfs_copy: fix copy of hard 4k devices
If we have a pure 4k device with no 512 emulation, xfs_copy
fails straightaway because it tries to do a 512-byte direct
IO read of the superblock.
Do like we do in xfs_db, and read in the max possible sector size,
because we don't yet know what the filesystem's sector size is.
This fixes a failure in xfs/032 on a hard 4k device.
-Eric
> Signed-off-by: Zorro Lang <zlang@xxxxxxxxxx>
> ---
>
> Hi,
>
> I'm not so familiar for xfsprogs, so I'm not sure this's the best
> idea to fix this problem. Please help to check, and maybe give me
> better suggestions.
>
> Thanks very much,
> Zorro Lang
>
> copy/xfs_copy.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/copy/xfs_copy.c b/copy/xfs_copy.c
> index e13f468..1cd6253 100644
> --- a/copy/xfs_copy.c
> +++ b/copy/xfs_copy.c
> @@ -666,7 +666,6 @@ main(int argc, char **argv)
> /* prepare the libxfs_init structure */
>
> memset(&xargs, 0, sizeof(xargs));
> - xargs.isdirect = LIBXFS_DIRECT;
> xargs.isreadonly = LIBXFS_ISREADONLY;
>
> if (source_is_file) {
> @@ -689,6 +688,8 @@ main(int argc, char **argv)
> 1 << (XFS_MAX_SECTORSIZE_LOG - BBSHIFT), 0, NULL);
> sb = &mbuf.m_sb;
> libxfs_sb_from_disk(sb, XFS_BUF_TO_SBP(sbp));
> + if (sb->sb_sectsize == BBSIZE)
> + xargs.isdirect = LIBXFS_DIRECT;
>
> /* Do it again, now with proper length and verifier */
> libxfs_putbuf(sbp);
>
|