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: Tue, 22 Apr 2008 19:58:29 -0500 [thread overview]
Message-ID: <480E89B5.8070006@sandeen.net> (raw)
In-Reply-To: <47DB4181.7040603@sandeen.net>
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...
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-04-23 0:58 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 [this message]
2008-05-02 20:55 ` Eric Sandeen
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=480E89B5.8070006@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.