filesystems: use g_vfs_close_unlocked(9)

As result, we lock the devvp vnode around calls to VOP_FSYNC() on
unmount. For instance, the vn_fsync_buf() implementation of fsync()
needs exclusive lock on the vnode to guarantee that all dirty buffers
are indeed synced.

Reviewed by:	markj
Tested by:	pho
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D59932
This commit is contained in:
Konstantin Belousov committed 2026-09-24 21:38:33 +03:00
1 parent 87962e08fa
commit 53edaad235
5 files changed
+13 -38

No files matched your search

+3 -8
View File
@@ -506,11 +506,8 @@ out:
brelse(pribp); brelse(pribp);
if (supbp != NULL) if (supbp != NULL)
brelse(supbp); brelse(supbp);
if (cp != NULL) { if (cp != NULL)
g_topology_lock(); g_vfs_close_unlocked(cp);
g_vfs_close(cp);
g_topology_unlock();
}
if (isomp) { if (isomp) {
free(isomp, M_ISOFSMNT); free(isomp, M_ISOFSMNT);
mp->mnt_data = NULL; mp->mnt_data = NULL;
@@ -541,9 +538,7 @@ cd9660_unmount(struct mount *mp, int mntflags)
if (isomp->im_l2d) if (isomp->im_l2d)
cd9660_iconv->close(isomp->im_l2d); cd9660_iconv->close(isomp->im_l2d);
} }
g_topology_lock(); g_vfs_close_unlocked(isomp->im_cp);
g_vfs_close(isomp->im_cp);
g_topology_unlock();
vrele(isomp->im_devvp); vrele(isomp->im_devvp);
dev_rel(isomp->im_dev); dev_rel(isomp->im_dev);
free(isomp, M_ISOFSMNT); free(isomp, M_ISOFSMNT);
+3 -12
View File
@@ -837,7 +837,6 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp)
struct ext2fs *es; struct ext2fs *es;
struct cdev *dev = devvp->v_rdev; struct cdev *dev = devvp->v_rdev;
struct g_consumer *cp; struct g_consumer *cp;
struct bufobj *bo;
struct csum *sump; struct csum *sump;
int error; int error;
int ronly; int ronly;
@@ -870,9 +869,6 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp)
goto out; goto out;
} }
bo = &devvp->v_bufobj;
bo->bo_private = cp;
bo->bo_ops = g_vfs_bufops;
if (devvp->v_rdev->si_iosize_max != 0) if (devvp->v_rdev->si_iosize_max != 0)
mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max; mp->mnt_iosize_max = devvp->v_rdev->si_iosize_max;
if (mp->mnt_iosize_max > maxphys) if (mp->mnt_iosize_max > maxphys)
@@ -983,11 +979,8 @@ ext2_mountfs(struct vnode *devvp, struct mount *mp)
out: out:
if (bp) if (bp)
brelse(bp); brelse(bp);
if (cp != NULL) { if (cp != NULL)
g_topology_lock(); g_vfs_close_unlocked(cp);
g_vfs_close(cp);
g_topology_unlock();
}
if (ump) { if (ump) {
mtx_destroy(EXT2_MTX(ump)); mtx_destroy(EXT2_MTX(ump));
free(ump->um_e2fs->e2fs_gd, M_EXT2MNT); free(ump->um_e2fs->e2fs_gd, M_EXT2MNT);
@@ -1029,9 +1022,7 @@ ext2_unmount(struct mount *mp, int mntflags)
ext2_sbupdate(ump, MNT_WAIT); ext2_sbupdate(ump, MNT_WAIT);
} }
g_topology_lock(); g_vfs_close_unlocked(ump->um_cp);
g_vfs_close(ump->um_cp);
g_topology_unlock();
vrele(ump->um_devvp); vrele(ump->um_devvp);
sump = fs->e2fs_clustersum; sump = fs->e2fs_clustersum;
for (i = 0; i < fs->e2fs_gcount; i++, sump++) for (i = 0; i < fs->e2fs_gcount; i++, sump++)
+2 -5
View File
@@ -863,11 +863,8 @@ mountmsdosfs(struct vnode *odevvp, struct mount *mp)
error_exit: error_exit:
if (bp != NULL) if (bp != NULL)
brelse(bp); brelse(bp);
if (cp != NULL) { if (cp != NULL)
g_topology_lock(); g_vfs_close_unlocked(cp);
g_vfs_close(cp);
g_topology_unlock();
}
if (pmp != NULL) { if (pmp != NULL) {
lockdestroy(&pmp->pm_fatlock); lockdestroy(&pmp->pm_fatlock);
free(pmp->pm_inusemap, M_MSDOSFSFAT); free(pmp->pm_inusemap, M_MSDOSFSFAT);
+3 -8
View File
@@ -496,11 +496,8 @@ bail:
free(udfmp, M_UDFMOUNT); free(udfmp, M_UDFMOUNT);
if (bp != NULL) if (bp != NULL)
brelse(bp); brelse(bp);
if (cp != NULL) { if (cp != NULL)
g_topology_lock(); g_vfs_close_unlocked(cp);
g_vfs_close(cp);
g_topology_unlock();
}
dev_rel(dev); dev_rel(dev);
return error; return error;
}; };
@@ -528,9 +525,7 @@ udf_unmount(struct mount *mp, int mntflags)
#endif #endif
} }
g_topology_lock(); g_vfs_close_unlocked(udfmp->im_cp);
g_vfs_close(udfmp->im_cp);
g_topology_unlock();
vrele(udfmp->im_devvp); vrele(udfmp->im_devvp);
dev_rel(udfmp->im_dev); dev_rel(udfmp->im_dev);
+2 -5
View File
@@ -1202,11 +1202,8 @@ out:
free(fs->fs_si, M_UFSMNT); free(fs->fs_si, M_UFSMNT);
free(fs, M_UFSMNT); free(fs, M_UFSMNT);
} }
if (cp != NULL) { if (cp != NULL)
g_topology_lock(); g_vfs_close_unlocked(cp);
g_vfs_close(cp);
g_topology_unlock();
}
if (ump != NULL) { if (ump != NULL) {
mtx_destroy(UFS_MTX(ump)); mtx_destroy(UFS_MTX(ump));
if (mp->mnt_gjprovider != NULL) { if (mp->mnt_gjprovider != NULL) {