]> git.itanic.dy.fi Git - linux-stable/commitdiff
xfs: make if_data a void pointer
authorChristoph Hellwig <hch@lst.de>
Wed, 20 Dec 2023 06:34:55 +0000 (07:34 +0100)
committerChandan Babu R <chandanbabu@kernel.org>
Fri, 29 Dec 2023 08:07:03 +0000 (13:37 +0530)
The xfs_ifork structure currently has a union of the if_root void pointer
and the if_data char pointer.  In either case it is an opaque pointer
that depends on the fork format.  Replace the union with a single if_data
void pointer as that is what almost all callers want.  Only the symlink
NULL termination code in xfs_init_local_fork actually needs a new local
variable now.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Chandan Babu R <chandanbabu@kernel.org>
18 files changed:
fs/xfs/libxfs/xfs_attr.c
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_dir2.c
fs/xfs/libxfs/xfs_dir2_block.c
fs/xfs/libxfs/xfs_dir2_sf.c
fs/xfs/libxfs/xfs_iext_tree.c
fs/xfs/libxfs/xfs_inode_fork.c
fs/xfs/libxfs/xfs_inode_fork.h
fs/xfs/libxfs/xfs_symlink_remote.c
fs/xfs/scrub/attr.c
fs/xfs/scrub/readdir.c
fs/xfs/scrub/symlink.c
fs/xfs/xfs_attr_list.c
fs/xfs/xfs_dir2_readdir.c
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_symlink.c

index fa49c795f40745ec52d8568c6709efdb9ad10fb8..7f822e72dfcd3ec1bd6663b314520a9ab6b6000e 100644 (file)
@@ -1049,9 +1049,8 @@ xfs_attr_set(
 
 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);
 }
 
index 5d1ab4978f329336bb38d0d6784d3e4f0c268b41..3e5377fd4984713fc0b738f793309b94fd506bc1 100644 (file)
@@ -691,7 +691,7 @@ xfs_attr_shortform_create(
        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);
@@ -712,14 +712,13 @@ xfs_attr_sf_findname(
        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),
@@ -751,29 +750,25 @@ xfs_attr_shortform_add(
        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;
@@ -811,20 +806,16 @@ int
 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);
 
        /*
@@ -878,18 +869,17 @@ xfs_attr_sf_removename(
  */
 /*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++) {
@@ -909,14 +899,13 @@ xfs_attr_shortform_lookup(xfs_da_args_t *args)
  */
 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++) {
@@ -933,25 +922,22 @@ int
 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);
index be7b76ab9fcd2dec4e3b7870b6144c5caf4b62f6..98aaca933bddb76f62b7927576f5d560ebd61c84 100644 (file)
@@ -747,7 +747,7 @@ xfs_bmap_local_to_extents_empty(
        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);
@@ -832,7 +832,7 @@ xfs_bmap_local_to_extents(
        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;
index f5462fd582d502a64a0f553f0e6603d488a1eeec..a76673281514501560e286d8bb5ac19cbc7e5707 100644 (file)
@@ -196,7 +196,7 @@ xfs_dir_isempty(
                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;
 }
 
index 00f960a703b2ef5f1877e35e35e460854486eff7..3c256d4cc40b487c7c8909835b6dd3e0cf957fed 100644 (file)
@@ -1089,7 +1089,7 @@ xfs_dir2_sf_to_block(
        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;
@@ -1099,10 +1099,8 @@ xfs_dir2_sf_to_block(
        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);
 
index 870ef1d1ebe4a26c60e839db54b26738307b9abb..0b63138d2b9f0e19974d15632e6da7b941497624 100644 (file)
@@ -364,25 +364,23 @@ int                                               /* error */
 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.
@@ -462,11 +460,9 @@ xfs_dir2_sf_addname_easy(
 {
        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.
         */
@@ -475,7 +471,7 @@ xfs_dir2_sf_addname_easy(
        /*
         * 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.
@@ -528,11 +524,10 @@ xfs_dir2_sf_addname_hard(
        /*
         * 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.
@@ -560,7 +555,7 @@ xfs_dir2_sf_addname_hard(
        /*
         * 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.
         */
@@ -610,11 +605,10 @@ xfs_dir2_sf_addname_pick(
        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);
@@ -673,14 +667,13 @@ xfs_dir2_sf_check(
 {
        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;
@@ -834,7 +827,7 @@ xfs_dir2_sf_create(
        /*
         * 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.
@@ -857,9 +850,9 @@ xfs_dir2_sf_lookup(
 {
        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 */
 
@@ -870,8 +863,7 @@ xfs_dir2_sf_lookup(
        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 .
@@ -933,13 +925,13 @@ xfs_dir2_sf_removename(
 {
        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);
 
@@ -947,8 +939,7 @@ xfs_dir2_sf_removename(
        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.
@@ -989,7 +980,7 @@ xfs_dir2_sf_removename(
         * 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?
         */
@@ -1012,13 +1003,12 @@ xfs_dir2_sf_replace_needblock(
        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 &&
@@ -1034,19 +1024,18 @@ xfs_dir2_sf_replace(
 {
        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));
 
        /*
@@ -1069,7 +1058,7 @@ xfs_dir2_sf_replace(
                 */
                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;
 
@@ -1150,11 +1139,11 @@ xfs_dir2_sf_toino4(
 {
        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 */
@@ -1168,7 +1157,6 @@ xfs_dir2_sf_toino4(
         */
        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);
        /*
@@ -1181,7 +1169,7 @@ xfs_dir2_sf_toino4(
         * 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.
         */
@@ -1223,11 +1211,11 @@ xfs_dir2_sf_toino8(
 {
        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 */
@@ -1241,7 +1229,6 @@ xfs_dir2_sf_toino8(
         */
        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);
        /*
@@ -1254,7 +1241,7 @@ xfs_dir2_sf_toino8(
         * 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.
         */
index d062794cc79575f1b49bff5b6c6d30f68baccab8..f4e6b200cdf8c118bf5ad401592eb23406a4cf5f 100644 (file)
@@ -158,7 +158,7 @@ static void *
 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)
@@ -176,7 +176,7 @@ static void *
 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)
@@ -306,7 +306,7 @@ xfs_iext_find_level(
        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)
@@ -402,12 +402,12 @@ xfs_iext_grow(
        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);
 
@@ -418,7 +418,7 @@ xfs_iext_grow(
        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++;
 }
 
@@ -430,7 +430,7 @@ xfs_iext_update_node(
        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--) {
@@ -583,11 +583,11 @@ xfs_iext_alloc_root(
 {
        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;
 }
 
@@ -603,9 +603,9 @@ xfs_iext_realloc_root(
        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;
 }
 
@@ -786,8 +786,8 @@ xfs_iext_remove_node(
                 * 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);
        }
@@ -863,8 +863,8 @@ xfs_iext_free_last_leaf(
        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
@@ -881,7 +881,7 @@ xfs_iext_remove(
        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);
@@ -1051,9 +1051,9 @@ void
 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;
 }
index b86d57589f67e6b158f87c6d0872c975729ebea7..d23910e503a1aebd793a884ca7146b9e45536c6d 100644 (file)
@@ -50,12 +50,15 @@ xfs_init_local_fork(
                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;
@@ -125,7 +128,7 @@ xfs_iformat_extents(
        }
 
        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);
@@ -212,7 +215,7 @@ xfs_iformat_btree(
                         ifp->if_broot, size);
 
        ifp->if_bytes = 0;
-       ifp->if_u1.if_root = NULL;
+       ifp->if_data = NULL;
        ifp->if_height = 0;
        return 0;
 }
@@ -509,14 +512,14 @@ xfs_idata_realloc(
                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;
 }
 
@@ -532,8 +535,8 @@ xfs_idestroy_fork(
 
        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:
@@ -626,9 +629,9 @@ xfs_iflush_fork(
        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;
 
@@ -706,17 +709,15 @@ xfs_ifork_verify_local_data(
        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:
@@ -725,7 +726,7 @@ xfs_ifork_verify_local_data(
 
        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;
        }
 
@@ -743,20 +744,14 @@ xfs_ifork_verify_local_attr(
        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;
        }
 
index 535be5c036899c33c17ccc5d56800391316df6f9..7edcf0e8cd5388292723c8229ef9d6231571c643 100644 (file)
@@ -13,14 +13,12 @@ struct xfs_dinode;
  * 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 */
index 3c96d1d617fb0b05c8a1acfedb37d6849ff1b112..160aa20aa44139b026c4b0c8b662474082faca02 100644 (file)
@@ -175,7 +175,7 @@ xfs_symlink_local_to_remote(
 
        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;
        }
@@ -191,7 +191,7 @@ xfs_symlink_local_to_remote(
 
        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);
 }
index 6c16d9530ccaca8633d3328252b523bc915e8e1d..bac6fb2f01d88061b13fd4b3492116da1e468eda 100644 (file)
@@ -527,19 +527,15 @@ xchk_xattr_check_sf(
        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];
index e51c1544be63238b18ee87ea7e9c869930ada2fd..16462332c897b17a90ecd8167ab3a02708fa0ab0 100644 (file)
@@ -36,16 +36,14 @@ xchk_dir_walk_sf(
        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,
index 60643d791d4a2220d0cc5d6bb208b148a1982b5d..ddff86713df3530eb86849921ca947f307fbb5b4 100644 (file)
@@ -61,7 +61,7 @@ xchk_symlink(
        /* 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;
        }
index 99bbbe1a0e447877829f87d3d615c562b038bb93..8700b00e154c989bb45cb7392303567b796fa6fc 100644 (file)
@@ -56,12 +56,11 @@ xfs_attr_shortform_list(
        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;
index 57f42c2af0a31662e0d61a5bdb093d64d2d0e0df..cc6dc56f455d0c74ab02ef891469bc4db634d331 100644 (file)
@@ -52,7 +52,7 @@ xfs_dir2_sf_getdents(
        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;
@@ -60,9 +60,7 @@ xfs_dir2_sf_getdents(
 
        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.
index 1ffc8dfa2a52ce6fe98f21ae6d9001ae967a0ca5..1fd94958aa97aa09d6297bd68f5d6ba38c03d440 100644 (file)
@@ -872,7 +872,7 @@ xfs_init_new_inode(
        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);
@@ -2378,8 +2378,8 @@ xfs_ifree(
         * 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;
        }
 
index b35335e20342c7107779238a4733f34ed2bb8917..0aee97ba0be81f1b8f1cf866950b7fc917aba38b 100644 (file)
@@ -352,11 +352,10 @@ xfs_inode_item_format_data_fork(
                        ~(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 {
@@ -431,10 +430,9 @@ xfs_inode_item_format_attr_fork(
 
                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 {
index 7c713727f7fd371aa465875522084ac2215f6929..92974a4414c832a8e0c358608182129bf59652e2 100644 (file)
@@ -131,10 +131,10 @@ xfs_readlink(
                 * 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);