On Tue, 2012-03-20 at 09:53 -0400, Bryan Schumaker wrote: > Hi Dros, > > On 03/06/2012 08:46 PM, Weston Andros Adamson wrote: > > > Match wireshark's CRC-32 hash for easier debugging > > > > Signed-off-by: Weston Andros Adamson <dros@xxxxxxxxxx> > > --- > > Reposted with Trond's suggestion of splitting out hash calculation to a > > separate function. Now dprintks can use a fh's CRC instead of the > > multiline nfs_display_fhandle() when it makes sense. > > > > fs/nfs/inode.c | 23 ++++++++++++++++++++--- > > include/linux/nfs_fs.h | 8 ++++++++ > > 2 files changed, 28 insertions(+), 3 deletions(-) > > > > diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c > > index 99a4f52..3919ceb 100644 > > --- a/fs/nfs/inode.c > > +++ b/fs/nfs/inode.c > > @@ -39,6 +39,7 @@ > > #include <linux/slab.h> > > #include <linux/compat.h> > > #include <linux/freezer.h> > > +#include <linux/crc32.h> > > > > #include <asm/system.h> > > #include <asm/uaccess.h> > > @@ -1045,7 +1046,23 @@ struct nfs_fh *nfs_alloc_fhandle(void) > > return fh; > > } > > > > -/** > > +#ifdef RPC_DEBUG > > +/* > > + * _nfs_display_fhandle_hash - calculate the crc32 hash for the filehandle > > + * in the same way that wireshark does > > + * > > + * @fh: file handle > > + * > > + * For debugging only. > > + */ > > +u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh) > > +{ > > + /* wireshark uses 32-bit AUTODIN crc and does a bitwise > > + * not on the result */ > > + return ~crc32(0xFFFFFFFF, &fh->data[0], fh->size); > > +} > > + > > +/* > > * _nfs_display_fhandle - display an NFS file handle on the console > > * > > * @fh: file handle to display > > @@ -1053,7 +1070,6 @@ struct nfs_fh *nfs_alloc_fhandle(void) > > * > > * For debugging only. > > */ > > -#ifdef RPC_DEBUG > > void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption) > > { > > unsigned short i; > > @@ -1063,7 +1079,8 @@ void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption) > > return; > > } > > > > - printk(KERN_DEFAULT "%s at %p is %u bytes:\n", caption, fh, fh->size); > > + printk(KERN_DEFAULT "%s at %p is %u bytes, crc: 0x%08x:\n", > > + caption, fh, fh->size, _nfs_display_fhandle_hash(fh)); > > for (i = 0; i < fh->size; i += 16) { > > __be32 *pos = (__be32 *)&fh->data[i]; > > > > diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h > > index c07a757..ce8e436 100644 > > --- a/include/linux/nfs_fs.h > > +++ b/include/linux/nfs_fs.h > > @@ -396,6 +396,11 @@ static inline void nfs_free_fhandle(const struct nfs_fh *fh) > > } > > > > #ifdef RPC_DEBUG > > +extern u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh); > > +static inline u32 nfs_display_fhandle_hash(const struct nfs_fh *fh) > > +{ > > + return _nfs_display_fhandle_hash(fh); > > +} > > extern void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption); > > #define nfs_display_fhandle(fh, caption) \ > > do { \ > > @@ -403,6 +408,9 @@ extern void _nfs_display_fhandle(const struct nfs_fh *fh, const char *caption); > > _nfs_display_fhandle(fh, caption); \ > > } while (0) > > #else > > +static inline u32 nfs_display_fhandle_hash(const struct nfs_fh *fh) > > +{ > > > This function should return something... maybe 0? > > - Bryan > > > +} > > static inline void nfs_display_fhandle(const struct nfs_fh *fh, > > const char *caption) > > { > Yes. Stephen Rothwell pointed out the same, and so I've applied his patch to the 'testing' branch already. He also found a bunch of 'struct rpc_task' in the sunrpc and lockd code that were marked as 'unused variable', and so there is a patch to fix that too... -- Trond Myklebust Linux NFS client maintainer NetApp Trond.Myklebust@xxxxxxxxxx www.netapp.com ��.n��������+%������w��{.n�����{��w���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥