aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2017-08-11 12:00:06 -0400
committerDarrick J. Wong <darrick.wong@oracle.com>2017-08-11 19:56:33 -0400
commitc44245b3d5435f533ca8346ece65918f84c057f9 (patch)
treee68e72bf645789fce0a13b4606c6bf278f2795b9 /fs/xfs
parent56bdf855e676f1f2ed7033f288f57dfd315725ba (diff)
xfs: fix inobt inode allocation search optimization
When we try to allocate a free inode by searching the inobt, we try to find the inode nearest the parent inode by searching chunks both left and right of the chunk containing the parent. As an optimization, we cache the leftmost and rightmost records that we previously searched; if we do another allocation with the same parent inode, we'll pick up the search where it last left off. There's a bug in the case where we found a free inode to the left of the parent's chunk: we need to update the cached left and right records, but because we already reassigned the right record to point to the left, we end up assigning the left record to both the cached left and right records. This isn't a correctness problem strictly, but it can result in the next allocation rechecking chunks unnecessarily or allocating inodes further away from the parent than it needs to. Fix it by swapping the record pointer after we update the cached left and right records. Fixes: bd169565993b ("xfs: speed up free inode search") Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com> Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/libxfs/xfs_ialloc.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/xfs/libxfs/xfs_ialloc.c b/fs/xfs/libxfs/xfs_ialloc.c
index ffd5a15d1bb6..abf5beaae907 100644
--- a/fs/xfs/libxfs/xfs_ialloc.c
+++ b/fs/xfs/libxfs/xfs_ialloc.c
@@ -1246,13 +1246,13 @@ xfs_dialloc_ag_inobt(
1246 1246
1247 /* free inodes to the left? */ 1247 /* free inodes to the left? */
1248 if (useleft && trec.ir_freecount) { 1248 if (useleft && trec.ir_freecount) {
1249 rec = trec;
1250 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR); 1249 xfs_btree_del_cursor(cur, XFS_BTREE_NOERROR);
1251 cur = tcur; 1250 cur = tcur;
1252 1251
1253 pag->pagl_leftrec = trec.ir_startino; 1252 pag->pagl_leftrec = trec.ir_startino;
1254 pag->pagl_rightrec = rec.ir_startino; 1253 pag->pagl_rightrec = rec.ir_startino;
1255 pag->pagl_pagino = pagino; 1254 pag->pagl_pagino = pagino;
1255 rec = trec;
1256 goto alloc_inode; 1256 goto alloc_inode;
1257 } 1257 }
1258 1258