Re: [PATCH v3] repair: handle reading superblock from image on larger sector size filesystem

Eric Sandeen
2017-04-11T13:39:00Z

On 4/10/17 11:31 PM, Zorro Lang wrote:
> On Mon, Apr 10, 2017 at 10:57:11PM -0500, Eric Sandeen wrote:
>> On 4/10/17 10:25 PM, Zorro Lang wrote:
>>> On Mon, Apr 10, 2017 at 12:16:41PM -0500, Eric Sandeen wrote:
>>>> On 4/6/17 7:05 AM, Zorro Lang wrote:
>>>>> Due to xfs_repair uses direct IO, sometimes it can't read superblock
>>>>> from an image file has smaller sector size than host filesystem.
>>>>> Especially that superblock doesn't align with host filesystem's
>>>>> sector size.
>>>>>
>>>>> Fortunately, xfsprogs already has code to do isa_file and geometry
>>>>> check in xfs_repair.c, it turns off O_DIRECT after phase1() if the
>>>>> sector size is less than the host filesystem's geometry. So move
>>>>> the isa_file auto detection over up the phase1(), and try to do
>>>>> once geometry check before phase1() if get_sb() return OK.
>>>>
>>>> Zorro, can you do a quick test for me - does a filesystem which fails
>>>> repair without this patch also fail xfs_copy if the source and/or
>>>> destination of the copy is on this same filesystem/device as the image
>>>> file in your xfs_repair test?
>>>
>>> Sure, the xfs_copy has similar problem. I'm writting a xfstests case to
>>> do xfs_repair and xfs_copy a file image likes this. Do you have any other
>>> related suggestions which I can write them together?
>>
>> Any userspace which needs to read a filesystem image probably has the same
>> issue.
>
> I've already tested xfs_repair, xfs_copy, xfs_metadump, xfs_mdrestore and
> xfs_db -c "sb $i". Only xfs_repair and xfs_copy failed.

Turns out I was wrong in my guess. Most of those applications do not
use O_DIRECT, so the problem does not exist.

> And I noticed that xfs_copy open source file with O_DIRECT on purpose:
> if (source_is_file && platform_test_xfs_fd(source_fd)) {
> if (fcntl(source_fd, F_SETFL, open_flags | O_DIRECT) < 0) {
> do_log(_("%s: Cannot set direct I/O flag on \"%s\".\n"),
> progname, source_name);
> die_perror();
> }
>
> I don't learn about the reason so much, maybe we shouldn't turn off
> its O_DIRECT ?

I think most of these applications use O_DIRECT to avoid polluting the
page cache for a one-off read of the filesystem, and/or to manage caching
on its own (in the xfs_repair case). I'm not actually sure why xfs_metadump
doesn't use O_DIRECT, other than that it is part of xfs_db, which also doesn't
use O_DIRECT.

In any case, xfs_copy seems to have similar issues, and probably needs fixing
as well. It might make sense to try to factor out some of this handling
into a common helper, in the long run.

-Eric

> Thanks,
> Zorro
>
>>
>> I'm wondering if all of this handling should somehow be factored out and
>> re-used across the utilities...
>>
>> -Eric
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
>