Add V_MNTREF flag to the vn_start_write(9) and
vn_start_secondary_write(9) functions. The flag indicates that the caller already owns a reference on the mount point, and the functions can consume it. The reference is released by vn_finished_write(9) and vn_finished_secondary_write(9) in due course. Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks
This commit is contained in:
parent
1bc93bb7b9
commit
2db0e1f50d
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=283601
@ -1646,16 +1646,18 @@ vn_start_write_locked(struct mount *mp, int flags)
|
||||
}
|
||||
|
||||
int
|
||||
vn_start_write(vp, mpp, flags)
|
||||
struct vnode *vp;
|
||||
struct mount **mpp;
|
||||
int flags;
|
||||
vn_start_write(struct vnode *vp, struct mount **mpp, int flags)
|
||||
{
|
||||
struct mount *mp;
|
||||
int error;
|
||||
|
||||
if (!vn_suspendable(vp, mpp))
|
||||
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
||||
("V_MNTREF requires mp"));
|
||||
if (!vn_suspendable(vp, mpp)) {
|
||||
if ((flags & V_MNTREF) != 0)
|
||||
vfs_rel(*mpp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
error = 0;
|
||||
/*
|
||||
@ -1681,7 +1683,7 @@ vn_start_write(vp, mpp, flags)
|
||||
* emulate a vfs_ref().
|
||||
*/
|
||||
MNT_ILOCK(mp);
|
||||
if (vp == NULL)
|
||||
if (vp == NULL && (flags & V_MNTREF) == 0)
|
||||
MNT_REF(mp);
|
||||
|
||||
return (vn_start_write_locked(mp, flags));
|
||||
@ -1695,16 +1697,18 @@ vn_start_write(vp, mpp, flags)
|
||||
* time, these operations are halted until the suspension is over.
|
||||
*/
|
||||
int
|
||||
vn_start_secondary_write(vp, mpp, flags)
|
||||
struct vnode *vp;
|
||||
struct mount **mpp;
|
||||
int flags;
|
||||
vn_start_secondary_write(struct vnode *vp, struct mount **mpp, int flags)
|
||||
{
|
||||
struct mount *mp;
|
||||
int error;
|
||||
|
||||
if (!vn_suspendable(vp, mpp))
|
||||
KASSERT((flags & V_MNTREF) == 0 || (*mpp != NULL && vp == NULL),
|
||||
("V_MNTREF requires mp"));
|
||||
if (!vn_suspendable(vp, mpp)) {
|
||||
if ((flags & V_MNTREF) != 0)
|
||||
vfs_rel(*mpp);
|
||||
return (0);
|
||||
}
|
||||
|
||||
retry:
|
||||
if (vp != NULL) {
|
||||
@ -1730,7 +1734,7 @@ vn_start_secondary_write(vp, mpp, flags)
|
||||
* emulate a vfs_ref().
|
||||
*/
|
||||
MNT_ILOCK(mp);
|
||||
if (vp == NULL)
|
||||
if (vp == NULL && (flags & V_MNTREF) == 0)
|
||||
MNT_REF(mp);
|
||||
if ((mp->mnt_kern_flag & (MNTK_SUSPENDED | MNTK_SUSPEND2)) == 0) {
|
||||
mp->mnt_secondary_writes++;
|
||||
|
@ -397,6 +397,7 @@ extern int vttoif_tab[];
|
||||
#define V_WAIT 0x0001 /* vn_start_write: sleep for suspend */
|
||||
#define V_NOWAIT 0x0002 /* vn_start_write: don't sleep for suspend */
|
||||
#define V_XSLEEP 0x0004 /* vn_start_write: just return after sleep */
|
||||
#define V_MNTREF 0x0010 /* vn_start_write: mp is already ref-ed */
|
||||
|
||||
#define VR_START_WRITE 0x0001 /* vfs_write_resume: start write atomically */
|
||||
#define VR_NO_SUSPCLR 0x0002 /* vfs_write_resume: do not clear suspension */
|
||||
|
Loading…
Reference in New Issue
Block a user