git: 81cdb19e04e5 - main - ffs softdep: clear ump->um_softdep on softdep_unmount()

Konstantin Belousov kib at FreeBSD.org
Fri Mar 12 11:32:27 UTC 2021


The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=81cdb19e04e57a934e8a5dd76e5c7e0afcba1acb

commit 81cdb19e04e57a934e8a5dd76e5c7e0afcba1acb
Author:     Konstantin Belousov <kib at FreeBSD.org>
AuthorDate: 2021-03-03 17:42:24 +0000
Commit:     Konstantin Belousov <kib at FreeBSD.org>
CommitDate: 2021-03-12 11:31:07 +0000

    ffs softdep: clear ump->um_softdep on softdep_unmount()
    
    Reviewed by:    mckusick
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      2 weeks
    Differential revision:  https://reviews.freebsd.org/D29178
---
 sys/ufs/ffs/ffs_softdep.c | 47 ++++++++++++++++++++++++++---------------------
 1 file changed, 26 insertions(+), 21 deletions(-)

diff --git a/sys/ufs/ffs/ffs_softdep.c b/sys/ufs/ffs/ffs_softdep.c
index 9c32a785a321..c1a9c300aeff 100644
--- a/sys/ufs/ffs/ffs_softdep.c
+++ b/sys/ufs/ffs/ffs_softdep.c
@@ -2776,13 +2776,11 @@ softdep_unmount(mp)
 	struct mount *mp;
 {
 	struct ufsmount *ump;
-#ifdef INVARIANTS
-	int i;
-#endif
+	struct mount_softdeps *ums;
 
-	KASSERT(MOUNTEDSOFTDEP(mp) != 0,
-	    ("softdep_unmount called on non-softdep filesystem"));
 	ump = VFSTOUFS(mp);
+	KASSERT(ump->um_softdep != NULL,
+	    ("softdep_unmount called on non-softdep filesystem"));
 	MNT_ILOCK(mp);
 	mp->mnt_flag &= ~MNT_SOFTDEP;
 	if (MOUNTEDSUJ(mp) == 0) {
@@ -2805,30 +2803,37 @@ softdep_unmount(mp)
 		KASSERT((ump->softdep_flags & FLUSH_EXIT) == 0,
 		    ("Thread shutdown failed"));
 	}
+
 	/*
-	 * Free up our resources.
+	 * We are no longer have softdep structure attached to ump.
 	 */
+	ums = ump->um_softdep;
 	ACQUIRE_GBLLOCK(&lk);
-	TAILQ_REMOVE(&softdepmounts, ump->um_softdep, sd_next);
+	TAILQ_REMOVE(&softdepmounts, ums, sd_next);
 	FREE_GBLLOCK(&lk);
-	rw_destroy(LOCK_PTR(ump));
-	hashdestroy(ump->pagedep_hashtbl, M_PAGEDEP, ump->pagedep_hash_size);
-	hashdestroy(ump->inodedep_hashtbl, M_INODEDEP, ump->inodedep_hash_size);
-	hashdestroy(ump->newblk_hashtbl, M_NEWBLK, ump->newblk_hash_size);
-	hashdestroy(ump->bmsafemap_hashtbl, M_BMSAFEMAP,
-	    ump->bmsafemap_hash_size);
-	free(ump->indir_hashtbl, M_FREEWORK);
+	ump->um_softdep = NULL;
+
+	/*
+	 * Free up our resources.
+	 */
+	rw_destroy(&ums->sd_fslock);
+	hashdestroy(ums->sd_pdhash, M_PAGEDEP, ums->sd_pdhashsize);
+	hashdestroy(ums->sd_idhash, M_INODEDEP, ums->sd_idhashsize);
+	hashdestroy(ums->sd_newblkhash, M_NEWBLK, ums->sd_newblkhashsize);
+	hashdestroy(ums->sd_bmhash, M_BMSAFEMAP, ums->sd_bmhashsize);
+	free(ums->sd_indirhash, M_FREEWORK);
 #ifdef INVARIANTS
-	for (i = 0; i <= D_LAST; i++) {
-		KASSERT(ump->softdep_curdeps[i] == 0,
+	for (int i = 0; i <= D_LAST; i++) {
+		KASSERT(ums->sd_curdeps[i] == 0,
 		    ("Unmount %s: Dep type %s != 0 (%ld)", ump->um_fs->fs_fsmnt,
-		    TYPENAME(i), ump->softdep_curdeps[i]));
-		KASSERT(LIST_EMPTY(&ump->softdep_alldeps[i]),
-		    ("Unmount %s: Dep type %s not empty (%p)", ump->um_fs->fs_fsmnt,
-		    TYPENAME(i), LIST_FIRST(&ump->softdep_alldeps[i])));
+		    TYPENAME(i), ums->sd_curdeps[i]));
+		KASSERT(LIST_EMPTY(&ums->sd_alldeps[i]),
+		    ("Unmount %s: Dep type %s not empty (%p)",
+		    ump->um_fs->fs_fsmnt,
+		    TYPENAME(i), LIST_FIRST(&ums->sd_alldeps[i])));
 	}
 #endif
-	free(ump->um_softdep, M_MOUNTDATA);
+	free(ums, M_MOUNTDATA);
 }
 
 static struct jblocks *


More information about the dev-commits-src-main mailing list