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
This commit is contained in:
Konstantin Belousov 2024-01-18 17:35:56 +02:00
parent 661db9b390
commit 13ccb04589

View file

@ -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