From: Eric Sandeen <sandeen@sandeen.net>
To: xfs-oss <xfs@oss.sgi.com>
Subject: Re: [PATCH] fix dir2 shortform structures on ARM old ABI
Date: Fri, 02 May 2008 15:55:45 -0500 [thread overview]
Message-ID: <481B7FD1.3030107@sandeen.net> (raw)
In-Reply-To: <480E89B5.8070006@sandeen.net>
Eric Sandeen wrote:
> Eric Sandeen wrote:
>> This should fix the longstanding issues with xfs and old ABI
>> arm boxes, which lead to various asserts and xfs shutdowns,
>> and for which an (incorrect) patch has been floating around
>> for years. (Said patch made ARM internally consistent, but
>> altered the normal xfs on-disk format such that it looked
>> corrupted on other architectures):
>> http://lists.arm.linux.org.uk/lurker/message/20040311.002034.5ecf21a2.html
>
> ping again...
ping #3...
> There is still the cache flushing issue, I guess, but I think the
> on-disk alignment is still worth fixing.
>
> Oh, I'm sorry Jeff - I meant "fixing." :)
>
> Thanks,
> -Eric
>
>> Old ABI ARM has interesting packing & padding; for example
>> on ARM old abi:
>>
>> struct xfs_dir2_sf_entry {
>> __uint8_t namelen; /* 0 1 */
>>
>> /* XXX 3 bytes hole, try to pack */
>>
>> xfs_dir2_sf_off_t offset; /* 4 4 */
>> __uint8_t name[1]; /* 8 1 */
>>
>> /* XXX 3 bytes hole, try to pack */
>>
>> xfs_dir2_inou_t inumber; /* 12 8 */
>>
>> /* size: 20, cachelines: 1 */
>> /* sum members: 14, holes: 2, sum holes: 6 */
>> /* last cacheline: 20 bytes */
>> };
>>
>> but on x86:
>>
>> struct xfs_dir2_sf_entry {
>> __uint8_t namelen; /* 0 1 */
>> xfs_dir2_sf_off_t offset; /* 1 2 */
>> __uint8_t name[1]; /* 3 1 */
>> xfs_dir2_inou_t inumber; /* 4 8 */
>>
>> /* size: 12, cachelines: 1 */
>> /* last cacheline: 12 bytes */
>> };
>>
>> ... this sort of discrepancy leads to problems.
>>
>> I've verified this patch by comparing the on-disk structure
>> layouts using pahole from the dwarves package, as well as
>> running through a bit of xfsqa under qemu-arm, modified so
>> that the check/repair phase after each test actually executes
>> check/repair from the x86 host, on the filesystem populated
>> by the arm emulator. Thus far it all looks good.
>>
>> There are 2 other structures with extra padding at the end,
>> but they don't seem to cause trouble. I suppose they could
>> be packed as well: xfs_dir2_data_unused_t and xfs_dir2_sf_t.
>>
>> Note that userspace needs a similar treatment, and any
>> filesystems which were running with the previous rogue
>> "fix" will now see corruption (either in the kernel, or
>> during xfs_repair) with this fix properly in place; it
>> may be worth teaching xfs_repair to identify and fix that
>> specific issue.
>>
>> Signed-off-by: Eric Sandeen <sandeen@sandeen.net>
>>
>> ---
>>
>> Index: linux-2.6.24/fs/xfs/linux-2.6/xfs_linux.h
>> ===================================================================
>> --- linux-2.6.24.orig/fs/xfs/linux-2.6/xfs_linux.h
>> +++ linux-2.6.24/fs/xfs/linux-2.6/xfs_linux.h
>> @@ -300,4 +300,11 @@ static inline __uint64_t howmany_64(__ui
>> return x;
>> }
>>
>> +/* ARM old ABI has some weird alignment/padding */
>> +#if defined(__arm__) && !defined(__ARM_EABI__)
>> +#define __arch_pack __attribute__((packed))
>> +#else
>> +#define __arch_pack
>> +#endif
>> +
>> #endif /* __XFS_LINUX__ */
>> Index: linux-2.6.24/fs/xfs/xfs_dir2_sf.h
>> ===================================================================
>> --- linux-2.6.24.orig/fs/xfs/xfs_dir2_sf.h
>> +++ linux-2.6.24/fs/xfs/xfs_dir2_sf.h
>> @@ -62,7 +62,7 @@ typedef union {
>> * Normalized offset (in a data block) of the entry, really xfs_dir2_data_off_t.
>> * Only need 16 bits, this is the byte offset into the single block form.
>> */
>> -typedef struct { __uint8_t i[2]; } xfs_dir2_sf_off_t;
>> +typedef struct { __uint8_t i[2]; } __arch_pack xfs_dir2_sf_off_t;
>>
>> /*
>> * The parent directory has a dedicated field, and the self-pointer must
>> @@ -76,14 +76,14 @@ typedef struct xfs_dir2_sf_hdr {
>> __uint8_t count; /* count of entries */
>> __uint8_t i8count; /* count of 8-byte inode #s */
>> xfs_dir2_inou_t parent; /* parent dir inode number */
>> -} xfs_dir2_sf_hdr_t;
>> +} __arch_pack xfs_dir2_sf_hdr_t;
>>
>> typedef struct xfs_dir2_sf_entry {
>> __uint8_t namelen; /* actual name length */
>> xfs_dir2_sf_off_t offset; /* saved offset */
>> __uint8_t name[1]; /* name, variable size */
>> xfs_dir2_inou_t inumber; /* inode number, var. offset */
>> -} xfs_dir2_sf_entry_t;
>> +} __arch_pack xfs_dir2_sf_entry_t;
>>
>> typedef struct xfs_dir2_sf {
>> xfs_dir2_sf_hdr_t hdr; /* shortform header */
>>
>>
>>
>
>
next prev parent reply other threads:[~2008-05-02 20:55 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-15 3:24 [PATCH] fix dir2 shortform structures on ARM old ABI Eric Sandeen
2008-03-15 4:17 ` Josef 'Jeff' Sipek
2008-03-15 4:23 ` Eric Sandeen
2008-03-15 4:27 ` Josef 'Jeff' Sipek
2008-03-15 4:33 ` Eric Sandeen
2008-03-15 4:51 ` Josef 'Jeff' Sipek
2008-03-17 18:32 ` Eric Sandeen
2008-03-17 19:53 ` Josef 'Jeff' Sipek
2008-03-17 20:04 ` Eric Sandeen
2008-03-17 20:28 ` Josef 'Jeff' Sipek
2008-03-18 0:39 ` [RFC][PATCH 1/1] XFS: annotate all on-disk structures with __ondisk Josef 'Jeff' Sipek
2008-03-18 3:34 ` Eric Sandeen
2008-03-18 4:09 ` David Chinner
2008-03-18 5:28 ` Josef 'Jeff' Sipek
2008-03-17 23:35 ` [PATCH] fix dir2 shortform structures on ARM old ABI Timothy Shimmin
2008-03-17 23:42 ` Josef 'Jeff' Sipek
2008-03-18 4:31 ` Timothy Shimmin
[not found] ` <20080315043622.GA11547@puku.stupidest.org>
2008-03-15 4:45 ` Eric Sandeen
2008-03-20 3:02 ` Eric Sandeen
2008-05-05 7:38 ` Barry Naujok
2008-06-06 14:15 ` Eric Sandeen
2008-04-09 19:53 ` Eric Sandeen
2008-04-23 0:58 ` Eric Sandeen
2008-05-02 20:55 ` Eric Sandeen [this message]
2008-05-05 7:08 ` David Chinner
2008-05-05 13:07 ` Eric Sandeen
2008-05-06 4:21 ` Timothy Shimmin
2008-05-06 13:43 ` Eric Sandeen
2008-06-05 5:38 ` Eric Sandeen
2008-06-05 5:46 ` Mark Goodwin
2008-06-05 5:49 ` Eric Sandeen
2008-06-05 6:02 ` Mark Goodwin
2008-06-05 6:04 ` Mark Goodwin
2008-06-05 6:06 ` Eric Sandeen
2008-06-05 5:49 ` Chris Wedgwood
2008-06-05 5:52 ` Eric Sandeen
2008-06-05 6:34 ` Eric Sandeen
-- strict thread matches above, loose matches on Subject: below --
2008-03-18 23:31 Andre Draszik
2008-03-19 3:18 ` Eric Sandeen
2008-03-19 3:40 ` Eric Sandeen
2008-03-19 5:11 ` Eric Sandeen
2008-03-19 5:31 ` Eric Sandeen
2008-03-20 0:35 ` Timothy Shimmin
2008-03-18 23:49 Andre Draszik
2008-03-19 0:23 ` Josef 'Jeff' Sipek
2008-03-19 11:21 ` Luca Olivetti
2008-03-19 12:53 ` Eric Sandeen
2008-03-19 14:11 ` Luca Olivetti
[not found] ` <47E11F4A.3090205@ventoso.org>
[not found] ` <47E12D20.4010901@sandeen.net>
2008-03-19 15:34 ` Luca Olivetti
2008-03-19 15:40 ` Eric Sandeen
[not found] ` <47E14FF1.2020100@sandeen.net>
2008-03-19 18:24 ` Luca Olivetti
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=481B7FD1.3030107@sandeen.net \
--to=sandeen@sandeen.net \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox