[XFS] embededd struct xfs_imap into xfs_inode
authorChristoph Hellwig <hch@lst.de>
Fri, 28 Nov 2008 03:23:41 +0000 (14:23 +1100)
committerNiv Sardi <xaiki@sgi.com>
Mon, 1 Dec 2008 00:38:08 +0000 (11:38 +1100)
Most uses of struct xfs_imap are to map and inode to a buffer.  To avoid
copying around the inode location information we should just embedd a
strcut xfs_imap into the xfs_inode.  To make sure it doesn't bloat an
inode the im_len is changed to a ushort, which is fine as that's what
the users exepect anyway.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <david@fromorbit.com>
Signed-off-by: Niv Sardi <xaiki@sgi.com>
fs/xfs/xfs_ialloc.c
fs/xfs/xfs_imap.h [deleted file]
fs/xfs/xfs_inode.c
fs/xfs/xfs_inode.h
fs/xfs/xfs_inode_item.c
fs/xfs/xfs_itable.c
fs/xfs/xfs_log_recover.c

index 348ac30174c5b7dab41350f8907bc1967d70258a..4f4557262d9fcc1b87c30aa8e1c3e7f6326d5dbc 100644 (file)
@@ -40,7 +40,6 @@
 #include "xfs_rtalloc.h"
 #include "xfs_error.h"
 #include "xfs_bmap.h"
-#include "xfs_imap.h"
 
 
 /*
diff --git a/fs/xfs/xfs_imap.h b/fs/xfs/xfs_imap.h
deleted file mode 100644 (file)
index 0869000..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2000,2005 Silicon Graphics, Inc.
- * All Rights Reserved.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it would be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write the Free Software Foundation,
- * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-#ifndef __XFS_IMAP_H__
-#define        __XFS_IMAP_H__
-
-/*
- * This is the structure passed to xfs_imap() to map
- * an inode number to its on disk location.
- */
-typedef struct xfs_imap {
-       xfs_daddr_t     im_blkno;       /* starting BB of inode chunk */
-       uint            im_len;         /* length in BBs of inode chunk */
-       ushort          im_boffset;     /* inode offset in block in bytes */
-} xfs_imap_t;
-
-#endif /* __XFS_IMAP_H__ */
index bf528b725ae1127694217e7edbeaecedafb91a1f..72dc7a87a14b1d4a2de290ebb666c000fcefe964 100644 (file)
@@ -23,7 +23,6 @@
 #include "xfs_bit.h"
 #include "xfs_log.h"
 #include "xfs_inum.h"
-#include "xfs_imap.h"
 #include "xfs_trans.h"
 #include "xfs_trans_priv.h"
 #include "xfs_sb.h"
@@ -134,7 +133,7 @@ STATIC int
 xfs_imap_to_bp(
        xfs_mount_t     *mp,
        xfs_trans_t     *tp,
-       xfs_imap_t      *imap,
+       struct xfs_imap *imap,
        xfs_buf_t       **bpp,
        uint            buf_flags,
        uint            imap_flags)
@@ -232,7 +231,7 @@ xfs_inotobp(
        int             *offset,
        uint            imap_flags)
 {
-       xfs_imap_t      imap;
+       struct xfs_imap imap;
        xfs_buf_t       *bp;
        int             error;
 
@@ -277,17 +276,12 @@ xfs_itobp(
        xfs_buf_t       **bpp,
        uint            buf_flags)
 {
-       xfs_imap_t      imap;
        xfs_buf_t       *bp;
        int             error;
 
-       ASSERT(ip->i_blkno != 0);
+       ASSERT(ip->i_imap.im_blkno != 0);
 
-       imap.im_blkno = ip->i_blkno;
-       imap.im_len = ip->i_len;
-       imap.im_boffset = ip->i_boffset;
-
-       error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, 0);
+       error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0);
        if (error)
                return error;
 
@@ -298,7 +292,7 @@ xfs_itobp(
                return EAGAIN;
        }
 
-       *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset);
+       *dipp = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset);
        *bpp = bp;
        return 0;
 }
@@ -799,9 +793,7 @@ xfs_inode_alloc(
        /* initialise the xfs inode */
        ip->i_ino = ino;
        ip->i_mount = mp;
-       ip->i_blkno = 0;
-       ip->i_len = 0;
-       ip->i_boffset =0;
+       memset(&ip->i_imap, 0, sizeof(struct xfs_imap));
        ip->i_afp = NULL;
        memset(&ip->i_df, 0, sizeof(xfs_ifork_t));
        ip->i_flags = 0;
@@ -857,7 +849,6 @@ xfs_iread(
        xfs_buf_t       *bp;
        xfs_dinode_t    *dip;
        xfs_inode_t     *ip;
-       xfs_imap_t      imap;
        int             error;
 
        ip = xfs_inode_alloc(mp, ino);
@@ -865,26 +856,22 @@ xfs_iread(
                return ENOMEM;
 
        /*
-        * Get pointers to the on-disk inode and the buffer containing it.
+        * Fill in the location information in the in-core inode.
         */
-       imap.im_blkno = bno;
-       error = xfs_imap(mp, tp, ip->i_ino, &imap, imap_flags);
+       ip->i_imap.im_blkno = bno;
+       error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, imap_flags);
        if (error)
                goto out_destroy_inode;
+       ASSERT(bno == 0 || bno == ip->i_imap.im_blkno);
 
        /*
-        * Fill in the fields in the inode that will be used to
-        * map the inode to its buffer from now on.
+        * Get pointers to the on-disk inode and the buffer containing it.
         */
-       ip->i_blkno = imap.im_blkno;
-       ip->i_len = imap.im_len;
-       ip->i_boffset = imap.im_boffset;
-       ASSERT(bno == 0 || bno == imap.im_blkno);
-
-       error = xfs_imap_to_bp(mp, tp, &imap, &bp, XFS_BUF_LOCK, imap_flags);
+       error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp,
+                              XFS_BUF_LOCK, imap_flags);
        if (error)
                goto out_destroy_inode;
-       dip = (xfs_dinode_t *)xfs_buf_offset(bp, imap.im_boffset);
+       dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset);
 
        /*
         * If we got something that isn't an inode it means someone
@@ -1872,7 +1859,7 @@ xfs_iunlink(
                ASSERT(be32_to_cpu(dip->di_next_unlinked) == NULLAGINO);
                /* both on-disk, don't endian flip twice */
                dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
-               offset = ip->i_boffset +
+               offset = ip->i_imap.im_boffset +
                        offsetof(xfs_dinode_t, di_next_unlinked);
                xfs_trans_inode_buf(tp, ibp);
                xfs_trans_log_buf(tp, ibp, offset,
@@ -1958,7 +1945,7 @@ xfs_iunlink_remove(
                ASSERT(next_agino != 0);
                if (next_agino != NULLAGINO) {
                        dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
-                       offset = ip->i_boffset +
+                       offset = ip->i_imap.im_boffset +
                                offsetof(xfs_dinode_t, di_next_unlinked);
                        xfs_trans_inode_buf(tp, ibp);
                        xfs_trans_log_buf(tp, ibp, offset,
@@ -2021,7 +2008,7 @@ xfs_iunlink_remove(
                ASSERT(next_agino != agino);
                if (next_agino != NULLAGINO) {
                        dip->di_next_unlinked = cpu_to_be32(NULLAGINO);
-                       offset = ip->i_boffset +
+                       offset = ip->i_imap.im_boffset +
                                offsetof(xfs_dinode_t, di_next_unlinked);
                        xfs_trans_inode_buf(tp, ibp);
                        xfs_trans_log_buf(tp, ibp, offset,
@@ -3201,7 +3188,7 @@ xfs_iflush_int(
        }
 
        /* set *dip = inode's place in the buffer */
-       dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_boffset);
+       dip = (xfs_dinode_t *)xfs_buf_offset(bp, ip->i_imap.im_boffset);
 
        /*
         * Clear i_update_core before copying out the data.
index 0a9ad1c56a87f39596f91fb063eedbe697a574ad..d5c3aa1b18ef0a791794a62de4f607cd8800132f 100644 (file)
@@ -82,6 +82,16 @@ typedef struct xfs_ifork {
        } if_u2;
 } xfs_ifork_t;
 
+/*
+ * Inode location information.  Stored in the inode and passed to
+ * xfs_imap_to_bp() to get a buffer and dinode for a given inode.
+ */
+struct xfs_imap {
+       xfs_daddr_t     im_blkno;       /* starting BB of inode chunk */
+       ushort          im_len;         /* length in BBs of inode chunk */
+       ushort          im_boffset;     /* inode offset in block in bytes */
+};
+
 /*
  * This is the xfs in-core inode structure.
  * Most of the on-disk inode is embedded in the i_d field.
@@ -238,9 +248,7 @@ typedef struct xfs_inode {
 
        /* Inode location stuff */
        xfs_ino_t               i_ino;          /* inode number (agno/agino)*/
-       xfs_daddr_t             i_blkno;        /* blkno of inode buffer */
-       ushort                  i_len;          /* len of inode buffer */
-       ushort                  i_boffset;      /* off of inode in buffer */
+       struct xfs_imap         i_imap;         /* location for xfs_imap() */
 
        /* Extent information. */
        xfs_ifork_t             *i_afp;         /* attribute fork pointer */
index c43118148e6c050b56c6498430b475374f0b04b7..977c4aec587eeb3ea316408a73f147082c14c5ba 100644 (file)
@@ -942,9 +942,9 @@ xfs_inode_item_init(
 
        iip->ili_format.ilf_type = XFS_LI_INODE;
        iip->ili_format.ilf_ino = ip->i_ino;
-       iip->ili_format.ilf_blkno = ip->i_blkno;
-       iip->ili_format.ilf_len = ip->i_len;
-       iip->ili_format.ilf_boffset = ip->i_boffset;
+       iip->ili_format.ilf_blkno = ip->i_imap.im_blkno;
+       iip->ili_format.ilf_len = ip->i_imap.im_len;
+       iip->ili_format.ilf_boffset = ip->i_imap.im_boffset;
 }
 
 /*
index 2cf16f4695ea78e7c3ab52889770ab5317cf3bab..4315ce642b4e657a5e0227cbb2b636063b079459 100644 (file)
@@ -69,7 +69,7 @@ xfs_bulkstat_one_iget(
        }
 
        ASSERT(ip != NULL);
-       ASSERT(ip->i_blkno != (xfs_daddr_t)0);
+       ASSERT(ip->i_imap.im_blkno != 0);
 
        dic = &ip->i_d;
 
index bf8573b5a7d89a889edea159b98bed11e830f427..ce6e907bec62358043ff78cdb88be5ff3a9d0ba2 100644 (file)
@@ -36,7 +36,6 @@
 #include "xfs_dinode.h"
 #include "xfs_inode.h"
 #include "xfs_inode_item.h"
-#include "xfs_imap.h"
 #include "xfs_alloc.h"
 #include "xfs_ialloc.h"
 #include "xfs_log_priv.h"