* [PATCH] xfsprogs: fix unaligned access in libxfs
@ 2009-08-28 15:37 Christoph Hellwig
2009-08-28 17:15 ` Eric Sandeen
2009-08-28 21:39 ` Alex Elder
0 siblings, 2 replies; 10+ messages in thread
From: Christoph Hellwig @ 2009-08-28 15:37 UTC (permalink / raw)
To: xfs; +Cc: Gabriel Vlasiu
The get/put unaligned handlers we use to access the extent descriptor
are not good enough for architectures like Sparc that do not tolerate
dereferencing unaligned pointers. Replace the implementation with the
one the kernel uses on these architectures. It might be a tad
slower on architectures like x86, but I don't want to have multiple
implementations around to not let the testing matrix explode.
Also remove the unaligned.h header which includes another implementation
for unaligned access we don't actually use anymore.
Note that the little change to xfs_inode.c needs to go into the kernel
aswell, I will send a patch for that shortly.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reported-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
Tested-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
Index: xfsprogs-dev/libxfs/xfs.h
===================================================================
--- xfsprogs-dev.orig/libxfs/xfs.h 2009-08-27 10:06:13.377855006 -0300
+++ xfsprogs-dev/libxfs/xfs.h 2009-08-27 10:06:26.537884492 -0300
@@ -127,19 +127,37 @@ static inline int __do_div(unsigned long
#define max_t(type,x,y) \
({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
-/* only 64 bit accesses used in xfs kernel code */
-static inline __u64 get_unaligned_be64(void *ptr)
+
+static inline __uint32_t __get_unaligned_be32(const __uint8_t *p)
+{
+ return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
+}
+
+static inline __uint64_t get_unaligned_be64(void *p)
{
- __be64 __tmp;
- memmove(&__tmp, ptr, 8);
- return be64_to_cpu(__tmp);
+ return (__uint64_t)__get_unaligned_be32(p) << 32 |
+ __get_unaligned_be32(p + 4);
}
-static inline void put_unaligned(__be64 val, void *ptr)
+static inline void __put_unaligned_be16(__uint16_t val, __uint8_t *p)
{
- memmove(ptr, &val, 8);
+ *p++ = val >> 8;
+ *p++ = val;
}
+static inline void __put_unaligned_be32(__uint32_t val, __uint8_t *p)
+{
+ __put_unaligned_be16(val >> 16, p);
+ __put_unaligned_be16(val, p + 2);
+}
+
+static inline void put_unaligned_be64(__uint64_t val, void *p)
+{
+ __put_unaligned_be32(val >> 32, p);
+ __put_unaligned_be32(val, p + 4);
+}
+
+
static inline __attribute__((const))
int is_power_of_2(unsigned long n)
{
Index: xfsprogs-dev/libxfs/xfs_inode.c
===================================================================
--- xfsprogs-dev.orig/libxfs/xfs_inode.c 2009-08-27 10:06:13.385884867 -0300
+++ xfsprogs-dev/libxfs/xfs_inode.c 2009-08-27 10:06:26.541855737 -0300
@@ -1056,8 +1056,8 @@ xfs_iextents_copy(
}
/* Translate to on disk format */
- put_unaligned(cpu_to_be64(ep->l0), &dp->l0);
- put_unaligned(cpu_to_be64(ep->l1), &dp->l1);
+ put_unaligned_be64(ep->l0, &dp->l0);
+ put_unaligned_be64(ep->l1, &dp->l1);
dp++;
copied++;
}
Index: xfsprogs-dev/include/Makefile
===================================================================
--- xfsprogs-dev.orig/include/Makefile 2009-08-28 12:29:42.257922053 -0300
+++ xfsprogs-dev/include/Makefile 2009-08-28 12:29:55.830456736 -0300
@@ -37,7 +37,7 @@ PHFILES = darwin.h freebsd.h irix.h linu
DKHFILES = volume.h fstyp.h dvh.h
LSRCFILES = $(shell echo $(PHFILES) | sed -e "s/$(PKG_PLATFORM).h//g")
LSRCFILES += platform_defs.h.in builddefs.in buildmacros buildrules install-sh
-LSRCFILES += $(DKHFILES) command.h input.h path.h project.h unaligned.h
+LSRCFILES += $(DKHFILES) command.h input.h path.h project.h
LDIRT = xfs disk
default install: xfs disk
Index: xfsprogs-dev/include/unaligned.h
===================================================================
--- xfsprogs-dev.orig/include/unaligned.h 2009-08-28 12:29:34.710448280 -0300
+++ /dev/null 1970-01-01 00:00:00.000000000 +0000
@@ -1,120 +0,0 @@
-#ifndef _UNALIGNED_H_
-#define _UNALIGNED_H_
-
-/*
- * For the benefit of those who are trying to port Linux to another
- * architecture, here are some C-language equivalents.
- *
- * This is based almost entirely upon Richard Henderson's
- * asm-alpha/unaligned.h implementation. Some comments were
- * taken from David Mosberger's asm-ia64/unaligned.h header.
- */
-
-/*
- * The main single-value unaligned transfer routines.
- */
-#define get_unaligned(ptr) \
- __get_unaligned((ptr), sizeof(*(ptr)))
-#define put_unaligned(x,ptr) \
- __put_unaligned((__u64)(x), (ptr), sizeof(*(ptr)))
-
-/*
- * This function doesn't actually exist. The idea is that when
- * someone uses the macros below with an unsupported size (datatype),
- * the linker will alert us to the problem via an unresolved reference
- * error.
- */
-extern void bad_unaligned_access_length(void) __attribute__((noreturn));
-
-struct __una_u64 { __u64 x __attribute__((packed)); };
-struct __una_u32 { __u32 x __attribute__((packed)); };
-struct __una_u16 { __u16 x __attribute__((packed)); };
-
-/*
- * Elemental unaligned loads
- */
-
-static inline __u64 __uldq(const __u64 *addr)
-{
- const struct __una_u64 *ptr = (const struct __una_u64 *) addr;
- return ptr->x;
-}
-
-static inline __u32 __uldl(const __u32 *addr)
-{
- const struct __una_u32 *ptr = (const struct __una_u32 *) addr;
- return ptr->x;
-}
-
-static inline __u16 __uldw(const __u16 *addr)
-{
- const struct __una_u16 *ptr = (const struct __una_u16 *) addr;
- return ptr->x;
-}
-
-/*
- * Elemental unaligned stores
- */
-
-static inline void __ustq(__u64 val, __u64 *addr)
-{
- struct __una_u64 *ptr = (struct __una_u64 *) addr;
- ptr->x = val;
-}
-
-static inline void __ustl(__u32 val, __u32 *addr)
-{
- struct __una_u32 *ptr = (struct __una_u32 *) addr;
- ptr->x = val;
-}
-
-static inline void __ustw(__u16 val, __u16 *addr)
-{
- struct __una_u16 *ptr = (struct __una_u16 *) addr;
- ptr->x = val;
-}
-
-#define __get_unaligned(ptr, size) ({ \
- const void *__gu_p = ptr; \
- __u64 val; \
- switch (size) { \
- case 1: \
- val = *(const __u8 *)__gu_p; \
- break; \
- case 2: \
- val = __uldw(__gu_p); \
- break; \
- case 4: \
- val = __uldl(__gu_p); \
- break; \
- case 8: \
- val = __uldq(__gu_p); \
- break; \
- default: \
- bad_unaligned_access_length(); \
- }; \
- (__typeof__(*(ptr)))val; \
-})
-
-#define __put_unaligned(val, ptr, size) \
-do { \
- void *__gu_p = ptr; \
- switch (size) { \
- case 1: \
- *(__u8 *)__gu_p = val; \
- break; \
- case 2: \
- __ustw(val, __gu_p); \
- break; \
- case 4: \
- __ustl(val, __gu_p); \
- break; \
- case 8: \
- __ustq(val, __gu_p); \
- break; \
- default: \
- bad_unaligned_access_length(); \
- }; \
-} while(0)
-
-#endif /* _UNALIGNED_H */
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 15:37 [PATCH] xfsprogs: fix unaligned access in libxfs Christoph Hellwig
@ 2009-08-28 17:15 ` Eric Sandeen
2009-08-28 18:24 ` pushing out a new xfsprogs release, was " Christoph Hellwig
2009-08-28 21:39 ` Alex Elder
1 sibling, 1 reply; 10+ messages in thread
From: Eric Sandeen @ 2009-08-28 17:15 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Gabriel Vlasiu, xfs
Christoph Hellwig wrote:
> The get/put unaligned handlers we use to access the extent descriptor
> are not good enough for architectures like Sparc that do not tolerate
> dereferencing unaligned pointers. Replace the implementation with the
> one the kernel uses on these architectures. It might be a tad
> slower on architectures like x86, but I don't want to have multiple
> implementations around to not let the testing matrix explode.
> Also remove the unaligned.h header which includes another implementation
> for unaligned access we don't actually use anymore.
>
> Note that the little change to xfs_inode.c needs to go into the kernel
> aswell, I will send a patch for that shortly.
>
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reported-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
> Tested-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
Looks good to me.
Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
> Index: xfsprogs-dev/libxfs/xfs.h
> ===================================================================
> --- xfsprogs-dev.orig/libxfs/xfs.h 2009-08-27 10:06:13.377855006 -0300
> +++ xfsprogs-dev/libxfs/xfs.h 2009-08-27 10:06:26.537884492 -0300
> @@ -127,19 +127,37 @@ static inline int __do_div(unsigned long
> #define max_t(type,x,y) \
> ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
>
> -/* only 64 bit accesses used in xfs kernel code */
> -static inline __u64 get_unaligned_be64(void *ptr)
> +
> +static inline __uint32_t __get_unaligned_be32(const __uint8_t *p)
> +{
> + return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
> +}
> +
> +static inline __uint64_t get_unaligned_be64(void *p)
> {
> - __be64 __tmp;
> - memmove(&__tmp, ptr, 8);
> - return be64_to_cpu(__tmp);
> + return (__uint64_t)__get_unaligned_be32(p) << 32 |
> + __get_unaligned_be32(p + 4);
> }
>
> -static inline void put_unaligned(__be64 val, void *ptr)
> +static inline void __put_unaligned_be16(__uint16_t val, __uint8_t *p)
> {
> - memmove(ptr, &val, 8);
> + *p++ = val >> 8;
> + *p++ = val;
> }
>
> +static inline void __put_unaligned_be32(__uint32_t val, __uint8_t *p)
> +{
> + __put_unaligned_be16(val >> 16, p);
> + __put_unaligned_be16(val, p + 2);
> +}
> +
> +static inline void put_unaligned_be64(__uint64_t val, void *p)
> +{
> + __put_unaligned_be32(val >> 32, p);
> + __put_unaligned_be32(val, p + 4);
> +}
> +
> +
> static inline __attribute__((const))
> int is_power_of_2(unsigned long n)
> {
> Index: xfsprogs-dev/libxfs/xfs_inode.c
> ===================================================================
> --- xfsprogs-dev.orig/libxfs/xfs_inode.c 2009-08-27 10:06:13.385884867 -0300
> +++ xfsprogs-dev/libxfs/xfs_inode.c 2009-08-27 10:06:26.541855737 -0300
> @@ -1056,8 +1056,8 @@ xfs_iextents_copy(
> }
>
> /* Translate to on disk format */
> - put_unaligned(cpu_to_be64(ep->l0), &dp->l0);
> - put_unaligned(cpu_to_be64(ep->l1), &dp->l1);
> + put_unaligned_be64(ep->l0, &dp->l0);
> + put_unaligned_be64(ep->l1, &dp->l1);
> dp++;
> copied++;
> }
> Index: xfsprogs-dev/include/Makefile
> ===================================================================
> --- xfsprogs-dev.orig/include/Makefile 2009-08-28 12:29:42.257922053 -0300
> +++ xfsprogs-dev/include/Makefile 2009-08-28 12:29:55.830456736 -0300
> @@ -37,7 +37,7 @@ PHFILES = darwin.h freebsd.h irix.h linu
> DKHFILES = volume.h fstyp.h dvh.h
> LSRCFILES = $(shell echo $(PHFILES) | sed -e "s/$(PKG_PLATFORM).h//g")
> LSRCFILES += platform_defs.h.in builddefs.in buildmacros buildrules install-sh
> -LSRCFILES += $(DKHFILES) command.h input.h path.h project.h unaligned.h
> +LSRCFILES += $(DKHFILES) command.h input.h path.h project.h
> LDIRT = xfs disk
>
> default install: xfs disk
> Index: xfsprogs-dev/include/unaligned.h
> ===================================================================
> --- xfsprogs-dev.orig/include/unaligned.h 2009-08-28 12:29:34.710448280 -0300
> +++ /dev/null 1970-01-01 00:00:00.000000000 +0000
> @@ -1,120 +0,0 @@
> -#ifndef _UNALIGNED_H_
> -#define _UNALIGNED_H_
> -
> -/*
> - * For the benefit of those who are trying to port Linux to another
> - * architecture, here are some C-language equivalents.
> - *
> - * This is based almost entirely upon Richard Henderson's
> - * asm-alpha/unaligned.h implementation. Some comments were
> - * taken from David Mosberger's asm-ia64/unaligned.h header.
> - */
> -
> -/*
> - * The main single-value unaligned transfer routines.
> - */
> -#define get_unaligned(ptr) \
> - __get_unaligned((ptr), sizeof(*(ptr)))
> -#define put_unaligned(x,ptr) \
> - __put_unaligned((__u64)(x), (ptr), sizeof(*(ptr)))
> -
> -/*
> - * This function doesn't actually exist. The idea is that when
> - * someone uses the macros below with an unsupported size (datatype),
> - * the linker will alert us to the problem via an unresolved reference
> - * error.
> - */
> -extern void bad_unaligned_access_length(void) __attribute__((noreturn));
> -
> -struct __una_u64 { __u64 x __attribute__((packed)); };
> -struct __una_u32 { __u32 x __attribute__((packed)); };
> -struct __una_u16 { __u16 x __attribute__((packed)); };
> -
> -/*
> - * Elemental unaligned loads
> - */
> -
> -static inline __u64 __uldq(const __u64 *addr)
> -{
> - const struct __una_u64 *ptr = (const struct __una_u64 *) addr;
> - return ptr->x;
> -}
> -
> -static inline __u32 __uldl(const __u32 *addr)
> -{
> - const struct __una_u32 *ptr = (const struct __una_u32 *) addr;
> - return ptr->x;
> -}
> -
> -static inline __u16 __uldw(const __u16 *addr)
> -{
> - const struct __una_u16 *ptr = (const struct __una_u16 *) addr;
> - return ptr->x;
> -}
> -
> -/*
> - * Elemental unaligned stores
> - */
> -
> -static inline void __ustq(__u64 val, __u64 *addr)
> -{
> - struct __una_u64 *ptr = (struct __una_u64 *) addr;
> - ptr->x = val;
> -}
> -
> -static inline void __ustl(__u32 val, __u32 *addr)
> -{
> - struct __una_u32 *ptr = (struct __una_u32 *) addr;
> - ptr->x = val;
> -}
> -
> -static inline void __ustw(__u16 val, __u16 *addr)
> -{
> - struct __una_u16 *ptr = (struct __una_u16 *) addr;
> - ptr->x = val;
> -}
> -
> -#define __get_unaligned(ptr, size) ({ \
> - const void *__gu_p = ptr; \
> - __u64 val; \
> - switch (size) { \
> - case 1: \
> - val = *(const __u8 *)__gu_p; \
> - break; \
> - case 2: \
> - val = __uldw(__gu_p); \
> - break; \
> - case 4: \
> - val = __uldl(__gu_p); \
> - break; \
> - case 8: \
> - val = __uldq(__gu_p); \
> - break; \
> - default: \
> - bad_unaligned_access_length(); \
> - }; \
> - (__typeof__(*(ptr)))val; \
> -})
> -
> -#define __put_unaligned(val, ptr, size) \
> -do { \
> - void *__gu_p = ptr; \
> - switch (size) { \
> - case 1: \
> - *(__u8 *)__gu_p = val; \
> - break; \
> - case 2: \
> - __ustw(val, __gu_p); \
> - break; \
> - case 4: \
> - __ustl(val, __gu_p); \
> - break; \
> - case 8: \
> - __ustq(val, __gu_p); \
> - break; \
> - default: \
> - bad_unaligned_access_length(); \
> - }; \
> -} while(0)
> -
> -#endif /* _UNALIGNED_H */
>
> _______________________________________________
> xfs mailing list
> xfs@oss.sgi.com
> http://oss.sgi.com/mailman/listinfo/xfs
>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* pushing out a new xfsprogs release, was Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 17:15 ` Eric Sandeen
@ 2009-08-28 18:24 ` Christoph Hellwig
2009-08-28 21:20 ` Felix Blyakher
2009-08-29 22:17 ` Michael Monnerie
0 siblings, 2 replies; 10+ messages in thread
From: Christoph Hellwig @ 2009-08-28 18:24 UTC (permalink / raw)
To: Eric Sandeen; +Cc: Gabriel Vlasiu, nathans, xfs
On Fri, Aug 28, 2009 at 10:15:51AM -0700, Eric Sandeen wrote:
> Looks good to me.
>
> Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
Thanks. What do people thing about pushing out a 3.0.3 xfsprogs
release?
Since 3.0.1 (discounting 3.0.2 as a Debian-only thing quickly following
3.0.1): we have the following changes the list below. It's not a whole
lot, but everything is relatively small fixes, the the unaligned thing
makes the 3.0 series so far unusable on strict alignment platforms.
If we go for it I can update the CHANGES ASAP for the release, and
ater that we can start putting in changes for a 3.1.0 release - I have
Barry's repair speedups ready for a wider audience, Eric has the
patch to make the lazy sb counters default and I can do the long
needed resync with the kernel code.
Changes from 3.0.1 to HEAD:
Christoph Hellwig (3):
add release.sh
Merge branch 'master' of git://oss.sgi.com/xfs/cmds/xfsprogs
xfsprogs: fix unaligned access in libxfs
David Chinner (1):
mkfs: allow to make larger logs
Eric Sandeen (11):
xfsprogs: fix readline/editline for xfs_io and xfs_quota
xfs_io: add fallocate command
Update CHANGES file for recent commits
xfs_repair: catch bad depth in traverse_int_dir2block
xfs_io: fix test for fallocate on 32bit boxes
xfs_repair: fix agcount*agblocks overflows
xfs_metadump: agcount*agblocks overflow
xfs_repair: clear inodes in incorrect btree format
the freesp doesn't support "-f" so take it out of the usage().
xfs_db: do bounds checking in frag's scanfunc_bmap
xfs_io: actually issue 0 size writes
Felix Blyakher (2):
Merge branch 'master' of git://git.kernel.org/pub/scm/fs/xfs/xfsprogs-dev
3.0.1 release
Nathan Scott (2):
Resolve minor man page warnings reported by lintian tool.
Debian packaging updates, and bumped minor version to 3.0.2.
Nathaniel W. Turner (1):
xfs_repair: open filesystem device exclusively
Robert Herndon (1):
add -x flags to include/install-sh
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pushing out a new xfsprogs release, was Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 18:24 ` pushing out a new xfsprogs release, was " Christoph Hellwig
@ 2009-08-28 21:20 ` Felix Blyakher
2009-08-29 22:17 ` Michael Monnerie
1 sibling, 0 replies; 10+ messages in thread
From: Felix Blyakher @ 2009-08-28 21:20 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Gabriel Vlasiu, Eric Sandeen, nathans, xfs
On Aug 28, 2009, at 1:24 PM, Christoph Hellwig wrote:
> On Fri, Aug 28, 2009 at 10:15:51AM -0700, Eric Sandeen wrote:
>> Looks good to me.
>>
>> Reviewed-by: Eric Sandeen <sandeen@sandeen.net>
>
> Thanks. What do people thing about pushing out a 3.0.3 xfsprogs
> release?
>
> Since 3.0.1 (discounting 3.0.2 as a Debian-only thing quickly
> following
> 3.0.1): we have the following changes the list below. It's not a
> whole
> lot, but everything is relatively small fixes, the the unaligned thing
> makes the 3.0 series so far unusable on strict alignment platforms.
Seems like a bunch of useful changes in xfs_repair, xfs_db and xfs_io.
Also it's passed 3 months since the last release, and it's a good idea
to keep the quarterly update.
> If we go for it I can update the CHANGES ASAP for the release,
I'll package it up right after that.
> and
> ater that we can start putting in changes for a 3.1.0 release - I have
> Barry's repair speedups ready for a wider audience, Eric has the
> patch to make the lazy sb counters default and I can do the long
> needed resync with the kernel code.
Yep, those bigger changes would be right for 3.1.0 release.
Felix
>
>
>
> Changes from 3.0.1 to HEAD:
>
>
>
> Christoph Hellwig (3):
> add release.sh
> Merge branch 'master' of git://oss.sgi.com/xfs/cmds/xfsprogs
> xfsprogs: fix unaligned access in libxfs
>
> David Chinner (1):
> mkfs: allow to make larger logs
>
> Eric Sandeen (11):
> xfsprogs: fix readline/editline for xfs_io and xfs_quota
> xfs_io: add fallocate command
> Update CHANGES file for recent commits
> xfs_repair: catch bad depth in traverse_int_dir2block
> xfs_io: fix test for fallocate on 32bit boxes
> xfs_repair: fix agcount*agblocks overflows
> xfs_metadump: agcount*agblocks overflow
> xfs_repair: clear inodes in incorrect btree format
> the freesp doesn't support "-f" so take it out of the usage().
> xfs_db: do bounds checking in frag's scanfunc_bmap
> xfs_io: actually issue 0 size writes
>
> Felix Blyakher (2):
> Merge branch 'master' of git://git.kernel.org/pub/scm/fs/xfs/
> xfsprogs-dev
> 3.0.1 release
>
> Nathan Scott (2):
> Resolve minor man page warnings reported by lintian tool.
> Debian packaging updates, and bumped minor version to 3.0.2.
>
> Nathaniel W. Turner (1):
> xfs_repair: open filesystem device exclusively
>
> Robert Herndon (1):
> add -x flags to include/install-sh
>
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 15:37 [PATCH] xfsprogs: fix unaligned access in libxfs Christoph Hellwig
2009-08-28 17:15 ` Eric Sandeen
@ 2009-08-28 21:39 ` Alex Elder
2009-08-28 22:15 ` Christoph Hellwig
1 sibling, 1 reply; 10+ messages in thread
From: Alex Elder @ 2009-08-28 21:39 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Gabriel Vlasiu, xfs
Christoph Hellwig wrote:
> The get/put unaligned handlers we use to access the extent descriptor
> are not good enough for architectures like Sparc that do not tolerate
> dereferencing unaligned pointers. Replace the implementation with the
> one the kernel uses on these architectures. It might be a tad
> slower on architectures like x86, but I don't want to have multiple
> implementations around to not let the testing matrix explode.
> Also remove the unaligned.h header which includes another implementation
> for unaligned access we don't actually use anymore.
>
> Note that the little change to xfs_inode.c needs to go into the kernel
> aswell, I will send a patch for that shortly.
>
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reported-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
> Tested-by: Gabriel Vlasiu <gabrielvlasiu@gmail.com>
Looks good. Note comment about interface below.
Reviewed-by: Alex Elder <aelder@sgi.com>
> Index: xfsprogs-dev/libxfs/xfs.h
> ===================================================================
> --- xfsprogs-dev.orig/libxfs/xfs.h 2009-08-27 10:06:13.377855006 -0300
> +++ xfsprogs-dev/libxfs/xfs.h 2009-08-27 10:06:26.537884492 -0300
> @@ -127,19 +127,37 @@ static inline int __do_div(unsigned long
> #define max_t(type,x,y) \
> ({ type __x = (x); type __y = (y); __x > __y ? __x: __y; })
>
> -/* only 64 bit accesses used in xfs kernel code */
> -static inline __u64 get_unaligned_be64(void *ptr)
> +
> +static inline __uint32_t __get_unaligned_be32(const __uint8_t *p)
It would be nice for this interface (and others) to take a (void *)
argument, but that would also mean immediately casting it to do
pointer arithmetic portably. Not a big deal.
> +{
> + return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
> +}
> +
> +static inline __uint64_t get_unaligned_be64(void *p)
> {
. . .
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 21:39 ` Alex Elder
@ 2009-08-28 22:15 ` Christoph Hellwig
2009-08-28 22:38 ` Alex Elder
0 siblings, 1 reply; 10+ messages in thread
From: Christoph Hellwig @ 2009-08-28 22:15 UTC (permalink / raw)
To: Alex Elder; +Cc: Christoph Hellwig, Gabriel Vlasiu, xfs
On Fri, Aug 28, 2009 at 04:39:49PM -0500, Alex Elder wrote:
> > +static inline __uint32_t __get_unaligned_be32(const __uint8_t *p)
>
>
> It would be nice for this interface (and others) to take a (void *)
> argument, but that would also mean immediately casting it to do
> pointer arithmetic portably. Not a big deal.
the __ routines are internal implementation details, the kernel
has non-__ prefixed versions that take void pointers, but I didn't
bother to add them to xfsprogs as we only do unaligned access to
64bit values.
That beeing said I dislike the interface taking void pointers as
it removes important error checking. The actually visible interface
should take __be16/32/64 types to enforce they are used on the right
type. Once I get some time I will push for that in the kernel again,
but for xfsprogs I really do want to stick to the kernel interfaces so
that we can share the code unmodified.
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 22:15 ` Christoph Hellwig
@ 2009-08-28 22:38 ` Alex Elder
0 siblings, 0 replies; 10+ messages in thread
From: Alex Elder @ 2009-08-28 22:38 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: Gabriel Vlasiu, xfs
Christoph Hellwig wrote:
> On Fri, Aug 28, 2009 at 04:39:49PM -0500, Alex Elder wrote:
>>> +static inline __uint32_t __get_unaligned_be32(const __uint8_t *p)
>>
>>
>> It would be nice for this interface (and others) to take a (void *)
>> argument, but that would also mean immediately casting it to do
>> pointer arithmetic portably. Not a big deal.
>
> the __ routines are internal implementation details, the kernel
> has non-__ prefixed versions that take void pointers, but I didn't
> bother to add them to xfsprogs as we only do unaligned access to
> 64bit values.
>
> That beeing said I dislike the interface taking void pointers as
> it removes important error checking. The actually visible interface
> should take __be16/32/64 types to enforce they are used on the right
> type. Once I get some time I will push for that in the kernel again,
> but for xfsprogs I really do want to stick to the kernel interfaces so
> that we can share the code unmodified.
The results should be int types: __be16, etc., I agree. But
I'm saying the unaligned addresses--which we (now) make no
assumptions about and treat as character pointers--I think
the void pointer explicitly captures that unaligned quality
(and avoids any need for a cast).
In any event I think it's fine either way. Really not a big
deal, just a tiny detail that only a geek could love to
argue about.
-Alex
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pushing out a new xfsprogs release, was Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-28 18:24 ` pushing out a new xfsprogs release, was " Christoph Hellwig
2009-08-28 21:20 ` Felix Blyakher
@ 2009-08-29 22:17 ` Michael Monnerie
2009-08-30 1:22 ` Eric Sandeen
1 sibling, 1 reply; 10+ messages in thread
From: Michael Monnerie @ 2009-08-29 22:17 UTC (permalink / raw)
To: xfs
On Freitag 28 August 2009 Christoph Hellwig wrote:
> What do people thing about pushing out a 3.0.3 xfsprogs
> release?
Is there the patch to repair my filesystem? I sent the metadump to Eric
once, I think he did some patches. Are they there, or do I need
something else also? I'm still having the problem, and would like to fix
it.
mfg zmi
--
// Michael Monnerie, Ing.BSc ----- http://it-management.at
// Tel: 0660 / 415 65 31 .network.your.ideas.
// PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import"
// Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4
// Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pushing out a new xfsprogs release, was Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-29 22:17 ` Michael Monnerie
@ 2009-08-30 1:22 ` Eric Sandeen
2009-08-30 8:44 ` Michael Monnerie
0 siblings, 1 reply; 10+ messages in thread
From: Eric Sandeen @ 2009-08-30 1:22 UTC (permalink / raw)
To: Michael Monnerie; +Cc: xfs
Michael Monnerie wrote:
> On Freitag 28 August 2009 Christoph Hellwig wrote:
>> What do people thing about pushing out a 3.0.3 xfsprogs
>> release?
>
> Is there the patch to repair my filesystem? I sent the metadump to Eric
> once, I think he did some patches. Are they there, or do I need
> something else also? I'm still having the problem, and would like to fix
> it.
>
> mfg zmi
Afraid I haven't fixed that one yet, sorry. If you could open a bug on
xfs.org's bugzilla it'd be much better for tracking ...
I did find that building xfsprogs w/o debug ASSERTs turned on, I could
get a clean fs after 2 runs, just to get you going again...
-Eric
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: pushing out a new xfsprogs release, was Re: [PATCH] xfsprogs: fix unaligned access in libxfs
2009-08-30 1:22 ` Eric Sandeen
@ 2009-08-30 8:44 ` Michael Monnerie
0 siblings, 0 replies; 10+ messages in thread
From: Michael Monnerie @ 2009-08-30 8:44 UTC (permalink / raw)
To: xfs
On Sonntag 30 August 2009 Eric Sandeen wrote:
> Afraid I haven't fixed that one yet, sorry. If you could open a bug
> on xfs.org's bugzilla it'd be much better for tracking ...
OK, looked there, but there are only 2 links: to kernel.org or
oss.sgi.com bugzillas. Which one should I use?
BTW, wouldn't it be better to declare on the Wiki which bugzilla to use?
> I did find that building xfsprogs w/o debug ASSERTs turned on, I
> could get a clean fs after 2 runs, just to get you going again...
What would I need to take out exactly? Sorry, I don't know what "debug
ASSERTs" are. I've seen from patches sent here those are commands, but
which ones are for debug?
mfg zmi
--
// Michael Monnerie, Ing.BSc ----- http://it-management.at
// Tel: 0660 / 415 65 31 .network.your.ideas.
// PGP Key: "curl -s http://zmi.at/zmi.asc | gpg --import"
// Fingerprint: AC19 F9D5 36ED CD8A EF38 500E CE14 91F7 1C12 09B4
// Keyserver: wwwkeys.eu.pgp.net Key-ID: 1C1209B4
_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2009-08-30 8:44 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-28 15:37 [PATCH] xfsprogs: fix unaligned access in libxfs Christoph Hellwig
2009-08-28 17:15 ` Eric Sandeen
2009-08-28 18:24 ` pushing out a new xfsprogs release, was " Christoph Hellwig
2009-08-28 21:20 ` Felix Blyakher
2009-08-29 22:17 ` Michael Monnerie
2009-08-30 1:22 ` Eric Sandeen
2009-08-30 8:44 ` Michael Monnerie
2009-08-28 21:39 ` Alex Elder
2009-08-28 22:15 ` Christoph Hellwig
2009-08-28 22:38 ` Alex Elder
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.