Message ID | 170191665178.1180191.7709444254217822674.stgit@frogsfrogsfrogs (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xfs: prepare repair for bulk loading | expand |
On Wed, Dec 06, 2023 at 06:38:50PM -0800, Darrick J. Wong wrote: > From: Darrick J. Wong <djwong@kernel.org> > > The btree bulkloading code calls xfs_buf_delwri_queue_here when it has > finished formatting a new btree block and wants to queue it to be > written to disk. Once the new btree root has been committed, the blocks > (and hence the buffers) will be accessible to the rest of the > filesystem. Mark each new buffer as DONE when adding it to the delwri > list so that the next btree traversal can skip reloading the contents > from disk. This still seems like the wrong place to me - it really is the caller that fills it out that should set the DONE flag, not a non-standard delwri helper that should hopefully go away in the future.
On Wed, Dec 06, 2023 at 09:26:06PM -0800, Christoph Hellwig wrote: > On Wed, Dec 06, 2023 at 06:38:50PM -0800, Darrick J. Wong wrote: > > From: Darrick J. Wong <djwong@kernel.org> > > > > The btree bulkloading code calls xfs_buf_delwri_queue_here when it has > > finished formatting a new btree block and wants to queue it to be > > written to disk. Once the new btree root has been committed, the blocks > > (and hence the buffers) will be accessible to the rest of the > > filesystem. Mark each new buffer as DONE when adding it to the delwri > > list so that the next btree traversal can skip reloading the contents > > from disk. > > This still seems like the wrong place to me - it really is the caller > that fills it out that should set the DONE flag, not a non-standard > delwri helper that should hopefully go away in the future. I'll move it to xfs_btree_bload_drop_buf then. --D
diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c index ec4bd7a24d88c..702b3a1f9d1c4 100644 --- a/fs/xfs/xfs_buf.c +++ b/fs/xfs/xfs_buf.c @@ -2152,6 +2152,14 @@ xfs_buf_delwri_queue_here( ASSERT(!(bp->b_flags & _XBF_DELWRI_Q)); + /* + * The buffer is locked. The _delwri_queue below will bhold the buffer + * so it cannot be reclaimed until the blocks are written to disk. + * Mark this buffer XBF_DONE (i.e. uptodate) so that a subsequent + * xfs_buf_read will not pointlessly reread the contents from the disk. + */ + bp->b_flags |= XBF_DONE; + xfs_buf_delwri_queue(bp, buffer_list); }