Check suspendability on the mountpoint returned by VOP_GETWRITEMOUNT.
This obviates the need for a MNTK_SUSPENDABLE flag, since passthrough filesystems like nullfs and unionfs no longer need to inherit this information from their lower layer(s). This change also restores the pre-r273336 behaviour of using the presence of a susp_clean VFS method to request suspension support. Reviewed by: kib, mjg Differential Revision: https://reviews.freebsd.org/D2937
This commit is contained in:
parent
010ba3842c
commit
5f34e93c58
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=285182
@ -199,7 +199,7 @@ nullfs_mount(struct mount *mp)
|
|||||||
}
|
}
|
||||||
mp->mnt_kern_flag |= MNTK_LOOKUP_EXCL_DOTDOT;
|
mp->mnt_kern_flag |= MNTK_LOOKUP_EXCL_DOTDOT;
|
||||||
mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag &
|
mp->mnt_kern_flag |= lowerrootvp->v_mount->mnt_kern_flag &
|
||||||
(MNTK_SUSPENDABLE | MNTK_USES_BCACHE);
|
MNTK_USES_BCACHE;
|
||||||
MNT_IUNLOCK(mp);
|
MNT_IUNLOCK(mp);
|
||||||
mp->mnt_data = xmp;
|
mp->mnt_data = xmp;
|
||||||
vfs_getnewfsid(mp);
|
vfs_getnewfsid(mp);
|
||||||
|
@ -75,6 +75,7 @@ static int tmpfs_root(struct mount *, int flags, struct vnode **);
|
|||||||
static int tmpfs_fhtovp(struct mount *, struct fid *, int,
|
static int tmpfs_fhtovp(struct mount *, struct fid *, int,
|
||||||
struct vnode **);
|
struct vnode **);
|
||||||
static int tmpfs_statfs(struct mount *, struct statfs *);
|
static int tmpfs_statfs(struct mount *, struct statfs *);
|
||||||
|
static void tmpfs_susp_clean(struct mount *);
|
||||||
|
|
||||||
static const char *tmpfs_opts[] = {
|
static const char *tmpfs_opts[] = {
|
||||||
"from", "size", "maxfilesize", "inodes", "uid", "gid", "mode", "export",
|
"from", "size", "maxfilesize", "inodes", "uid", "gid", "mode", "export",
|
||||||
@ -256,7 +257,7 @@ tmpfs_mount(struct mount *mp)
|
|||||||
|
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
mp->mnt_flag |= MNT_LOCAL;
|
mp->mnt_flag |= MNT_LOCAL;
|
||||||
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_SUSPENDABLE;
|
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED;
|
||||||
MNT_IUNLOCK(mp);
|
MNT_IUNLOCK(mp);
|
||||||
|
|
||||||
mp->mnt_data = tmp;
|
mp->mnt_data = tmp;
|
||||||
@ -462,6 +463,14 @@ tmpfs_sync(struct mount *mp, int waitfor)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The presence of a susp_clean method tells the VFS to track writes.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
tmpfs_susp_clean(struct mount *mp __unused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* tmpfs vfs operations.
|
* tmpfs vfs operations.
|
||||||
*/
|
*/
|
||||||
@ -473,5 +482,6 @@ struct vfsops tmpfs_vfsops = {
|
|||||||
.vfs_statfs = tmpfs_statfs,
|
.vfs_statfs = tmpfs_statfs,
|
||||||
.vfs_fhtovp = tmpfs_fhtovp,
|
.vfs_fhtovp = tmpfs_fhtovp,
|
||||||
.vfs_sync = tmpfs_sync,
|
.vfs_sync = tmpfs_sync,
|
||||||
|
.vfs_susp_clean = tmpfs_susp_clean,
|
||||||
};
|
};
|
||||||
VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL);
|
VFS_SET(tmpfs_vfsops, tmpfs, VFCF_JAIL);
|
||||||
|
@ -294,9 +294,6 @@ unionfs_domount(struct mount *mp)
|
|||||||
if ((ump->um_lowervp->v_mount->mnt_flag & MNT_LOCAL) &&
|
if ((ump->um_lowervp->v_mount->mnt_flag & MNT_LOCAL) &&
|
||||||
(ump->um_uppervp->v_mount->mnt_flag & MNT_LOCAL))
|
(ump->um_uppervp->v_mount->mnt_flag & MNT_LOCAL))
|
||||||
mp->mnt_flag |= MNT_LOCAL;
|
mp->mnt_flag |= MNT_LOCAL;
|
||||||
|
|
||||||
if ((ump->um_uppervp->v_mount->mnt_kern_flag & MNTK_SUSPENDABLE) != 0)
|
|
||||||
mp->mnt_kern_flag |= MNTK_SUSPENDABLE;
|
|
||||||
MNT_IUNLOCK(mp);
|
MNT_IUNLOCK(mp);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1589,22 +1589,10 @@ vn_closefile(fp, td)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
vn_suspendable_mp(struct mount *mp)
|
vn_suspendable(struct mount *mp)
|
||||||
{
|
{
|
||||||
|
|
||||||
return ((mp->mnt_kern_flag & MNTK_SUSPENDABLE) != 0);
|
return (mp->mnt_op->vfs_susp_clean != NULL);
|
||||||
}
|
|
||||||
|
|
||||||
static bool
|
|
||||||
vn_suspendable(struct vnode *vp, struct mount **mpp)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (vp != NULL)
|
|
||||||
*mpp = vp->v_mount;
|
|
||||||
if (*mpp == NULL)
|
|
||||||
return (false);
|
|
||||||
|
|
||||||
return (vn_suspendable_mp(*mpp));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -1657,11 +1645,6 @@ vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
|
|||||||
|
|
||||||
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
||||||
("V_MNTREF requires mp"));
|
("V_MNTREF requires mp"));
|
||||||
if (!vn_suspendable(vp, mpp)) {
|
|
||||||
if ((flags & V_MNTREF) != 0)
|
|
||||||
vfs_rel(*mpp);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
error = 0;
|
error = 0;
|
||||||
/*
|
/*
|
||||||
@ -1679,6 +1662,12 @@ vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
|
|||||||
if ((mp = *mpp) == NULL)
|
if ((mp = *mpp) == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
if (!vn_suspendable(mp)) {
|
||||||
|
if (vp != NULL || (flags & V_MNTREF) != 0)
|
||||||
|
vfs_rel(mp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VOP_GETWRITEMOUNT() returns with the mp refcount held through
|
* VOP_GETWRITEMOUNT() returns with the mp refcount held through
|
||||||
* a vfs_ref().
|
* a vfs_ref().
|
||||||
@ -1708,11 +1697,6 @@ vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
|
|||||||
|
|
||||||
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
||||||
("V_MNTREF requires mp"));
|
("V_MNTREF requires mp"));
|
||||||
if (!vn_suspendable(vp, mpp)) {
|
|
||||||
if ((flags & V_MNTREF) != 0)
|
|
||||||
vfs_rel(*mpp);
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
retry:
|
retry:
|
||||||
if (vp != NULL) {
|
if (vp != NULL) {
|
||||||
@ -1730,6 +1714,12 @@ vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
|
|||||||
if ((mp = *mpp) == NULL)
|
if ((mp = *mpp) == NULL)
|
||||||
return (0);
|
return (0);
|
||||||
|
|
||||||
|
if (!vn_suspendable(mp)) {
|
||||||
|
if (vp != NULL || (flags & V_MNTREF) != 0)
|
||||||
|
vfs_rel(mp);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* VOP_GETWRITEMOUNT() returns with the mp refcount held through
|
* VOP_GETWRITEMOUNT() returns with the mp refcount held through
|
||||||
* a vfs_ref().
|
* a vfs_ref().
|
||||||
@ -1772,7 +1762,7 @@ void
|
|||||||
vn_finished_write(mp)
|
vn_finished_write(mp)
|
||||||
struct mount *mp;
|
struct mount *mp;
|
||||||
{
|
{
|
||||||
if (mp == NULL || !vn_suspendable_mp(mp))
|
if (mp == NULL || !vn_suspendable(mp))
|
||||||
return;
|
return;
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
MNT_REL(mp);
|
MNT_REL(mp);
|
||||||
@ -1795,7 +1785,7 @@ void
|
|||||||
vn_finished_secondary_write(mp)
|
vn_finished_secondary_write(mp)
|
||||||
struct mount *mp;
|
struct mount *mp;
|
||||||
{
|
{
|
||||||
if (mp == NULL || !vn_suspendable_mp(mp))
|
if (mp == NULL || !vn_suspendable(mp))
|
||||||
return;
|
return;
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
MNT_REL(mp);
|
MNT_REL(mp);
|
||||||
@ -1818,7 +1808,7 @@ vfs_write_suspend(struct mount *mp, int flags)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
MPASS(vn_suspendable_mp(mp));
|
MPASS(vn_suspendable(mp));
|
||||||
|
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
if (mp->mnt_susp_owner == curthread) {
|
if (mp->mnt_susp_owner == curthread) {
|
||||||
@ -1861,7 +1851,7 @@ void
|
|||||||
vfs_write_resume(struct mount *mp, int flags)
|
vfs_write_resume(struct mount *mp, int flags)
|
||||||
{
|
{
|
||||||
|
|
||||||
MPASS(vn_suspendable_mp(mp));
|
MPASS(vn_suspendable(mp));
|
||||||
|
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
if ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0) {
|
if ((mp->mnt_kern_flag & MNTK_SUSPEND) != 0) {
|
||||||
@ -1896,7 +1886,7 @@ vfs_write_suspend_umnt(struct mount *mp)
|
|||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
MPASS(vn_suspendable_mp(mp));
|
MPASS(vn_suspendable(mp));
|
||||||
KASSERT((curthread->td_pflags & TDP_IGNSUSP) == 0,
|
KASSERT((curthread->td_pflags & TDP_IGNSUSP) == 0,
|
||||||
("vfs_write_suspend_umnt: recursed"));
|
("vfs_write_suspend_umnt: recursed"));
|
||||||
|
|
||||||
|
@ -362,7 +362,7 @@ void __mnt_vnode_markerfree_active(struct vnode **mvp, struct mount *);
|
|||||||
#define MNTK_SUSPEND 0x08000000 /* request write suspension */
|
#define MNTK_SUSPEND 0x08000000 /* request write suspension */
|
||||||
#define MNTK_SUSPEND2 0x04000000 /* block secondary writes */
|
#define MNTK_SUSPEND2 0x04000000 /* block secondary writes */
|
||||||
#define MNTK_SUSPENDED 0x10000000 /* write operations are suspended */
|
#define MNTK_SUSPENDED 0x10000000 /* write operations are suspended */
|
||||||
#define MNTK_SUSPENDABLE 0x20000000 /* writes can be suspended */
|
#define MNTK_UNUSED1 0x20000000
|
||||||
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
|
#define MNTK_LOOKUP_SHARED 0x40000000 /* FS supports shared lock lookups */
|
||||||
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
|
#define MNTK_NOKNOTE 0x80000000 /* Don't send KNOTEs from VOP hooks */
|
||||||
|
|
||||||
|
@ -1055,8 +1055,7 @@ ffs_mountfs(devvp, mp, td)
|
|||||||
*/
|
*/
|
||||||
MNT_ILOCK(mp);
|
MNT_ILOCK(mp);
|
||||||
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
|
mp->mnt_kern_flag |= MNTK_LOOKUP_SHARED | MNTK_EXTENDED_SHARED |
|
||||||
MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS | MNTK_SUSPENDABLE |
|
MNTK_NO_IOPF | MNTK_UNMAPPED_BUFS | MNTK_USES_BCACHE;
|
||||||
MNTK_USES_BCACHE;
|
|
||||||
MNT_IUNLOCK(mp);
|
MNT_IUNLOCK(mp);
|
||||||
#ifdef UFS_EXTATTR
|
#ifdef UFS_EXTATTR
|
||||||
#ifdef UFS_EXTATTR_AUTOSTART
|
#ifdef UFS_EXTATTR_AUTOSTART
|
||||||
|
Loading…
Reference in New Issue
Block a user