[XFS] embededd struct xfs_imap into xfs_inode
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>
This commit is contained in:
parent
94e1b69d1a
commit
92bfc6e7c4
|
@ -40,7 +40,6 @@
|
||||||
#include "xfs_rtalloc.h"
|
#include "xfs_rtalloc.h"
|
||||||
#include "xfs_error.h"
|
#include "xfs_error.h"
|
||||||
#include "xfs_bmap.h"
|
#include "xfs_bmap.h"
|
||||||
#include "xfs_imap.h"
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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__ */
|
|
|
@ -23,7 +23,6 @@
|
||||||
#include "xfs_bit.h"
|
#include "xfs_bit.h"
|
||||||
#include "xfs_log.h"
|
#include "xfs_log.h"
|
||||||
#include "xfs_inum.h"
|
#include "xfs_inum.h"
|
||||||
#include "xfs_imap.h"
|
|
||||||
#include "xfs_trans.h"
|
#include "xfs_trans.h"
|
||||||
#include "xfs_trans_priv.h"
|
#include "xfs_trans_priv.h"
|
||||||
#include "xfs_sb.h"
|
#include "xfs_sb.h"
|
||||||
|
@ -134,7 +133,7 @@ STATIC int
|
||||||
xfs_imap_to_bp(
|
xfs_imap_to_bp(
|
||||||
xfs_mount_t *mp,
|
xfs_mount_t *mp,
|
||||||
xfs_trans_t *tp,
|
xfs_trans_t *tp,
|
||||||
xfs_imap_t *imap,
|
struct xfs_imap *imap,
|
||||||
xfs_buf_t **bpp,
|
xfs_buf_t **bpp,
|
||||||
uint buf_flags,
|
uint buf_flags,
|
||||||
uint imap_flags)
|
uint imap_flags)
|
||||||
|
@ -232,7 +231,7 @@ xfs_inotobp(
|
||||||
int *offset,
|
int *offset,
|
||||||
uint imap_flags)
|
uint imap_flags)
|
||||||
{
|
{
|
||||||
xfs_imap_t imap;
|
struct xfs_imap imap;
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
@ -277,17 +276,12 @@ xfs_itobp(
|
||||||
xfs_buf_t **bpp,
|
xfs_buf_t **bpp,
|
||||||
uint buf_flags)
|
uint buf_flags)
|
||||||
{
|
{
|
||||||
xfs_imap_t imap;
|
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
ASSERT(ip->i_blkno != 0);
|
ASSERT(ip->i_imap.im_blkno != 0);
|
||||||
|
|
||||||
imap.im_blkno = ip->i_blkno;
|
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp, buf_flags, 0);
|
||||||
imap.im_len = ip->i_len;
|
|
||||||
imap.im_boffset = ip->i_boffset;
|
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, 0);
|
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -298,7 +292,7 @@ xfs_itobp(
|
||||||
return EAGAIN;
|
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;
|
*bpp = bp;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -799,9 +793,7 @@ xfs_inode_alloc(
|
||||||
/* initialise the xfs inode */
|
/* initialise the xfs inode */
|
||||||
ip->i_ino = ino;
|
ip->i_ino = ino;
|
||||||
ip->i_mount = mp;
|
ip->i_mount = mp;
|
||||||
ip->i_blkno = 0;
|
memset(&ip->i_imap, 0, sizeof(struct xfs_imap));
|
||||||
ip->i_len = 0;
|
|
||||||
ip->i_boffset =0;
|
|
||||||
ip->i_afp = NULL;
|
ip->i_afp = NULL;
|
||||||
memset(&ip->i_df, 0, sizeof(xfs_ifork_t));
|
memset(&ip->i_df, 0, sizeof(xfs_ifork_t));
|
||||||
ip->i_flags = 0;
|
ip->i_flags = 0;
|
||||||
|
@ -857,7 +849,6 @@ xfs_iread(
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
xfs_dinode_t *dip;
|
xfs_dinode_t *dip;
|
||||||
xfs_inode_t *ip;
|
xfs_inode_t *ip;
|
||||||
xfs_imap_t imap;
|
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
ip = xfs_inode_alloc(mp, ino);
|
ip = xfs_inode_alloc(mp, ino);
|
||||||
|
@ -865,26 +856,22 @@ xfs_iread(
|
||||||
return ENOMEM;
|
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;
|
ip->i_imap.im_blkno = bno;
|
||||||
error = xfs_imap(mp, tp, ip->i_ino, &imap, imap_flags);
|
error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, imap_flags);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_destroy_inode;
|
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
|
* Get pointers to the on-disk inode and the buffer containing it.
|
||||||
* map the inode to its buffer from now on.
|
|
||||||
*/
|
*/
|
||||||
ip->i_blkno = imap.im_blkno;
|
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp,
|
||||||
ip->i_len = imap.im_len;
|
XFS_BUF_LOCK, imap_flags);
|
||||||
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);
|
|
||||||
if (error)
|
if (error)
|
||||||
goto out_destroy_inode;
|
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
|
* 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);
|
ASSERT(be32_to_cpu(dip->di_next_unlinked) == NULLAGINO);
|
||||||
/* both on-disk, don't endian flip twice */
|
/* both on-disk, don't endian flip twice */
|
||||||
dip->di_next_unlinked = agi->agi_unlinked[bucket_index];
|
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);
|
offsetof(xfs_dinode_t, di_next_unlinked);
|
||||||
xfs_trans_inode_buf(tp, ibp);
|
xfs_trans_inode_buf(tp, ibp);
|
||||||
xfs_trans_log_buf(tp, ibp, offset,
|
xfs_trans_log_buf(tp, ibp, offset,
|
||||||
|
@ -1958,7 +1945,7 @@ xfs_iunlink_remove(
|
||||||
ASSERT(next_agino != 0);
|
ASSERT(next_agino != 0);
|
||||||
if (next_agino != NULLAGINO) {
|
if (next_agino != NULLAGINO) {
|
||||||
dip->di_next_unlinked = cpu_to_be32(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);
|
offsetof(xfs_dinode_t, di_next_unlinked);
|
||||||
xfs_trans_inode_buf(tp, ibp);
|
xfs_trans_inode_buf(tp, ibp);
|
||||||
xfs_trans_log_buf(tp, ibp, offset,
|
xfs_trans_log_buf(tp, ibp, offset,
|
||||||
|
@ -2021,7 +2008,7 @@ xfs_iunlink_remove(
|
||||||
ASSERT(next_agino != agino);
|
ASSERT(next_agino != agino);
|
||||||
if (next_agino != NULLAGINO) {
|
if (next_agino != NULLAGINO) {
|
||||||
dip->di_next_unlinked = cpu_to_be32(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);
|
offsetof(xfs_dinode_t, di_next_unlinked);
|
||||||
xfs_trans_inode_buf(tp, ibp);
|
xfs_trans_inode_buf(tp, ibp);
|
||||||
xfs_trans_log_buf(tp, ibp, offset,
|
xfs_trans_log_buf(tp, ibp, offset,
|
||||||
|
@ -3201,7 +3188,7 @@ xfs_iflush_int(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set *dip = inode's place in the buffer */
|
/* 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.
|
* Clear i_update_core before copying out the data.
|
||||||
|
|
|
@ -82,6 +82,16 @@ typedef struct xfs_ifork {
|
||||||
} if_u2;
|
} if_u2;
|
||||||
} xfs_ifork_t;
|
} 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.
|
* This is the xfs in-core inode structure.
|
||||||
* Most of the on-disk inode is embedded in the i_d field.
|
* Most of the on-disk inode is embedded in the i_d field.
|
||||||
|
@ -238,9 +248,7 @@ typedef struct xfs_inode {
|
||||||
|
|
||||||
/* Inode location stuff */
|
/* Inode location stuff */
|
||||||
xfs_ino_t i_ino; /* inode number (agno/agino)*/
|
xfs_ino_t i_ino; /* inode number (agno/agino)*/
|
||||||
xfs_daddr_t i_blkno; /* blkno of inode buffer */
|
struct xfs_imap i_imap; /* location for xfs_imap() */
|
||||||
ushort i_len; /* len of inode buffer */
|
|
||||||
ushort i_boffset; /* off of inode in buffer */
|
|
||||||
|
|
||||||
/* Extent information. */
|
/* Extent information. */
|
||||||
xfs_ifork_t *i_afp; /* attribute fork pointer */
|
xfs_ifork_t *i_afp; /* attribute fork pointer */
|
||||||
|
|
|
@ -942,9 +942,9 @@ xfs_inode_item_init(
|
||||||
|
|
||||||
iip->ili_format.ilf_type = XFS_LI_INODE;
|
iip->ili_format.ilf_type = XFS_LI_INODE;
|
||||||
iip->ili_format.ilf_ino = ip->i_ino;
|
iip->ili_format.ilf_ino = ip->i_ino;
|
||||||
iip->ili_format.ilf_blkno = ip->i_blkno;
|
iip->ili_format.ilf_blkno = ip->i_imap.im_blkno;
|
||||||
iip->ili_format.ilf_len = ip->i_len;
|
iip->ili_format.ilf_len = ip->i_imap.im_len;
|
||||||
iip->ili_format.ilf_boffset = ip->i_boffset;
|
iip->ili_format.ilf_boffset = ip->i_imap.im_boffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -69,7 +69,7 @@ xfs_bulkstat_one_iget(
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
ASSERT(ip->i_blkno != (xfs_daddr_t)0);
|
ASSERT(ip->i_imap.im_blkno != 0);
|
||||||
|
|
||||||
dic = &ip->i_d;
|
dic = &ip->i_d;
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include "xfs_dinode.h"
|
#include "xfs_dinode.h"
|
||||||
#include "xfs_inode.h"
|
#include "xfs_inode.h"
|
||||||
#include "xfs_inode_item.h"
|
#include "xfs_inode_item.h"
|
||||||
#include "xfs_imap.h"
|
|
||||||
#include "xfs_alloc.h"
|
#include "xfs_alloc.h"
|
||||||
#include "xfs_ialloc.h"
|
#include "xfs_ialloc.h"
|
||||||
#include "xfs_log_priv.h"
|
#include "xfs_log_priv.h"
|
||||||
|
|
Loading…
Reference in New Issue