Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Jan 2024 16:48:27 GMT
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 13ccb04589e2 - main - msdosfs_integrity_error(): plug possible busy leak
Message-ID:  <202401181648.40IGmR3L013178@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=13ccb04589e2c5c840e19b407a59e44cb70ac28e

commit 13ccb04589e2c5c840e19b407a59e44cb70ac28e
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2024-01-18 15:35:56 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2024-01-18 16:48:05 +0000

    msdosfs_integrity_error(): plug possible busy leak
    
    If taskqueue_enqueue() returned error, unbusy().
    Handle parallel calls to msdosfs_integrity_error() by unbusying in
    msdosfs_remount_ro() up to pending times.
    
    Noted and reviewed by:  markj
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D43482
---
 sys/fs/msdosfs/msdosfs_vfsops.c | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/sys/fs/msdosfs/msdosfs_vfsops.c b/sys/fs/msdosfs/msdosfs_vfsops.c
index df96bcbfe9c6..03c794bad900 100644
--- a/sys/fs/msdosfs/msdosfs_vfsops.c
+++ b/sys/fs/msdosfs/msdosfs_vfsops.c
@@ -1006,7 +1006,9 @@ msdosfs_remount_ro(void *arg, int pending)
 	}
 	MSDOSFS_UNLOCK_MP(pmp);
 
-	vfs_unbusy(pmp->pm_mountp);
+	do {
+		vfs_unbusy(pmp->pm_mountp);
+	} while (--pending >= 0);
 }
 
 void
@@ -1015,11 +1017,19 @@ msdosfs_integrity_error(struct msdosfsmount *pmp)
 	int error;
 
 	error = vfs_busy(pmp->pm_mountp, MBF_NOWAIT);
-	if (error == 0)
-		taskqueue_enqueue(taskqueue_thread, &pmp->pm_rw2ro_task);
-	else
+	if (error == 0) {
+		error = taskqueue_enqueue(taskqueue_thread,
+		    &pmp->pm_rw2ro_task);
+		if (error != 0) {
+			printf("%s: integrity error scheduling failed, "
+			    "error %d\n",
+			    pmp->pm_mountp->mnt_stat.f_mntfromname, error);
+			vfs_unbusy(pmp->pm_mountp);
+		}
+	} else {
 		printf("%s: integrity error busying failed, error %d\n",
 		    pmp->pm_mountp->mnt_stat.f_mntfromname, error);
+	}
 }
 
 static int



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202401181648.40IGmR3L013178>