fix filestreams on 32-bit boxes
PATCH 1/1 fix filestreams on 32-bit boxes
xfs_filestream_mount() sets up an mru cache with:
err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count,
(xfs_mru_cache_free_func_t)xfs_fstrm_free_func);but that cast is causing problems...
typedef void (*xfs_mru_cache_free_func_t)(unsigned long, void*);
but:
void xfs_fstrm_free_func(
xfs_ino_t ino,
fstrm_item_t *item)
so on a 32-bit box, it's casting (32, 32) args into (64, 32) and I assume it's getting garbage for *item, which subsequently causes an explosion.
With this change the filestreams xfsqa tests don't oops on my 32-bit box.
fs/xfs/xfs_filestream.c +1 -1
@@ -350,7 +350,7 @@ _xfs_filestream_update_ag(/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ void xfs_fstrm_free_func ( -xfs_ino_t ino, +unsigned long ino,fstrm_item_t *item) {xfs_inode_t *ip = item->ip;
Quoted 27 lines · Eric Sandeen
xfs_filestream_mount()sets up an mru cache with:err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count, (xfs_mru_cache_free_func_t)xfs_fstrm_free_func);but that cast is causing problems...
typedef void (*xfs_mru_cache_free_func_t)(unsigned long, void*);
but:
void xfs_fstrm_free_func(
xfs_ino_tino,
fstrm_item_t*item)so on a 32-bit box, it's casting (32, 32) args into (64, 32) and I assume it's getting garbage for *item, which subsequently causes an explosion.
With this change the filestreams xfsqa tests don't oops on my 32-bit box.
Signed-off-by Eric Sandeen <[email protected]>Index:
linux-2.6.22.i386/fs/xfs/xfs_filestream.c
===================================================================
fs/xfs/xfs_filestream.c _xfs_filestream_update_ag( · line 356
Quoted 8 lines
fs/xfs/xfs_filestream.c +1
-1@@ -350,7 +350,7 @@ _xfs_filestream_update_ag(/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ void xfs_fstrm_free_func ( -xfs_ino_t ino, +unsigned long ino,fstrm_item_t *item) {xfs_inode_t *ip = item->ip;
hmmm - probably should make xfs_fstrm_free_func follow the correct prototype and convert the item into an opaque void * as well. Then we can remove the cast that hid this problem in xfs_filestream_mount()....
Nice catch, though, Eric.
Cheers,
Dave.
Signature · 3 lines
Dave Chinner Principal Engineer SGI Australian Software Group
Quoted 10 lines · David Chinner
hmmm - probably should make
xfs_fstrm_free_funcfollow the correct prototype and convert the item into an opaque void * as well. Then we can remove the cast that hid this problem inxfs_filestream_mount()....Nice catch, though, Eric.
Cheers,
Dave.
Yep, I thought of removing the cast on the way home, as did Christoph, wherever he is :)
---------------------
xfs_filestream_mount() sets up an mru cache with:
err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count,
(xfs_mru_cache_free_func_t)xfs_fstrm_free_func);but that cast is causing problems...
typedef void (*xfs_mru_cache_free_func_t)(unsigned long, void*);
but:
void xfs_fstrm_free_func(
xfs_ino_t ino,
fstrm_item_t *item)
so on a 32-bit box, it's casting (32, 32) args into (64, 32) and I assume it's getting garbage for *item, which subsequently causes an explosion.
With this change the filestreams xfsqa tests don't oops on my 32-bit box.
fs/xfs/xfs_filestream.c +4 -3
@@ -350,9 +350,10 @@ _xfs_filestream_update_ag(/* xfs_fstrm_free_func(): callback for freeing cached stream items. */ void xfs_fstrm_free_func ( -xfs_ino_t ino, -fstrm_item_t *item) +unsigned long ino, +void *data) { +fstrm_item_t *item = (fstrm_item_t *)data;xfs_inode_t *ip = item->ip;int ref;
@@ -438,7 +439,7 @@ xfs_filestream_mount( grp_count =10 ; err =xfs_mru_cache_create (&mp->m_filestream, lifetime, grp_count, - (xfs_mru_cache_free_func_t )xfs_fstrm_free_func); + xfs_fstrm_free_func);return err; }
Quoted 11 lines · Eric Sandeen
xfs_filestream_mount()sets up an mru cache with:err = xfs_mru_cache_create(&mp->m_filestream, lifetime, grp_count, (xfs_mru_cache_free_func_t)xfs_fstrm_free_func);but that cast is causing problems...
typedef void (*xfs_mru_cache_free_func_t)(unsigned long, void*);
but:
Quoted 8 lines
void xfs_fstrm_free_func(
xfs_ino_tino,
fstrm_item_t*item)so on a 32-bit box, it's casting (32, 32) args into (64, 32) and I assume it's getting garbage for *item, which subsequently causes an explosion.
With this change the filestreams xfsqa tests don't oops on my 32-bit box.
Please also kill that blody cast. Function pointer casts are wonderful for hiding bugs like the one you just fixed from compilers, but that's it.