goto out_error;
 
        fl->fh.size = fhp->fh_handle.fh_size;
-       memcpy(fl->fh.data, &fhp->fh_handle.fh_base, fl->fh.size);
+       memcpy(fl->fh.data, &fhp->fh_handle.fh_raw, fl->fh.size);
 
        /* Give whole file layout segments */
        seg->offset = 0;
 
        /* must initialize before using! but maxsize doesn't matter */
        fh_init(&fh,0);
        fh.fh_handle.fh_size = f->size;
-       memcpy((char*)&fh.fh_handle.fh_base, f->data, f->size);
+       memcpy(&fh.fh_handle.fh_raw, f->data, f->size);
        fh.fh_export = NULL;
 
        access = (mode == O_WRONLY) ? NFSD_MAY_WRITE : NFSD_MAY_READ;
 
                return false;
        fh_init(fhp, NFS3_FHSIZE);
        fhp->fh_handle.fh_size = size;
-       memcpy(&fhp->fh_handle.fh_base, p, size);
+       memcpy(&fhp->fh_handle.fh_raw, p, size);
 
        return true;
 }
        *p++ = cpu_to_be32(size);
        if (size)
                p[XDR_QUADLEN(size) - 1] = 0;
-       memcpy(p, &fhp->fh_handle.fh_base, size);
+       memcpy(p, &fhp->fh_handle.fh_raw, size);
 
        return true;
 }
 
 
        BUG_ON(length > NFS4_FHSIZE);
        p = xdr_reserve_space(xdr, 4 + length);
-       xdr_encode_opaque(p, &fh->fh_base, length);
+       xdr_encode_opaque(p, &fh->fh_raw, length);
 }
 
 /*
 
 
        fh_put(&cstate->current_fh);
        cstate->current_fh.fh_handle.fh_size = putfh->pf_fhlen;
-       memcpy(&cstate->current_fh.fh_handle.fh_base, putfh->pf_fhval,
+       memcpy(&cstate->current_fh.fh_handle.fh_raw, putfh->pf_fhval,
               putfh->pf_fhlen);
        ret = fh_verify(rqstp, &cstate->current_fh, 0, NFSD_MAY_BYPASS_GSS);
 #ifdef CONFIG_NFSD_V4_2_INTER_SSC
        s_fh = &cstate->save_fh;
 
        copy->c_fh.size = s_fh->fh_handle.fh_size;
-       memcpy(copy->c_fh.data, &s_fh->fh_handle.fh_base, copy->c_fh.size);
+       memcpy(copy->c_fh.data, &s_fh->fh_handle.fh_raw, copy->c_fh.size);
        copy->stateid.seqid = cpu_to_be32(s_stid->si_generation);
        memcpy(copy->stateid.other, (void *)&s_stid->si_opaque,
               sizeof(stateid_opaque_t));
 
                }
                spin_unlock(&blocked_delegations_lock);
        }
-       hash = jhash(&fh->fh_base, fh->fh_size, 0);
+       hash = jhash(&fh->fh_raw, fh->fh_size, 0);
        if (test_bit(hash&255, bd->set[0]) &&
            test_bit((hash>>8)&255, bd->set[0]) &&
            test_bit((hash>>16)&255, bd->set[0]))
        u32 hash;
        struct bloom_pair *bd = &blocked_delegations;
 
-       hash = jhash(&fh->fh_base, fh->fh_size, 0);
+       hash = jhash(&fh->fh_raw, fh->fh_size, 0);
 
        spin_lock(&blocked_delegations_lock);
        __set_bit(hash&255, bd->set[bd->new]);
 
                p = xdr_reserve_space(xdr, fhp->fh_handle.fh_size + 4);
                if (!p)
                        goto out_resource;
-               p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base,
+               p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw,
                                        fhp->fh_handle.fh_size);
        }
        if (bmval0 & FATTR4_WORD0_FILEID) {
        p = xdr_reserve_space(xdr, len + 4);
        if (!p)
                return nfserr_resource;
-       p = xdr_encode_opaque(p, &fhp->fh_handle.fh_base, len);
+       p = xdr_encode_opaque(p, &fhp->fh_handle.fh_raw, len);
        return 0;
 }
 
 
        auth_domain_put(dom);
        if (len)
                return len;
-       
+
        mesg = buf;
        len = SIMPLE_TRANSACTION_LIMIT;
-       qword_addhex(&mesg, &len, (char*)&fh.fh_base, fh.fh_size);
+       qword_addhex(&mesg, &len, fh.fh_raw, fh.fh_size);
        mesg[-1] = '\n';
-       return mesg - buf;      
+       return mesg - buf;
 }
 
 /*
 
 char * SVCFH_fmt(struct svc_fh *fhp)
 {
        struct knfsd_fh *fh = &fhp->fh_handle;
+       static char buf[2+1+1+64*3+1];
 
-       static char buf[80];
-       sprintf(buf, "%d: %08x %08x %08x %08x %08x %08x",
-               fh->fh_size,
-               fh->fh_base.fh_pad[0],
-               fh->fh_base.fh_pad[1],
-               fh->fh_base.fh_pad[2],
-               fh->fh_base.fh_pad[3],
-               fh->fh_base.fh_pad[4],
-               fh->fh_base.fh_pad[5]);
+       if (fh->fh_size < 0 || fh->fh_size> 64)
+               return "bad-fh";
+       sprintf(buf, "%d: %*ph", fh->fh_size, fh->fh_size, fh->fh_raw);
        return buf;
 }
 
 
  *   filesystems must not use the values '0' or '0xff'. 'See enum fid_type'
  *   in include/linux/exportfs.h for currently registered values.
  */
-struct nfs_fhbase_new {
-       union {
-               struct {
-                       u8              fb_version_aux; /* == 1 */
-                       u8              fb_auth_type_aux;
-                       u8              fb_fsid_type_aux;
-                       u8              fb_fileid_type_aux;
-                       u32             fb_auth[1];
-               /*      u32             fb_fsid[0]; floating */
-               /*      u32             fb_fileid[0]; floating */
-               };
-               struct {
-                       u8              fb_version;     /* == 1 */
-                       u8              fb_auth_type;
-                       u8              fb_fsid_type;
-                       u8              fb_fileid_type;
-                       u32             fb_auth_flex[]; /* flexible-array member */
-               };
-       };
-};
 
 struct knfsd_fh {
-       unsigned int    fh_size;        /* significant for NFSv3.
-                                        * Points to the current size while building
-                                        * a new file handle
+       unsigned int    fh_size;        /*
+                                        * Points to the current size while
+                                        * building a new file handle.
                                         */
        union {
-               u32                     fh_pad[NFS4_FHSIZE/4];
-               struct nfs_fhbase_new   fh_new;
-       } fh_base;
+               char                    fh_raw[NFS4_FHSIZE];
+               struct {
+                       u8              fh_version;     /* == 1 */
+                       u8              fh_auth_type;   /* deprecated */
+                       u8              fh_fsid_type;
+                       u8              fh_fileid_type;
+                       u32             fh_fsid[]; /* flexible-array member */
+               };
+       };
 };
 
-#define        fh_version              fh_base.fh_new.fb_version
-#define        fh_fsid_type            fh_base.fh_new.fb_fsid_type
-#define        fh_auth_type            fh_base.fh_new.fb_auth_type
-#define        fh_fileid_type          fh_base.fh_new.fb_fileid_type
-#define        fh_fsid                 fh_base.fh_new.fb_auth_flex
-
 static inline __u32 ino_t_to_u32(ino_t ino)
 {
        return (__u32) ino;
 fh_copy_shallow(struct knfsd_fh *dst, struct knfsd_fh *src)
 {
        dst->fh_size = src->fh_size;
-       memcpy(&dst->fh_base, &src->fh_base, src->fh_size);
+       memcpy(&dst->fh_raw, &src->fh_raw, src->fh_size);
 }
 
 static __inline__ struct svc_fh *
 {
        if (fh1->fh_size != fh2->fh_size)
                return false;
-       if (memcmp(fh1->fh_base.fh_pad, fh2->fh_base.fh_pad, fh1->fh_size) != 0)
+       if (memcmp(fh1->fh_raw, fh2->fh_raw, fh1->fh_size) != 0)
                return false;
        return true;
 }
  */
 static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
 {
-       return ~crc32_le(0xFFFFFFFF, (unsigned char *)&fh->fh_base, fh->fh_size);
+       return ~crc32_le(0xFFFFFFFF, fh->fh_raw, fh->fh_size);
 }
 #else
 static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
 
        if (!p)
                return false;
        fh_init(fhp, NFS_FHSIZE);
-       memcpy(&fhp->fh_handle.fh_base, p, NFS_FHSIZE);
+       memcpy(&fhp->fh_handle.fh_raw, p, NFS_FHSIZE);
        fhp->fh_handle.fh_size = NFS_FHSIZE;
 
        return true;
        p = xdr_reserve_space(xdr, NFS_FHSIZE);
        if (!p)
                return false;
-       memcpy(p, &fhp->fh_handle.fh_base, NFS_FHSIZE);
+       memcpy(p, &fhp->fh_handle.fh_raw, NFS_FHSIZE);
 
        return true;
 }