diff options
author | Christoph Hellwig <hch@infradead.org> | 2011-02-13 08:25:31 -0500 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2011-02-22 21:30:21 -0500 |
commit | 1050c71e2925ab0cb025e4c89e08b15529a1ee36 (patch) | |
tree | eacaa53e025ab0da4793f1c3c09fc9e15ebee6a5 /fs/xfs/xfs_rtalloc.c | |
parent | 5d15765594eeb5d82c5630b3428ea0ac4f7d3c31 (diff) |
xfs: stop using xfs_trans_iget in the RT allocator
During mount we establish references to the RT inodes, which we keep for
the lifetime of the filesystem. Instead of using xfs_trans_iget to grab
additional references when adding RT inodes to transactions use the
combination of xfs_ilock and xfs_trans_ijoin_ref, which archives the same
end result with less overhead.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Alex Elder <aelder@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_rtalloc.c')
-rw-r--r-- | fs/xfs/xfs_rtalloc.c | 54 |
1 files changed, 21 insertions, 33 deletions
diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c index f592ac978186..fbff89344bad 100644 --- a/fs/xfs/xfs_rtalloc.c +++ b/fs/xfs/xfs_rtalloc.c | |||
@@ -76,7 +76,7 @@ xfs_growfs_rt_alloc( | |||
76 | xfs_mount_t *mp, /* file system mount point */ | 76 | xfs_mount_t *mp, /* file system mount point */ |
77 | xfs_extlen_t oblocks, /* old count of blocks */ | 77 | xfs_extlen_t oblocks, /* old count of blocks */ |
78 | xfs_extlen_t nblocks, /* new count of blocks */ | 78 | xfs_extlen_t nblocks, /* new count of blocks */ |
79 | xfs_ino_t ino) /* inode number (bitmap/summary) */ | 79 | xfs_inode_t *ip) /* inode (bitmap/summary) */ |
80 | { | 80 | { |
81 | xfs_fileoff_t bno; /* block number in file */ | 81 | xfs_fileoff_t bno; /* block number in file */ |
82 | xfs_buf_t *bp; /* temporary buffer for zeroing */ | 82 | xfs_buf_t *bp; /* temporary buffer for zeroing */ |
@@ -86,7 +86,6 @@ xfs_growfs_rt_alloc( | |||
86 | xfs_fsblock_t firstblock; /* first block allocated in xaction */ | 86 | xfs_fsblock_t firstblock; /* first block allocated in xaction */ |
87 | xfs_bmap_free_t flist; /* list of freed blocks */ | 87 | xfs_bmap_free_t flist; /* list of freed blocks */ |
88 | xfs_fsblock_t fsbno; /* filesystem block for bno */ | 88 | xfs_fsblock_t fsbno; /* filesystem block for bno */ |
89 | xfs_inode_t *ip; /* pointer to incore inode */ | ||
90 | xfs_bmbt_irec_t map; /* block map output */ | 89 | xfs_bmbt_irec_t map; /* block map output */ |
91 | int nmap; /* number of block maps */ | 90 | int nmap; /* number of block maps */ |
92 | int resblks; /* space reservation */ | 91 | int resblks; /* space reservation */ |
@@ -112,9 +111,9 @@ xfs_growfs_rt_alloc( | |||
112 | /* | 111 | /* |
113 | * Lock the inode. | 112 | * Lock the inode. |
114 | */ | 113 | */ |
115 | if ((error = xfs_trans_iget(mp, tp, ino, 0, | 114 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
116 | XFS_ILOCK_EXCL, &ip))) | 115 | xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); |
117 | goto error_cancel; | 116 | |
118 | xfs_bmap_init(&flist, &firstblock); | 117 | xfs_bmap_init(&flist, &firstblock); |
119 | /* | 118 | /* |
120 | * Allocate blocks to the bitmap file. | 119 | * Allocate blocks to the bitmap file. |
@@ -155,9 +154,8 @@ xfs_growfs_rt_alloc( | |||
155 | /* | 154 | /* |
156 | * Lock the bitmap inode. | 155 | * Lock the bitmap inode. |
157 | */ | 156 | */ |
158 | if ((error = xfs_trans_iget(mp, tp, ino, 0, | 157 | xfs_ilock(ip, XFS_ILOCK_EXCL); |
159 | XFS_ILOCK_EXCL, &ip))) | 158 | xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL); |
160 | goto error_cancel; | ||
161 | /* | 159 | /* |
162 | * Get a buffer for the block. | 160 | * Get a buffer for the block. |
163 | */ | 161 | */ |
@@ -1854,7 +1852,6 @@ xfs_growfs_rt( | |||
1854 | xfs_rtblock_t bmbno; /* bitmap block number */ | 1852 | xfs_rtblock_t bmbno; /* bitmap block number */ |
1855 | xfs_buf_t *bp; /* temporary buffer */ | 1853 | xfs_buf_t *bp; /* temporary buffer */ |
1856 | int error; /* error return value */ | 1854 | int error; /* error return value */ |
1857 | xfs_inode_t *ip; /* bitmap inode, used as lock */ | ||
1858 | xfs_mount_t *nmp; /* new (fake) mount structure */ | 1855 | xfs_mount_t *nmp; /* new (fake) mount structure */ |
1859 | xfs_drfsbno_t nrblocks; /* new number of realtime blocks */ | 1856 | xfs_drfsbno_t nrblocks; /* new number of realtime blocks */ |
1860 | xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */ | 1857 | xfs_extlen_t nrbmblocks; /* new number of rt bitmap blocks */ |
@@ -1918,11 +1915,11 @@ xfs_growfs_rt( | |||
1918 | /* | 1915 | /* |
1919 | * Allocate space to the bitmap and summary files, as necessary. | 1916 | * Allocate space to the bitmap and summary files, as necessary. |
1920 | */ | 1917 | */ |
1921 | if ((error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, | 1918 | error = xfs_growfs_rt_alloc(mp, rbmblocks, nrbmblocks, mp->m_rbmip); |
1922 | mp->m_sb.sb_rbmino))) | 1919 | if (error) |
1923 | return error; | 1920 | return error; |
1924 | if ((error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, | 1921 | error = xfs_growfs_rt_alloc(mp, rsumblocks, nrsumblocks, mp->m_rsumip); |
1925 | mp->m_sb.sb_rsumino))) | 1922 | if (error) |
1926 | return error; | 1923 | return error; |
1927 | /* | 1924 | /* |
1928 | * Allocate a new (fake) mount/sb. | 1925 | * Allocate a new (fake) mount/sb. |
@@ -1972,12 +1969,8 @@ xfs_growfs_rt( | |||
1972 | /* | 1969 | /* |
1973 | * Lock out other callers by grabbing the bitmap inode lock. | 1970 | * Lock out other callers by grabbing the bitmap inode lock. |
1974 | */ | 1971 | */ |
1975 | error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, | 1972 | xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); |
1976 | XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, | 1973 | xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL); |
1977 | &ip); | ||
1978 | if (error) | ||
1979 | goto error_cancel; | ||
1980 | ASSERT(ip == mp->m_rbmip); | ||
1981 | /* | 1974 | /* |
1982 | * Update the bitmap inode's size. | 1975 | * Update the bitmap inode's size. |
1983 | */ | 1976 | */ |
@@ -1988,11 +1981,8 @@ xfs_growfs_rt( | |||
1988 | /* | 1981 | /* |
1989 | * Get the summary inode into the transaction. | 1982 | * Get the summary inode into the transaction. |
1990 | */ | 1983 | */ |
1991 | error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rsumino, 0, | 1984 | xfs_ilock(mp->m_rsumip, XFS_ILOCK_EXCL); |
1992 | XFS_ILOCK_EXCL | XFS_ILOCK_RTSUM, &ip); | 1985 | xfs_trans_ijoin_ref(tp, mp->m_rsumip, XFS_ILOCK_EXCL); |
1993 | if (error) | ||
1994 | goto error_cancel; | ||
1995 | ASSERT(ip == mp->m_rsumip); | ||
1996 | /* | 1986 | /* |
1997 | * Update the summary inode's size. | 1987 | * Update the summary inode's size. |
1998 | */ | 1988 | */ |
@@ -2154,7 +2144,6 @@ xfs_rtfree_extent( | |||
2154 | xfs_extlen_t len) /* length of extent freed */ | 2144 | xfs_extlen_t len) /* length of extent freed */ |
2155 | { | 2145 | { |
2156 | int error; /* error value */ | 2146 | int error; /* error value */ |
2157 | xfs_inode_t *ip; /* bitmap file inode */ | ||
2158 | xfs_mount_t *mp; /* file system mount structure */ | 2147 | xfs_mount_t *mp; /* file system mount structure */ |
2159 | xfs_fsblock_t sb; /* summary file block number */ | 2148 | xfs_fsblock_t sb; /* summary file block number */ |
2160 | xfs_buf_t *sumbp; /* summary file block buffer */ | 2149 | xfs_buf_t *sumbp; /* summary file block buffer */ |
@@ -2163,10 +2152,9 @@ xfs_rtfree_extent( | |||
2163 | /* | 2152 | /* |
2164 | * Synchronize by locking the bitmap inode. | 2153 | * Synchronize by locking the bitmap inode. |
2165 | */ | 2154 | */ |
2166 | error = xfs_trans_iget(mp, tp, mp->m_sb.sb_rbmino, 0, | 2155 | xfs_ilock(mp->m_rbmip, XFS_ILOCK_EXCL); |
2167 | XFS_ILOCK_EXCL | XFS_ILOCK_RTBITMAP, &ip); | 2156 | xfs_trans_ijoin_ref(tp, mp->m_rbmip, XFS_ILOCK_EXCL); |
2168 | if (error) | 2157 | |
2169 | return error; | ||
2170 | #if defined(__KERNEL__) && defined(DEBUG) | 2158 | #if defined(__KERNEL__) && defined(DEBUG) |
2171 | /* | 2159 | /* |
2172 | * Check to see that this whole range is currently allocated. | 2160 | * Check to see that this whole range is currently allocated. |
@@ -2199,10 +2187,10 @@ xfs_rtfree_extent( | |||
2199 | */ | 2187 | */ |
2200 | if (tp->t_frextents_delta + mp->m_sb.sb_frextents == | 2188 | if (tp->t_frextents_delta + mp->m_sb.sb_frextents == |
2201 | mp->m_sb.sb_rextents) { | 2189 | mp->m_sb.sb_rextents) { |
2202 | if (!(ip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) | 2190 | if (!(mp->m_rbmip->i_d.di_flags & XFS_DIFLAG_NEWRTBM)) |
2203 | ip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; | 2191 | mp->m_rbmip->i_d.di_flags |= XFS_DIFLAG_NEWRTBM; |
2204 | *(__uint64_t *)&ip->i_d.di_atime = 0; | 2192 | *(__uint64_t *)&mp->m_rbmip->i_d.di_atime = 0; |
2205 | xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); | 2193 | xfs_trans_log_inode(tp, mp->m_rbmip, XFS_ILOG_CORE); |
2206 | } | 2194 | } |
2207 | return 0; | 2195 | return 0; |
2208 | } | 2196 | } |