git: 13ccb04589e2 - main - msdosfs_integrity_error(): plug possible busy leak
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Thu, 18 Jan 2024 16:48:27 UTC
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