Date: Fri, 9 Feb 2018 19:50:47 +0000 (UTC) From: Kirk McKusick <mckusick@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r329078 - in head/sys: kern sys Message-ID: <201802091950.w19Joljx041243@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: mckusick Date: Fri Feb 9 19:50:47 2018 New Revision: 329078 URL: https://svnweb.freebsd.org/changeset/base/329078 Log: Merge biodone_finish() back into biodone(). The primary purpose is to make the order of operations clearer to avoid the race condition that was fixed in r328914. In particular, this commit corrects a similar race that existed in the soft updates callback. Doing some sleuthing through the SVN repository, it appears that bufdone_finish() was added to support XFS: ------------------------------------------------------------------------ r153192 | rodrigc | 2005-12-06 19:39:08 -0800 (Tue, 06 Dec 2005) | 13 lines Changes imported from XFS for FreeBSD project: - add fields to struct buf (needed by XFS) - 3 private fields: b_fsprivate1, b_fsprivate2, b_fsprivate3 - b_pin_count, count of pinned buffer - add new B_MANAGED flag - add breada() function to initiate asynchronous I/O on read-ahead blocks. - add bufdone_finish(), bpin(), bunpin_wait() functions Patches provided by: kan Reviewed by: phk Silence on: arch@ ------------------------------------------------------------------------ It does not appear to ever have been used for anything else. XFS was disconnected in r241607: ------------------------------------------------------------------------ r241607 | attilio | 2012-10-16 03:04:00 -0700 (Tue, 16 Oct 2012) | 5 lines Disconnect non-MPSAFE XFS from the build in preparation for dropping GIANT from VFS. This is not targeted for MFC. ------------------------------------------------------------------------ and removed entirely in r247631: ------------------------------------------------------------------------ r247631 | attilio | 2013-03-02 07:33:54 -0800 (Sat, 02 Mar 2013) | 5 lines Garbage collect XFS bits which are now already completely disconnected from the tree since few months. This is not targeted for MFC. ------------------------------------------------------------------------ Since XFS support is gone, there is no reason to retain biodone_finish(). Suggested by: Warner Losh (imp) Discussed with: cem, kib Tested by: Peter Holm (pho) Modified: head/sys/kern/vfs_bio.c head/sys/sys/buf.h Modified: head/sys/kern/vfs_bio.c ============================================================================== --- head/sys/kern/vfs_bio.c Fri Feb 9 19:46:51 2018 (r329077) +++ head/sys/kern/vfs_bio.c Fri Feb 9 19:50:47 2018 (r329078) @@ -4086,21 +4086,6 @@ bufdone(struct buf *bp) bufobj_wdrop(dropobj); return; } - - bufdone_finish(bp); - - if (dropobj) - bufobj_wdrop(dropobj); -} - -void -bufdone_finish(struct buf *bp) -{ - BUF_ASSERT_HELD(bp); - - if (!LIST_EMPTY(&bp->b_dep)) - buf_complete(bp); - if (bp->b_flags & B_VMIO) { /* * Set B_CACHE if the op was a normal read and no error @@ -4113,14 +4098,14 @@ bufdone_finish(struct buf *bp) bp->b_flags |= B_CACHE; vfs_vmio_iodone(bp); } + if (!LIST_EMPTY(&bp->b_dep)) + buf_complete(bp); if ((bp->b_flags & B_CKHASH) != 0) { KASSERT(bp->b_iocmd == BIO_READ, - ("bufdone_finish: b_iocmd %d not BIO_READ", bp->b_iocmd)); - KASSERT(buf_mapped(bp), - ("bufdone_finish: bp %p not mapped", bp)); + ("bufdone: b_iocmd %d not BIO_READ", bp->b_iocmd)); + KASSERT(buf_mapped(bp), ("bufdone: bp %p not mapped", bp)); (*bp->b_ckhashcalc)(bp); } - /* * For asynchronous completions, release the buffer now. The brelse * will do a wakeup there if necessary - so no need to do a wakeup @@ -4134,6 +4119,8 @@ bufdone_finish(struct buf *bp) bqrelse(bp); } else bdone(bp); + if (dropobj) + bufobj_wdrop(dropobj); } /* Modified: head/sys/sys/buf.h ============================================================================== --- head/sys/sys/buf.h Fri Feb 9 19:46:51 2018 (r329077) +++ head/sys/sys/buf.h Fri Feb 9 19:50:47 2018 (r329078) @@ -542,7 +542,6 @@ struct buf *geteblk(int, int); int bufwait(struct buf *); int bufwrite(struct buf *); void bufdone(struct buf *); -void bufdone_finish(struct buf *); void bd_speedup(void); int cluster_read(struct vnode *, u_quad_t, daddr_t, long,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201802091950.w19Joljx041243>