mirror of https://gitee.com/openkylin/linux.git
xfs: split xfs_imap_to_bp
Split looking up the dinode from xfs_imap_to_bp, which can be significantly simplified as a result. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <djwong@kernel.org> Signed-off-by: Darrick J. Wong <djwong@kernel.org>
This commit is contained in:
parent
e773f88029
commit
af9dcddef6
|
@ -124,37 +124,18 @@ const struct xfs_buf_ops xfs_inode_buf_ra_ops = {
|
||||||
/*
|
/*
|
||||||
* This routine is called to map an inode to the buffer containing the on-disk
|
* This routine is called to map an inode to the buffer containing the on-disk
|
||||||
* version of the inode. It returns a pointer to the buffer containing the
|
* version of the inode. It returns a pointer to the buffer containing the
|
||||||
* on-disk inode in the bpp parameter, and in the dipp parameter it returns a
|
* on-disk inode in the bpp parameter.
|
||||||
* pointer to the on-disk inode within that buffer.
|
|
||||||
*
|
|
||||||
* If a non-zero error is returned, then the contents of bpp and dipp are
|
|
||||||
* undefined.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
xfs_imap_to_bp(
|
xfs_imap_to_bp(
|
||||||
struct xfs_mount *mp,
|
struct xfs_mount *mp,
|
||||||
struct xfs_trans *tp,
|
struct xfs_trans *tp,
|
||||||
struct xfs_imap *imap,
|
struct xfs_imap *imap,
|
||||||
struct xfs_dinode **dipp,
|
struct xfs_buf **bpp)
|
||||||
struct xfs_buf **bpp,
|
|
||||||
uint buf_flags)
|
|
||||||
{
|
{
|
||||||
struct xfs_buf *bp;
|
return xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
|
||||||
int error;
|
imap->im_len, XBF_UNMAPPED, bpp,
|
||||||
|
|
||||||
buf_flags |= XBF_UNMAPPED;
|
|
||||||
error = xfs_trans_read_buf(mp, tp, mp->m_ddev_targp, imap->im_blkno,
|
|
||||||
(int)imap->im_len, buf_flags, &bp,
|
|
||||||
&xfs_inode_buf_ops);
|
&xfs_inode_buf_ops);
|
||||||
if (error) {
|
|
||||||
ASSERT(error != -EAGAIN || (buf_flags & XBF_TRYLOCK));
|
|
||||||
return error;
|
|
||||||
}
|
|
||||||
|
|
||||||
*bpp = bp;
|
|
||||||
if (dipp)
|
|
||||||
*dipp = xfs_buf_offset(bp, imap->im_boffset);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct timespec64 xfs_inode_decode_bigtime(uint64_t ts)
|
static inline struct timespec64 xfs_inode_decode_bigtime(uint64_t ts)
|
||||||
|
|
|
@ -47,9 +47,8 @@ struct xfs_imap {
|
||||||
unsigned short im_boffset; /* inode offset in block in bytes */
|
unsigned short im_boffset; /* inode offset in block in bytes */
|
||||||
};
|
};
|
||||||
|
|
||||||
int xfs_imap_to_bp(struct xfs_mount *, struct xfs_trans *,
|
int xfs_imap_to_bp(struct xfs_mount *mp, struct xfs_trans *tp,
|
||||||
struct xfs_imap *, struct xfs_dinode **,
|
struct xfs_imap *imap, struct xfs_buf **bpp);
|
||||||
struct xfs_buf **, 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);
|
||||||
|
|
|
@ -164,8 +164,7 @@ xfs_trans_log_inode(
|
||||||
* here.
|
* here.
|
||||||
*/
|
*/
|
||||||
spin_unlock(&iip->ili_lock);
|
spin_unlock(&iip->ili_lock);
|
||||||
error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, NULL,
|
error = xfs_imap_to_bp(ip->i_mount, tp, &ip->i_imap, &bp);
|
||||||
&bp, 0);
|
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_force_shutdown(ip->i_mount, SHUTDOWN_META_IO_ERROR);
|
xfs_force_shutdown(ip->i_mount, SHUTDOWN_META_IO_ERROR);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -212,7 +212,6 @@ xchk_iallocbt_check_cluster(
|
||||||
{
|
{
|
||||||
struct xfs_imap imap;
|
struct xfs_imap imap;
|
||||||
struct xfs_mount *mp = bs->cur->bc_mp;
|
struct xfs_mount *mp = bs->cur->bc_mp;
|
||||||
struct xfs_dinode *dip;
|
|
||||||
struct xfs_buf *cluster_bp;
|
struct xfs_buf *cluster_bp;
|
||||||
unsigned int nr_inodes;
|
unsigned int nr_inodes;
|
||||||
xfs_agnumber_t agno = bs->cur->bc_ag.agno;
|
xfs_agnumber_t agno = bs->cur->bc_ag.agno;
|
||||||
|
@ -278,7 +277,7 @@ xchk_iallocbt_check_cluster(
|
||||||
&XFS_RMAP_OINFO_INODES);
|
&XFS_RMAP_OINFO_INODES);
|
||||||
|
|
||||||
/* Grab the inode cluster buffer. */
|
/* Grab the inode cluster buffer. */
|
||||||
error = xfs_imap_to_bp(mp, bs->cur->bc_tp, &imap, &dip, &cluster_bp, 0);
|
error = xfs_imap_to_bp(mp, bs->cur->bc_tp, &imap, &cluster_bp);
|
||||||
if (!xchk_btree_xref_process_error(bs->sc, bs->cur, 0, &error))
|
if (!xchk_btree_xref_process_error(bs->sc, bs->cur, 0, &error))
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
|
|
@ -505,14 +505,14 @@ xfs_iget_cache_miss(
|
||||||
(flags & XFS_IGET_CREATE) && !(mp->m_flags & XFS_MOUNT_IKEEP)) {
|
(flags & XFS_IGET_CREATE) && !(mp->m_flags & XFS_MOUNT_IKEEP)) {
|
||||||
VFS_I(ip)->i_generation = prandom_u32();
|
VFS_I(ip)->i_generation = prandom_u32();
|
||||||
} else {
|
} else {
|
||||||
struct xfs_dinode *dip;
|
|
||||||
struct xfs_buf *bp;
|
struct xfs_buf *bp;
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &bp, 0);
|
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &bp);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_destroy;
|
goto out_destroy;
|
||||||
|
|
||||||
error = xfs_inode_from_disk(ip, dip);
|
error = xfs_inode_from_disk(ip,
|
||||||
|
xfs_buf_offset(bp, ip->i_imap.im_boffset));
|
||||||
if (!error)
|
if (!error)
|
||||||
xfs_buf_set_ref(bp, XFS_INO_REF);
|
xfs_buf_set_ref(bp, XFS_INO_REF);
|
||||||
xfs_trans_brelse(tp, bp);
|
xfs_trans_brelse(tp, bp);
|
||||||
|
|
|
@ -2075,9 +2075,10 @@ xfs_iunlink_update_inode(
|
||||||
|
|
||||||
ASSERT(xfs_verify_agino_or_null(mp, agno, next_agino));
|
ASSERT(xfs_verify_agino_or_null(mp, agno, next_agino));
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &dip, &ibp, 0);
|
error = xfs_imap_to_bp(mp, tp, &ip->i_imap, &ibp);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
dip = xfs_buf_offset(ibp, ip->i_imap.im_boffset);
|
||||||
|
|
||||||
/* Make sure the old pointer isn't garbage. */
|
/* Make sure the old pointer isn't garbage. */
|
||||||
old_value = be32_to_cpu(dip->di_next_unlinked);
|
old_value = be32_to_cpu(dip->di_next_unlinked);
|
||||||
|
@ -2202,13 +2203,14 @@ xfs_iunlink_map_ino(
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, imap, dipp, bpp, 0);
|
error = xfs_imap_to_bp(mp, tp, imap, bpp);
|
||||||
if (error) {
|
if (error) {
|
||||||
xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
|
xfs_warn(mp, "%s: xfs_imap_to_bp returned error %d.",
|
||||||
__func__, error);
|
__func__, error);
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*dipp = xfs_buf_offset(*bpp, imap->im_boffset);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2683,9 +2683,10 @@ xlog_recover_process_one_iunlink(
|
||||||
/*
|
/*
|
||||||
* Get the on disk inode to find the next inode in the bucket.
|
* Get the on disk inode to find the next inode in the bucket.
|
||||||
*/
|
*/
|
||||||
error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &dip, &ibp, 0);
|
error = xfs_imap_to_bp(mp, NULL, &ip->i_imap, &ibp);
|
||||||
if (error)
|
if (error)
|
||||||
goto fail_iput;
|
goto fail_iput;
|
||||||
|
dip = xfs_buf_offset(ibp, ip->i_imap.im_boffset);
|
||||||
|
|
||||||
xfs_iflags_clear(ip, XFS_IRECOVERY);
|
xfs_iflags_clear(ip, XFS_IRECOVERY);
|
||||||
ASSERT(VFS_I(ip)->i_nlink == 0);
|
ASSERT(VFS_I(ip)->i_nlink == 0);
|
||||||
|
|
Loading…
Reference in New Issue