Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 92bfc6e7 authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Niv Sardi
Browse files

[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: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDave Chinner <david@fromorbit.com>
Signed-off-by: default avatarNiv Sardi <xaiki@sgi.com>
parent 94e1b69d
Loading
Loading
Loading
Loading
+0 −1
Original line number Original line Diff line number Diff line
@@ -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"




/*
/*

fs/xfs/xfs_imap.h

deleted100644 → 0
+0 −31
Original line number Original line Diff line number Diff line
/*
 * 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__ */
+18 −31
Original line number Original line Diff line number Diff line
@@ -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.
+11 −3
Original line number Original line Diff line number Diff line
@@ -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 */
+3 −3
Original line number Original line Diff line number Diff line
@@ -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;
}
}


/*
/*
Loading