mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-24 11:36:44 +07:00
xfs: remove xfs_iread
There is not much point in the xfs_iread function, as it has a single caller and not a whole lot of code. Move it into the only caller, and trim down the overdocumentation to just documenting the important "why" instead of a lot of redundant "what". Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Brian Foster <bfoster@redhat.com> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
This commit is contained in:
parent
7f02901235
commit
bb8a66af4f
@ -614,79 +614,6 @@ xfs_dinode_calc_crc(
|
|||||||
dip->di_crc = xfs_end_cksum(crc);
|
dip->di_crc = xfs_end_cksum(crc);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Read the disk inode attributes into the in-core inode structure.
|
|
||||||
*
|
|
||||||
* For version 5 superblocks, if we are initialising a new inode and we are not
|
|
||||||
* utilising the XFS_MOUNT_IKEEP inode cluster mode, we can simple build the new
|
|
||||||
* inode core with a random generation number. If we are keeping inodes around,
|
|
||||||
* we need to read the inode cluster to get the existing generation number off
|
|
||||||
* disk. Further, if we are using version 4 superblocks (i.e. v1/v2 inode
|
|
||||||
* format) then log recovery is dependent on the di_flushiter field being
|
|
||||||
* initialised from the current on-disk value and hence we must also read the
|
|
||||||
* inode off disk.
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
xfs_iread(
|
|
||||||
xfs_mount_t *mp,
|
|
||||||
xfs_trans_t *tp,
|
|
||||||
xfs_inode_t *ip,
|
|
||||||
uint iget_flags)
|
|
||||||
{
|
|
||||||
xfs_buf_t *bp;
|
|
||||||
xfs_dinode_t *dip;
|
|
||||||
int error;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fill in the location information in the in-core inode.
|
|
||||||
*/
|
|
||||||
error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, iget_flags);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
/* shortcut IO on inode allocation if possible */
|
|
||||||
if ((iget_flags & XFS_IGET_CREATE) &&
|
|
||||||
xfs_sb_version_has_v3inode(&mp->m_sb) &&
|
|
||||||
!(mp->m_flags & XFS_MOUNT_IKEEP)) {
|
|
||||||
VFS_I(ip)->i_generation = prandom_u32();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get pointers to the on-disk inode and the buffer containing it.
|
|
||||||
*/
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
error = xfs_inode_from_disk(ip, dip);
|
|
||||||
if (error)
|
|
||||||
goto out_brelse;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Mark the buffer containing the inode as something to keep
|
|
||||||
* around for a while. This helps to keep recently accessed
|
|
||||||
* meta-data in-core longer.
|
|
||||||
*/
|
|
||||||
xfs_buf_set_ref(bp, XFS_INO_REF);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Use xfs_trans_brelse() to release the buffer containing the on-disk
|
|
||||||
* inode, because it was acquired with xfs_trans_read_buf() in
|
|
||||||
* xfs_imap_to_bp() above. If tp is NULL, this is just a normal
|
|
||||||
* brelse(). If we're within a transaction, then xfs_trans_brelse()
|
|
||||||
* will only release the buffer if it is not dirty within the
|
|
||||||
* transaction. It will be OK to release the buffer in this case,
|
|
||||||
* because inodes on disk are never destroyed and we will be locking the
|
|
||||||
* new in-core inode before putting it in the cache where other
|
|
||||||
* processes can find it. Thus we don't have to worry about the inode
|
|
||||||
* being changed just because we released the buffer.
|
|
||||||
*/
|
|
||||||
out_brelse:
|
|
||||||
xfs_trans_brelse(tp, bp);
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Validate di_extsize hint.
|
* Validate di_extsize hint.
|
||||||
*
|
*
|
||||||
|
@ -49,8 +49,6 @@ struct xfs_imap {
|
|||||||
int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
|
int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
|
||||||
struct xfs_imap *, struct xfs_dinode **,
|
struct xfs_imap *, struct xfs_dinode **,
|
||||||
struct xfs_buf **, uint);
|
struct xfs_buf **, uint);
|
||||||
int xfs_iread(struct xfs_mount *, struct xfs_trans *,
|
|
||||||
struct xfs_inode *, uint);
|
|
||||||
void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
|
void xfs_dinode_calc_crc(struct xfs_mount *, struct xfs_dinode *);
|
||||||
void xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to,
|
void xfs_inode_to_disk(struct xfs_inode *ip, struct xfs_dinode *to,
|
||||||
xfs_lsn_t lsn);
|
xfs_lsn_t lsn);
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include "xfs_dquot_item.h"
|
#include "xfs_dquot_item.h"
|
||||||
#include "xfs_dquot.h"
|
#include "xfs_dquot.h"
|
||||||
#include "xfs_reflink.h"
|
#include "xfs_reflink.h"
|
||||||
|
#include "xfs_ialloc.h"
|
||||||
|
|
||||||
#include <linux/iversion.h>
|
#include <linux/iversion.h>
|
||||||
|
|
||||||
@ -508,10 +509,40 @@ xfs_iget_cache_miss(
|
|||||||
if (!ip)
|
if (!ip)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
error = xfs_iread(mp, tp, ip, flags);
|
error = xfs_imap(mp, tp, ip->i_ino, &ip->i_imap, flags);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_destroy;
|
goto out_destroy;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For version 5 superblocks, if we are initialising a new inode and we
|
||||||
|
* are not utilising the XFS_MOUNT_IKEEP inode cluster mode, we can
|
||||||
|
* simply build the new inode core with a random generation number.
|
||||||
|
*
|
||||||
|
* For version 4 (and older) superblocks, log recovery is dependent on
|
||||||
|
* the di_flushiter field being initialised from the current on-disk
|
||||||
|
* value and hence we must also read the inode off disk even when
|
||||||
|
* initializing new inodes.
|
||||||
|
*/
|
||||||
|
if (xfs_sb_version_has_v3inode(&mp->m_sb) &&
|
||||||
|
(flags & XFS_IGET_CREATE) && !(mp->m_flags & XFS_MOUNT_IKEEP)) {
|
||||||
|
VFS_I(ip)->i_generation = prandom_u32();
|
||||||
|
} else {
|
||||||
|
struct xfs_dinode *dip;
|
||||||
|
struct xfs_buf *bp;
|
||||||
|
|
||||||
|
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0);
|
||||||
|
if (error)
|
||||||
|
goto out_destroy;
|
||||||
|
|
||||||
|
error = xfs_inode_from_disk(ip, dip);
|
||||||
|
if (!error)
|
||||||
|
xfs_buf_set_ref(bp, XFS_INO_REF);
|
||||||
|
xfs_trans_brelse(tp, bp);
|
||||||
|
|
||||||
|
if (error)
|
||||||
|
goto out_destroy;
|
||||||
|
}
|
||||||
|
|
||||||
if (!xfs_inode_verify_forks(ip)) {
|
if (!xfs_inode_verify_forks(ip)) {
|
||||||
error = -EFSCORRUPTED;
|
error = -EFSCORRUPTED;
|
||||||
goto out_destroy;
|
goto out_destroy;
|
||||||
|
Loading…
Reference in New Issue
Block a user