static inline int xfs_attr_sf_totsize(struct xfs_inode *dp)
 {
-       struct xfs_attr_shortform *sf;
+       struct xfs_attr_shortform *sf = dp->i_af.if_data;
 
-       sf = (struct xfs_attr_shortform *)dp->i_af.if_u1.if_data;
        return be16_to_cpu(sf->hdr.totsize);
 }
 
 
        if (ifp->if_format == XFS_DINODE_FMT_EXTENTS)
                ifp->if_format = XFS_DINODE_FMT_LOCAL;
        xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
-       hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
+       hdr = ifp->if_data;
        memset(hdr, 0, sizeof(*hdr));
        hdr->totsize = cpu_to_be16(sizeof(*hdr));
        xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
        struct xfs_attr_sf_entry **sfep,
        unsigned int             *basep)
 {
-       struct xfs_attr_shortform *sf;
+       struct xfs_attr_shortform *sf = args->dp->i_af.if_data;
        struct xfs_attr_sf_entry *sfe;
        unsigned int            base = sizeof(struct xfs_attr_sf_hdr);
        int                     size = 0;
        int                     end;
        int                     i;
 
-       sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data;
        sfe = &sf->list[0];
        end = sf->hdr.count;
        for (i = 0; i < end; sfe = xfs_attr_sf_nextentry(sfe),
        struct xfs_da_args              *args,
        int                             forkoff)
 {
-       struct xfs_attr_shortform       *sf;
+       struct xfs_inode                *dp = args->dp;
+       struct xfs_mount                *mp = dp->i_mount;
+       struct xfs_ifork                *ifp = &dp->i_af;
+       struct xfs_attr_shortform       *sf = ifp->if_data;
        struct xfs_attr_sf_entry        *sfe;
        int                             offset, size;
-       struct xfs_mount                *mp;
-       struct xfs_inode                *dp;
-       struct xfs_ifork                *ifp;
 
        trace_xfs_attr_sf_add(args);
 
-       dp = args->dp;
-       mp = dp->i_mount;
        dp->i_forkoff = forkoff;
 
-       ifp = &dp->i_af;
        ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
-       sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
        if (xfs_attr_sf_findname(args, &sfe, NULL) == -EEXIST)
                ASSERT(0);
 
        offset = (char *)sfe - (char *)sf;
        size = xfs_attr_sf_entsize_byname(args->namelen, args->valuelen);
        xfs_idata_realloc(dp, size, XFS_ATTR_FORK);
-       sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
+       sf = ifp->if_data;
        sfe = (struct xfs_attr_sf_entry *)((char *)sf + offset);
 
        sfe->namelen = args->namelen;
 xfs_attr_sf_removename(
        struct xfs_da_args              *args)
 {
-       struct xfs_attr_shortform       *sf;
+       struct xfs_inode                *dp = args->dp;
+       struct xfs_mount                *mp = dp->i_mount;
+       struct xfs_attr_shortform       *sf = dp->i_af.if_data;
        struct xfs_attr_sf_entry        *sfe;
        int                             size = 0, end, totsize;
        unsigned int                    base;
-       struct xfs_mount                *mp;
-       struct xfs_inode                *dp;
        int                             error;
 
        trace_xfs_attr_sf_remove(args);
 
-       dp = args->dp;
-       mp = dp->i_mount;
-       sf = (struct xfs_attr_shortform *)dp->i_af.if_u1.if_data;
-
        error = xfs_attr_sf_findname(args, &sfe, &base);
 
        /*
  */
 /*ARGSUSED*/
 int
-xfs_attr_shortform_lookup(xfs_da_args_t *args)
+xfs_attr_shortform_lookup(
+       struct xfs_da_args              *args)
 {
-       struct xfs_attr_shortform *sf;
-       struct xfs_attr_sf_entry *sfe;
-       int i;
-       struct xfs_ifork *ifp;
+       struct xfs_ifork                *ifp = &args->dp->i_af;
+       struct xfs_attr_shortform       *sf = ifp->if_data;
+       struct xfs_attr_sf_entry        *sfe;
+       int                             i;
 
        trace_xfs_attr_sf_lookup(args);
 
-       ifp = &args->dp->i_af;
        ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
-       sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
        sfe = &sf->list[0];
        for (i = 0; i < sf->hdr.count;
                                sfe = xfs_attr_sf_nextentry(sfe), i++) {
  */
 int
 xfs_attr_shortform_getvalue(
-       struct xfs_da_args      *args)
+       struct xfs_da_args              *args)
 {
-       struct xfs_attr_shortform *sf;
-       struct xfs_attr_sf_entry *sfe;
-       int                     i;
+       struct xfs_attr_shortform       *sf = args->dp->i_af.if_data;
+       struct xfs_attr_sf_entry        *sfe;
+       int                             i;
 
        ASSERT(args->dp->i_af.if_format == XFS_DINODE_FMT_LOCAL);
-       sf = (struct xfs_attr_shortform *)args->dp->i_af.if_u1.if_data;
        sfe = &sf->list[0];
        for (i = 0; i < sf->hdr.count;
                                sfe = xfs_attr_sf_nextentry(sfe), i++) {
 xfs_attr_shortform_to_leaf(
        struct xfs_da_args              *args)
 {
-       struct xfs_inode                *dp;
-       struct xfs_attr_shortform       *sf;
+       struct xfs_inode                *dp = args->dp;
+       struct xfs_ifork                *ifp = &dp->i_af;
+       struct xfs_attr_shortform       *sf = ifp->if_data;
        struct xfs_attr_sf_entry        *sfe;
        struct xfs_da_args              nargs;
        char                            *tmpbuffer;
        int                             error, i, size;
        xfs_dablk_t                     blkno;
        struct xfs_buf                  *bp;
-       struct xfs_ifork                *ifp;
 
        trace_xfs_attr_sf_to_leaf(args);
 
-       dp = args->dp;
-       ifp = &dp->i_af;
-       sf = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
        size = be16_to_cpu(sf->hdr.totsize);
        tmpbuffer = kmem_alloc(size, 0);
        ASSERT(tmpbuffer != NULL);
-       memcpy(tmpbuffer, ifp->if_u1.if_data, size);
+       memcpy(tmpbuffer, ifp->if_data, size);
        sf = (struct xfs_attr_shortform *)tmpbuffer;
 
        xfs_idata_realloc(dp, -size, XFS_ATTR_FORK);
 
        ASSERT(ifp->if_nextents == 0);
 
        xfs_bmap_forkoff_reset(ip, whichfork);
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
        ifp->if_height = 0;
        ifp->if_format = XFS_DINODE_FMT_EXTENTS;
        xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
        xfs_bmap_local_to_extents_empty(tp, ip, whichfork);
        flags |= XFS_ILOG_CORE;
 
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
        ifp->if_height = 0;
 
        rec.br_startoff = 0;
 
                return 1;
        if (dp->i_disk_size > xfs_inode_data_fork_size(dp))
                return 0;
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        return !sfp->count;
 }
 
 
        int                     newoffset;      /* offset from current entry */
        unsigned int            offset = geo->data_entry_offset;
        xfs_dir2_sf_entry_t     *sfep;          /* sf entry pointer */
-       xfs_dir2_sf_hdr_t       *oldsfp;        /* old shortform header  */
+       struct xfs_dir2_sf_hdr  *oldsfp = ifp->if_data;
        xfs_dir2_sf_hdr_t       *sfp;           /* shortform header  */
        __be16                  *tagp;          /* end of data entry */
        struct xfs_name         name;
        ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
        ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent));
 
-       oldsfp = (xfs_dir2_sf_hdr_t *)ifp->if_u1.if_data;
-
        ASSERT(ifp->if_bytes == dp->i_disk_size);
-       ASSERT(ifp->if_u1.if_data != NULL);
+       ASSERT(oldsfp != NULL);
        ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(oldsfp->i8count));
        ASSERT(dp->i_df.if_nextents == 0);
 
 
 xfs_dir2_sf_addname(
        xfs_da_args_t           *args)          /* operation arguments */
 {
-       xfs_inode_t             *dp;            /* incore directory inode */
+       struct xfs_inode        *dp = args->dp;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     error;          /* error return value */
        int                     incr_isize;     /* total change in size */
        int                     new_isize;      /* size after adding name */
        int                     objchange;      /* changing to 8-byte inodes */
        xfs_dir2_data_aoff_t    offset = 0;     /* offset for new entry */
        int                     pick;           /* which algorithm to use */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
        xfs_dir2_sf_entry_t     *sfep = NULL;   /* shortform entry */
 
        trace_xfs_dir2_sf_addname(args);
 
        ASSERT(xfs_dir2_sf_lookup(args) == -ENOENT);
-       dp = args->dp;
        ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL);
        ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent));
        ASSERT(dp->i_df.if_bytes == dp->i_disk_size);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
        ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count));
        /*
         * Compute entry (and change in) size.
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
-       int                     byteoff;        /* byte offset in sf dir */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
+       int                     byteoff = (int)((char *)sfep - (char *)sfp);
 
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
-       byteoff = (int)((char *)sfep - (char *)sfp);
        /*
         * Grow the in-inode space.
         */
        /*
         * Need to set up again due to realloc of the inode data.
         */
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        sfep = (xfs_dir2_sf_entry_t *)((char *)sfp + byteoff);
        /*
         * Fill in the new entry.
        /*
         * Copy the old directory to the stack buffer.
         */
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
        old_isize = (int)dp->i_disk_size;
        buf = kmem_alloc(old_isize, 0);
        oldsfp = (xfs_dir2_sf_hdr_t *)buf;
-       memcpy(oldsfp, sfp, old_isize);
+       memcpy(oldsfp, dp->i_df.if_data, old_isize);
        /*
         * Loop over the old directory finding the place we're going
         * to insert the new entry.
        /*
         * Reset the pointer since the buffer was reallocated.
         */
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        /*
         * Copy the first part of the directory, including the header.
         */
        int                     i;              /* entry number */
        xfs_dir2_data_aoff_t    offset;         /* data block offset */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     size;           /* entry's data size */
        int                     used;           /* data bytes used */
 
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
        size = xfs_dir2_data_entsize(mp, args->namelen);
        offset = args->geo->data_first_offset;
        sfep = xfs_dir2_sf_firstentry(sfp);
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     i;              /* entry number */
        int                     i8count;        /* number of big inode#s */
        xfs_ino_t               ino;            /* entry inode number */
        int                     offset;         /* data offset */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform dir entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
 
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
        offset = args->geo->data_first_offset;
        ino = xfs_dir2_sf_get_parent_ino(sfp);
        i8count = ino > XFS_DIR2_MAX_SHORT_INUM;
        /*
         * Fill in the header,
         */
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        sfp->i8count = i8count;
        /*
         * Now can put in the inode number, since i8count is set.
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     i;              /* entry index */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform directory entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
        enum xfs_dacmp          cmp;            /* comparison result */
        xfs_dir2_sf_entry_t     *ci_sfep;       /* case-insens. entry */
 
        ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL);
        ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent));
        ASSERT(dp->i_df.if_bytes == dp->i_disk_size);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
        ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count));
        /*
         * Special case for .
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     byteoff;        /* offset of removed entry */
        int                     entsize;        /* this entry's size */
        int                     i;              /* shortform entry index */
        int                     newsize;        /* new inode size */
        int                     oldsize;        /* old inode size */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform directory entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
 
        trace_xfs_dir2_sf_removename(args);
 
        oldsize = (int)dp->i_disk_size;
        ASSERT(oldsize >= offsetof(struct xfs_dir2_sf_hdr, parent));
        ASSERT(dp->i_df.if_bytes == oldsize);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
        ASSERT(oldsize >= xfs_dir2_sf_hdr_size(sfp->i8count));
        /*
         * Loop over the old directory entries.
         * Reallocate, making it smaller.
         */
        xfs_idata_realloc(dp, newsize - oldsize, XFS_DATA_FORK);
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        /*
         * Are we changing inode number size?
         */
        struct xfs_inode        *dp,
        xfs_ino_t               inum)
 {
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     newsize;
-       struct xfs_dir2_sf_hdr  *sfp;
 
        if (dp->i_df.if_format != XFS_DINODE_FMT_LOCAL)
                return false;
 
-       sfp = (struct xfs_dir2_sf_hdr *)dp->i_df.if_u1.if_data;
        newsize = dp->i_df.if_bytes + (sfp->count + 1) * XFS_INO64_DIFF;
 
        return inum > XFS_DIR2_MAX_SHORT_INUM &&
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        int                     i;              /* entry index */
        xfs_ino_t               ino=0;          /* entry old inode number */
        int                     i8elevated;     /* sf_toino8 set i8count=1 */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform directory entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
 
        trace_xfs_dir2_sf_replace(args);
 
        ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL);
        ASSERT(dp->i_disk_size >= offsetof(struct xfs_dir2_sf_hdr, parent));
        ASSERT(dp->i_df.if_bytes == dp->i_disk_size);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
        ASSERT(dp->i_disk_size >= xfs_dir2_sf_hdr_size(sfp->i8count));
 
        /*
                 */
                xfs_dir2_sf_toino8(args);
                i8elevated = 1;
-               sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+               sfp = dp->i_df.if_data;
        } else
                i8elevated = 0;
 
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *oldsfp = dp->i_df.if_data;
        char                    *buf;           /* old dir's buffer */
        int                     i;              /* entry index */
        int                     newsize;        /* new inode size */
        xfs_dir2_sf_entry_t     *oldsfep;       /* old sf entry */
-       xfs_dir2_sf_hdr_t       *oldsfp;        /* old sf directory */
        int                     oldsize;        /* old inode size */
        xfs_dir2_sf_entry_t     *sfep;          /* new sf entry */
        xfs_dir2_sf_hdr_t       *sfp;           /* new sf directory */
         */
        oldsize = dp->i_df.if_bytes;
        buf = kmem_alloc(oldsize, 0);
-       oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
        ASSERT(oldsfp->i8count == 1);
        memcpy(buf, oldsfp, oldsize);
        /*
         * Reset our pointers, the data has moved.
         */
        oldsfp = (xfs_dir2_sf_hdr_t *)buf;
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        /*
         * Fill in the new header.
         */
 {
        struct xfs_inode        *dp = args->dp;
        struct xfs_mount        *mp = dp->i_mount;
+       struct xfs_dir2_sf_hdr  *oldsfp = dp->i_df.if_data;
        char                    *buf;           /* old dir's buffer */
        int                     i;              /* entry index */
        int                     newsize;        /* new inode size */
        xfs_dir2_sf_entry_t     *oldsfep;       /* old sf entry */
-       xfs_dir2_sf_hdr_t       *oldsfp;        /* old sf directory */
        int                     oldsize;        /* old inode size */
        xfs_dir2_sf_entry_t     *sfep;          /* new sf entry */
        xfs_dir2_sf_hdr_t       *sfp;           /* new sf directory */
         */
        oldsize = dp->i_df.if_bytes;
        buf = kmem_alloc(oldsize, 0);
-       oldsfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
        ASSERT(oldsfp->i8count == 0);
        memcpy(buf, oldsfp, oldsize);
        /*
         * Reset our pointers, the data has moved.
         */
        oldsfp = (xfs_dir2_sf_hdr_t *)buf;
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       sfp = dp->i_df.if_data;
        /*
         * Fill in the new header.
         */
 
 xfs_iext_find_first_leaf(
        struct xfs_ifork        *ifp)
 {
-       struct xfs_iext_node    *node = ifp->if_u1.if_root;
+       struct xfs_iext_node    *node = ifp->if_data;
        int                     height;
 
        if (!ifp->if_height)
 xfs_iext_find_last_leaf(
        struct xfs_ifork        *ifp)
 {
-       struct xfs_iext_node    *node = ifp->if_u1.if_root;
+       struct xfs_iext_node    *node = ifp->if_data;
        int                     height, i;
 
        if (!ifp->if_height)
        xfs_fileoff_t           offset,
        int                     level)
 {
-       struct xfs_iext_node    *node = ifp->if_u1.if_root;
+       struct xfs_iext_node    *node = ifp->if_data;
        int                     height, i;
 
        if (!ifp->if_height)
        int                     i;
 
        if (ifp->if_height == 1) {
-               struct xfs_iext_leaf *prev = ifp->if_u1.if_root;
+               struct xfs_iext_leaf *prev = ifp->if_data;
 
                node->keys[0] = xfs_iext_leaf_key(prev, 0);
                node->ptrs[0] = prev;
        } else  {
-               struct xfs_iext_node *prev = ifp->if_u1.if_root;
+               struct xfs_iext_node *prev = ifp->if_data;
 
                ASSERT(ifp->if_height > 1);
 
        for (i = 1; i < KEYS_PER_NODE; i++)
                node->keys[i] = XFS_IEXT_KEY_INVALID;
 
-       ifp->if_u1.if_root = node;
+       ifp->if_data = node;
        ifp->if_height++;
 }
 
        int                     level,
        void                    *ptr)
 {
-       struct xfs_iext_node    *node = ifp->if_u1.if_root;
+       struct xfs_iext_node    *node = ifp->if_data;
        int                     height, i;
 
        for (height = ifp->if_height; height > level; height--) {
 {
        ASSERT(ifp->if_bytes == 0);
 
-       ifp->if_u1.if_root = kmem_zalloc(sizeof(struct xfs_iext_rec), KM_NOFS);
+       ifp->if_data = kmem_zalloc(sizeof(struct xfs_iext_rec), KM_NOFS);
        ifp->if_height = 1;
 
        /* now that we have a node step into it */
-       cur->leaf = ifp->if_u1.if_root;
+       cur->leaf = ifp->if_data;
        cur->pos = 0;
 }
 
        if (new_size / sizeof(struct xfs_iext_rec) == RECS_PER_LEAF)
                new_size = NODE_SIZE;
 
-       new = krealloc(ifp->if_u1.if_root, new_size, GFP_NOFS | __GFP_NOFAIL);
+       new = krealloc(ifp->if_data, new_size, GFP_NOFS | __GFP_NOFAIL);
        memset(new + ifp->if_bytes, 0, new_size - ifp->if_bytes);
-       ifp->if_u1.if_root = new;
+       ifp->if_data = new;
        cur->leaf = new;
 }
 
                 * If we are at the root and only one entry is left we can just
                 * free this node and update the root pointer.
                 */
-               ASSERT(node == ifp->if_u1.if_root);
-               ifp->if_u1.if_root = node->ptrs[0];
+               ASSERT(node == ifp->if_data);
+               ifp->if_data = node->ptrs[0];
                ifp->if_height--;
                kmem_free(node);
        }
        struct xfs_ifork        *ifp)
 {
        ifp->if_height--;
-       kmem_free(ifp->if_u1.if_root);
-       ifp->if_u1.if_root = NULL;
+       kmem_free(ifp->if_data);
+       ifp->if_data = NULL;
 }
 
 void
        trace_xfs_iext_remove(ip, cur, state, _RET_IP_);
 
        ASSERT(ifp->if_height > 0);
-       ASSERT(ifp->if_u1.if_root != NULL);
+       ASSERT(ifp->if_data != NULL);
        ASSERT(xfs_iext_valid(ifp, cur));
 
        xfs_iext_inc_seq(ifp);
 xfs_iext_destroy(
        struct xfs_ifork        *ifp)
 {
-       xfs_iext_destroy_node(ifp->if_u1.if_root, ifp->if_height);
+       xfs_iext_destroy_node(ifp->if_data, ifp->if_height);
 
        ifp->if_bytes = 0;
        ifp->if_height = 0;
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
 }
 
                mem_size++;
 
        if (size) {
-               ifp->if_u1.if_data = kmem_alloc(mem_size, KM_NOFS);
-               memcpy(ifp->if_u1.if_data, data, size);
+               char *new_data = kmem_alloc(mem_size, KM_NOFS);
+
+               memcpy(new_data, data, size);
                if (zero_terminate)
-                       ifp->if_u1.if_data[size] = '\0';
+                       new_data[size] = '\0';
+
+               ifp->if_data = new_data;
        } else {
-               ifp->if_u1.if_data = NULL;
+               ifp->if_data = NULL;
        }
 
        ifp->if_bytes = size;
        }
 
        ifp->if_bytes = 0;
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
        ifp->if_height = 0;
        if (size) {
                dp = (xfs_bmbt_rec_t *) XFS_DFORK_PTR(dip, whichfork);
                         ifp->if_broot, size);
 
        ifp->if_bytes = 0;
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
        ifp->if_height = 0;
        return 0;
 }
                return;
 
        if (new_size == 0) {
-               kmem_free(ifp->if_u1.if_data);
-               ifp->if_u1.if_data = NULL;
+               kmem_free(ifp->if_data);
+               ifp->if_data = NULL;
                ifp->if_bytes = 0;
                return;
        }
 
-       ifp->if_u1.if_data = krealloc(ifp->if_u1.if_data, new_size,
-                                     GFP_NOFS | __GFP_NOFAIL);
+       ifp->if_data = krealloc(ifp->if_data, new_size,
+                       GFP_NOFS | __GFP_NOFAIL);
        ifp->if_bytes = new_size;
 }
 
 
        switch (ifp->if_format) {
        case XFS_DINODE_FMT_LOCAL:
-               kmem_free(ifp->if_u1.if_data);
-               ifp->if_u1.if_data = NULL;
+               kmem_free(ifp->if_data);
+               ifp->if_data = NULL;
                break;
        case XFS_DINODE_FMT_EXTENTS:
        case XFS_DINODE_FMT_BTREE:
        case XFS_DINODE_FMT_LOCAL:
                if ((iip->ili_fields & dataflag[whichfork]) &&
                    (ifp->if_bytes > 0)) {
-                       ASSERT(ifp->if_u1.if_data != NULL);
+                       ASSERT(ifp->if_data != NULL);
                        ASSERT(ifp->if_bytes <= xfs_inode_fork_size(ip, whichfork));
-                       memcpy(cp, ifp->if_u1.if_data, ifp->if_bytes);
+                       memcpy(cp, ifp->if_data, ifp->if_bytes);
                }
                break;
 
        case S_IFDIR: {
                struct xfs_mount        *mp = ip->i_mount;
                struct xfs_ifork        *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK);
-               struct xfs_dir2_sf_hdr  *sfp;
+               struct xfs_dir2_sf_hdr  *sfp = ifp->if_data;
 
-               sfp = (struct xfs_dir2_sf_hdr *)ifp->if_u1.if_data;
                fa = xfs_dir2_sf_verify(mp, sfp, ifp->if_bytes);
                break;
        }
        case S_IFLNK: {
                struct xfs_ifork        *ifp = xfs_ifork_ptr(ip, XFS_DATA_FORK);
 
-               fa = xfs_symlink_shortform_verify(ifp->if_u1.if_data,
-                               ifp->if_bytes);
+               fa = xfs_symlink_shortform_verify(ifp->if_data, ifp->if_bytes);
                break;
        }
        default:
 
        if (fa) {
                xfs_inode_verifier_error(ip, -EFSCORRUPTED, "data fork",
-                               ip->i_df.if_u1.if_data, ip->i_df.if_bytes, fa);
+                               ip->i_df.if_data, ip->i_df.if_bytes, fa);
                return -EFSCORRUPTED;
        }
 
        if (!xfs_inode_has_attr_fork(ip)) {
                fa = __this_address;
        } else {
-               struct xfs_attr_shortform       *sfp;
-               struct xfs_ifork                *ifp;
-               int64_t                         size;
-
-               ASSERT(ip->i_af.if_format == XFS_DINODE_FMT_LOCAL);
-               ifp = xfs_ifork_ptr(ip, XFS_ATTR_FORK);
-               sfp = (struct xfs_attr_shortform *)ifp->if_u1.if_data;
-               size = ifp->if_bytes;
+               struct xfs_ifork                *ifp = &ip->i_af;
 
-               fa = xfs_attr_shortform_verify(sfp, size);
+               ASSERT(ifp->if_format == XFS_DINODE_FMT_LOCAL);
+               fa = xfs_attr_shortform_verify(ifp->if_data, ifp->if_bytes);
        }
        if (fa) {
                xfs_inode_verifier_error(ip, -EFSCORRUPTED, "attr fork",
-                               ifp->if_u1.if_data, ifp->if_bytes, fa);
+                               ifp->if_data, ifp->if_bytes, fa);
                return -EFSCORRUPTED;
        }
 
 
  * File incore extent information, present for each of data & attr forks.
  */
 struct xfs_ifork {
-       int64_t                 if_bytes;       /* bytes in if_u1 */
+       int64_t                 if_bytes;       /* bytes in if_data */
        struct xfs_btree_block  *if_broot;      /* file's incore btree root */
        unsigned int            if_seq;         /* fork mod counter */
        int                     if_height;      /* height of the extent tree */
-       union {
-               void            *if_root;       /* extent tree root */
-               char            *if_data;       /* inline file data */
-       } if_u1;
+       void                    *if_data;       /* extent tree root or
+                                                  inline data */
        xfs_extnum_t            if_nextents;    /* # of extents in this fork */
        short                   if_broot_bytes; /* bytes allocated for root */
        int8_t                  if_format;      /* format of this fork */
 
 
        if (!xfs_has_crc(mp)) {
                bp->b_ops = NULL;
-               memcpy(bp->b_addr, ifp->if_u1.if_data, ifp->if_bytes);
+               memcpy(bp->b_addr, ifp->if_data, ifp->if_bytes);
                xfs_trans_log_buf(tp, bp, 0, ifp->if_bytes - 1);
                return;
        }
 
        buf = bp->b_addr;
        buf += xfs_symlink_hdr_set(mp, ip->i_ino, 0, ifp->if_bytes, bp);
-       memcpy(buf, ifp->if_u1.if_data, ifp->if_bytes);
+       memcpy(buf, ifp->if_data, ifp->if_bytes);
        xfs_trans_log_buf(tp, bp, 0, sizeof(struct xfs_dsymlink_hdr) +
                                        ifp->if_bytes - 1);
 }
 
        struct xfs_scrub                *sc)
 {
        struct xchk_xattr_buf           *ab = sc->buf;
-       struct xfs_attr_shortform       *sf;
+       struct xfs_ifork                *ifp = &sc->ip->i_af;
+       struct xfs_attr_shortform       *sf = ifp->if_data;
        struct xfs_attr_sf_entry        *sfe;
        struct xfs_attr_sf_entry        *next;
-       struct xfs_ifork                *ifp;
-       unsigned char                   *end;
+       unsigned char                   *end = ifp->if_data + ifp->if_bytes;
        int                             i;
        int                             error = 0;
 
-       ifp = xfs_ifork_ptr(sc->ip, XFS_ATTR_FORK);
-
        bitmap_zero(ab->usedmap, ifp->if_bytes);
-       sf = (struct xfs_attr_shortform *)sc->ip->i_af.if_u1.if_data;
-       end = (unsigned char *)ifp->if_u1.if_data + ifp->if_bytes;
        xchk_xattr_set_map(sc, ab->usedmap, 0, sizeof(sf->hdr));
 
        sfe = &sf->list[0];
 
        struct xfs_mount        *mp = dp->i_mount;
        struct xfs_da_geometry  *geo = mp->m_dir_geo;
        struct xfs_dir2_sf_entry *sfep;
-       struct xfs_dir2_sf_hdr  *sfp;
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        xfs_ino_t               ino;
        xfs_dir2_dataptr_t      dapos;
        unsigned int            i;
        int                     error;
 
        ASSERT(dp->i_df.if_bytes == dp->i_disk_size);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-
-       sfp = (struct xfs_dir2_sf_hdr *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
 
        /* dot entry */
        dapos = xfs_dir2_db_off_to_dataptr(geo, geo->datablk,
 
        /* Inline symlink? */
        if (ifp->if_format == XFS_DINODE_FMT_LOCAL) {
                if (len > xfs_inode_data_fork_size(ip) ||
-                   len > strnlen(ifp->if_u1.if_data, xfs_inode_data_fork_size(ip)))
+                   len > strnlen(ifp->if_data, xfs_inode_data_fork_size(ip)))
                        xchk_fblock_set_corrupt(sc, XFS_DATA_FORK, 0);
                return 0;
        }
 
        struct xfs_attrlist_cursor_kern *cursor = &context->cursor;
        struct xfs_inode                *dp = context->dp;
        struct xfs_attr_sf_sort         *sbuf, *sbp;
-       struct xfs_attr_shortform       *sf;
+       struct xfs_attr_shortform       *sf = dp->i_af.if_data;
        struct xfs_attr_sf_entry        *sfe;
        int                             sbsize, nsbuf, count, i;
        int                             error = 0;
 
-       sf = (struct xfs_attr_shortform *)dp->i_af.if_u1.if_data;
        ASSERT(sf != NULL);
        if (!sf->hdr.count)
                return 0;
 
        struct xfs_mount        *mp = dp->i_mount;
        xfs_dir2_dataptr_t      off;            /* current entry's offset */
        xfs_dir2_sf_entry_t     *sfep;          /* shortform directory entry */
-       xfs_dir2_sf_hdr_t       *sfp;           /* shortform structure */
+       struct xfs_dir2_sf_hdr  *sfp = dp->i_df.if_data;
        xfs_dir2_dataptr_t      dot_offset;
        xfs_dir2_dataptr_t      dotdot_offset;
        xfs_ino_t               ino;
 
        ASSERT(dp->i_df.if_format == XFS_DINODE_FMT_LOCAL);
        ASSERT(dp->i_df.if_bytes == dp->i_disk_size);
-       ASSERT(dp->i_df.if_u1.if_data != NULL);
-
-       sfp = (xfs_dir2_sf_hdr_t *)dp->i_df.if_u1.if_data;
+       ASSERT(sfp != NULL);
 
        /*
         * If the block number in the offset is out of range, we're done.
 
        case S_IFLNK:
                ip->i_df.if_format = XFS_DINODE_FMT_EXTENTS;
                ip->i_df.if_bytes = 0;
-               ip->i_df.if_u1.if_root = NULL;
+               ip->i_df.if_data = NULL;
                break;
        default:
                ASSERT(0);
         * already been freed by xfs_attr_inactive.
         */
        if (ip->i_df.if_format == XFS_DINODE_FMT_LOCAL) {
-               kmem_free(ip->i_df.if_u1.if_data);
-               ip->i_df.if_u1.if_data = NULL;
+               kmem_free(ip->i_df.if_data);
+               ip->i_df.if_data = NULL;
                ip->i_df.if_bytes = 0;
        }
 
 
                        ~(XFS_ILOG_DEXT | XFS_ILOG_DBROOT | XFS_ILOG_DEV);
                if ((iip->ili_fields & XFS_ILOG_DDATA) &&
                    ip->i_df.if_bytes > 0) {
-                       ASSERT(ip->i_df.if_u1.if_data != NULL);
+                       ASSERT(ip->i_df.if_data != NULL);
                        ASSERT(ip->i_disk_size > 0);
                        xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_ILOCAL,
-                                       ip->i_df.if_u1.if_data,
-                                       ip->i_df.if_bytes);
+                                       ip->i_df.if_data, ip->i_df.if_bytes);
                        ilf->ilf_dsize = (unsigned)ip->i_df.if_bytes;
                        ilf->ilf_size++;
                } else {
 
                if ((iip->ili_fields & XFS_ILOG_ADATA) &&
                    ip->i_af.if_bytes > 0) {
-                       ASSERT(ip->i_af.if_u1.if_data != NULL);
+                       ASSERT(ip->i_af.if_data != NULL);
                        xlog_copy_iovec(lv, vecp, XLOG_REG_TYPE_IATTR_LOCAL,
-                                       ip->i_af.if_u1.if_data,
-                                       ip->i_af.if_bytes);
+                                       ip->i_af.if_data, ip->i_af.if_bytes);
                        ilf->ilf_asize = (unsigned)ip->i_af.if_bytes;
                        ilf->ilf_size++;
                } else {
 
                 * The VFS crashes on a NULL pointer, so return -EFSCORRUPTED
                 * if if_data is junk.
                 */
-               if (XFS_IS_CORRUPT(ip->i_mount, !ip->i_df.if_u1.if_data))
+               if (XFS_IS_CORRUPT(ip->i_mount, !ip->i_df.if_data))
                        goto out;
 
-               memcpy(link, ip->i_df.if_u1.if_data, pathlen + 1);
+               memcpy(link, ip->i_df.if_data, pathlen + 1);
                error = 0;
        } else {
                error = xfs_readlink_bmap_ilocked(ip, link);