mirror of https://gitee.com/openkylin/linux.git
[XFS] stop using xfs_itobp in xfs_iread
The only caller of xfs_itobp that doesn't have i_blkno setup is now the initial inode read. It needs access to the whole xfs_imap so using xfs_inotobp is not an option. Instead opencode the buffer lookup in xfs_iread and kill all the functionality for the initial map from xfs_itobp. (First sent on October 21st) 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
23fac50f95
commit
76d8b277f7
|
@ -262,15 +262,11 @@ xfs_inotobp(
|
||||||
* If a non-zero error is returned, then the contents of bpp and
|
* If a non-zero error is returned, then the contents of bpp and
|
||||||
* dipp are undefined.
|
* dipp are undefined.
|
||||||
*
|
*
|
||||||
* If the inode is new and has not yet been initialized, use xfs_imap()
|
* The inode is expected to already been mapped to its buffer and read
|
||||||
* to determine the size and location of the buffer to read from disk.
|
* in once, thus we can use the mapping information stored in the inode
|
||||||
* If the inode has already been mapped to its buffer and read in once,
|
* rather than calling xfs_imap(). This allows us to avoid the overhead
|
||||||
* then use the mapping information stored in the inode rather than
|
* of looking at the inode btree for small block file systems
|
||||||
* calling xfs_imap(). This allows us to avoid the overhead of looking
|
* (see xfs_dilocate()).
|
||||||
* at the inode btree for small block file systems (see xfs_dilocate()).
|
|
||||||
* We can tell whether the inode has been mapped in before by comparing
|
|
||||||
* its disk block address to 0. Only uninitialized inodes will have
|
|
||||||
* 0 for the disk block address.
|
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
xfs_itobp(
|
xfs_itobp(
|
||||||
|
@ -279,40 +275,19 @@ xfs_itobp(
|
||||||
xfs_inode_t *ip,
|
xfs_inode_t *ip,
|
||||||
xfs_dinode_t **dipp,
|
xfs_dinode_t **dipp,
|
||||||
xfs_buf_t **bpp,
|
xfs_buf_t **bpp,
|
||||||
xfs_daddr_t bno,
|
|
||||||
uint imap_flags,
|
|
||||||
uint buf_flags)
|
uint buf_flags)
|
||||||
{
|
{
|
||||||
xfs_imap_t imap;
|
xfs_imap_t imap;
|
||||||
xfs_buf_t *bp;
|
xfs_buf_t *bp;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
if (ip->i_blkno == (xfs_daddr_t)0) {
|
ASSERT(ip->i_blkno != 0);
|
||||||
imap.im_blkno = bno;
|
|
||||||
error = xfs_imap(mp, tp, ip->i_ino, &imap,
|
|
||||||
XFS_IMAP_LOOKUP | imap_flags);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
/*
|
imap.im_blkno = ip->i_blkno;
|
||||||
* Fill in the fields in the inode that will be used to
|
imap.im_len = ip->i_len;
|
||||||
* map the inode to its buffer from now on.
|
imap.im_boffset = ip->i_boffset;
|
||||||
*/
|
|
||||||
ip->i_blkno = imap.im_blkno;
|
|
||||||
ip->i_len = imap.im_len;
|
|
||||||
ip->i_boffset = imap.im_boffset;
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* We've already mapped the inode once, so just use the
|
|
||||||
* mapping that we saved the first time.
|
|
||||||
*/
|
|
||||||
imap.im_blkno = ip->i_blkno;
|
|
||||||
imap.im_len = ip->i_len;
|
|
||||||
imap.im_boffset = ip->i_boffset;
|
|
||||||
}
|
|
||||||
ASSERT(bno == 0 || bno == imap.im_blkno);
|
|
||||||
|
|
||||||
error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, imap_flags);
|
error = xfs_imap_to_bp(mp, tp, &imap, &bp, buf_flags, 0);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -882,6 +857,7 @@ 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);
|
||||||
|
@ -889,16 +865,28 @@ xfs_iread(
|
||||||
return ENOMEM;
|
return ENOMEM;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get pointer's to the on-disk inode and the buffer containing it.
|
* Get pointers to the on-disk inode and the buffer containing it.
|
||||||
* If the inode number refers to a block outside the file system
|
|
||||||
* then xfs_itobp() will return NULL. In this case we should
|
|
||||||
* return NULL as well. Set i_blkno to 0 so that xfs_itobp() will
|
|
||||||
* know that this is a new incore inode.
|
|
||||||
*/
|
*/
|
||||||
error = xfs_itobp(mp, tp, ip, &dip, &bp, bno, imap_flags, XFS_BUF_LOCK);
|
imap.im_blkno = bno;
|
||||||
|
error = xfs_imap(mp, tp, ip->i_ino, &imap,
|
||||||
|
XFS_IMAP_LOOKUP | imap_flags);
|
||||||
if (error)
|
if (error)
|
||||||
goto out_destroy_inode;
|
goto out_destroy_inode;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Fill in the fields in the inode that will be used to
|
||||||
|
* map the inode to its buffer from now on.
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
if (error)
|
||||||
|
goto out_destroy_inode;
|
||||||
|
dip = (xfs_dinode_t *)xfs_buf_offset(bp, 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
|
||||||
* (nfs or dmi) has a stale handle.
|
* (nfs or dmi) has a stale handle.
|
||||||
|
@ -1878,7 +1866,7 @@ xfs_iunlink(
|
||||||
* Here we put the head pointer into our next pointer,
|
* Here we put the head pointer into our next pointer,
|
||||||
* and then we fall through to point the head at us.
|
* and then we fall through to point the head at us.
|
||||||
*/
|
*/
|
||||||
error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0, XFS_BUF_LOCK);
|
error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -1960,7 +1948,7 @@ xfs_iunlink_remove(
|
||||||
* of dealing with the buffer when there is no need to
|
* of dealing with the buffer when there is no need to
|
||||||
* change it.
|
* change it.
|
||||||
*/
|
*/
|
||||||
error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0, XFS_BUF_LOCK);
|
error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK);
|
||||||
if (error) {
|
if (error) {
|
||||||
cmn_err(CE_WARN,
|
cmn_err(CE_WARN,
|
||||||
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
||||||
|
@ -2022,7 +2010,7 @@ xfs_iunlink_remove(
|
||||||
* Now last_ibp points to the buffer previous to us on
|
* Now last_ibp points to the buffer previous to us on
|
||||||
* the unlinked list. Pull us from the list.
|
* the unlinked list. Pull us from the list.
|
||||||
*/
|
*/
|
||||||
error = xfs_itobp(mp, tp, ip, &dip, &ibp, 0, 0, XFS_BUF_LOCK);
|
error = xfs_itobp(mp, tp, ip, &dip, &ibp, XFS_BUF_LOCK);
|
||||||
if (error) {
|
if (error) {
|
||||||
cmn_err(CE_WARN,
|
cmn_err(CE_WARN,
|
||||||
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
"xfs_iunlink_remove: xfs_itobp() returned an error %d on %s. Returning error.",
|
||||||
|
@ -2277,7 +2265,7 @@ xfs_ifree(
|
||||||
|
|
||||||
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
||||||
|
|
||||||
error = xfs_itobp(ip->i_mount, tp, ip, &dip, &ibp, 0, 0, XFS_BUF_LOCK);
|
error = xfs_itobp(ip->i_mount, tp, ip, &dip, &ibp, XFS_BUF_LOCK);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -3191,7 +3179,7 @@ xfs_iflush(
|
||||||
/*
|
/*
|
||||||
* Get the buffer containing the on-disk inode.
|
* Get the buffer containing the on-disk inode.
|
||||||
*/
|
*/
|
||||||
error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0, 0,
|
error = xfs_itobp(mp, NULL, ip, &dip, &bp,
|
||||||
noblock ? XFS_BUF_TRYLOCK : XFS_BUF_LOCK);
|
noblock ? XFS_BUF_TRYLOCK : XFS_BUF_LOCK);
|
||||||
if (error || !bp) {
|
if (error || !bp) {
|
||||||
xfs_ifunlock(ip);
|
xfs_ifunlock(ip);
|
||||||
|
|
|
@ -157,7 +157,7 @@ typedef struct xfs_icdinode {
|
||||||
#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */
|
#define XFS_IFEXTIREC 0x08 /* Indirection array of extent blocks */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Flags for xfs_inotobp, xfs_itobp(), xfs_imap() and xfs_dilocate().
|
* Flags for xfs_inotobp, xfs_imap() and xfs_dilocate().
|
||||||
*/
|
*/
|
||||||
#define XFS_IMAP_LOOKUP 0x1
|
#define XFS_IMAP_LOOKUP 0x1
|
||||||
#define XFS_IMAP_BULKSTAT 0x2
|
#define XFS_IMAP_BULKSTAT 0x2
|
||||||
|
@ -550,7 +550,7 @@ int xfs_inotobp(struct xfs_mount *, struct xfs_trans *,
|
||||||
struct xfs_buf **, int *, uint);
|
struct xfs_buf **, int *, uint);
|
||||||
int xfs_itobp(struct xfs_mount *, struct xfs_trans *,
|
int xfs_itobp(struct xfs_mount *, struct xfs_trans *,
|
||||||
struct xfs_inode *, struct xfs_dinode **,
|
struct xfs_inode *, struct xfs_dinode **,
|
||||||
struct xfs_buf **, xfs_daddr_t, uint, uint);
|
struct xfs_buf **, uint);
|
||||||
void xfs_dinode_from_disk(struct xfs_icdinode *,
|
void xfs_dinode_from_disk(struct xfs_icdinode *,
|
||||||
struct xfs_dinode *);
|
struct xfs_dinode *);
|
||||||
void xfs_dinode_to_disk(struct xfs_dinode *,
|
void xfs_dinode_to_disk(struct xfs_dinode *,
|
||||||
|
|
|
@ -3169,7 +3169,7 @@ 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.
|
||||||
*/
|
*/
|
||||||
ASSERT(ip != NULL);
|
ASSERT(ip != NULL);
|
||||||
error = xfs_itobp(mp, NULL, ip, &dip, &ibp, 0, 0, XFS_BUF_LOCK);
|
error = xfs_itobp(mp, NULL, ip, &dip, &ibp, XFS_BUF_LOCK);
|
||||||
if (error)
|
if (error)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue