Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_mount.c
Context not available. | |||||
} | } | ||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
vfs_seqc_write_begin(vp); | |||||
/* Allocate and initialize the filesystem. */ | /* Allocate and initialize the filesystem. */ | ||||
mp = vfs_mount_alloc(vp, vfsp, fspath, td->td_ucred); | mp = vfs_mount_alloc(vp, vfsp, fspath, td->td_ucred); | ||||
/* XXXMAC: pass to vfs_mount_alloc? */ | /* XXXMAC: pass to vfs_mount_alloc? */ | ||||
Context not available. | |||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
vp->v_iflag &= ~VI_MOUNT; | vp->v_iflag &= ~VI_MOUNT; | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
vfs_seqc_write_end(vp); | |||||
vrele(vp); | vrele(vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
vfs_seqc_write_begin(newdp); | |||||
VOP_UNLOCK(newdp); | VOP_UNLOCK(newdp); | ||||
if (mp->mnt_opt != NULL) | if (mp->mnt_opt != NULL) | ||||
Context not available. | |||||
EVENTHANDLER_DIRECT_INVOKE(vfs_mounted, mp, newdp, td); | EVENTHANDLER_DIRECT_INVOKE(vfs_mounted, mp, newdp, td); | ||||
VOP_UNLOCK(newdp); | VOP_UNLOCK(newdp); | ||||
mountcheckdirs(vp, newdp); | mountcheckdirs(vp, newdp); | ||||
vfs_seqc_write_end(vp); | |||||
vfs_seqc_write_end(newdp); | |||||
vrele(newdp); | vrele(newdp); | ||||
if ((mp->mnt_flag & MNT_RDONLY) == 0) | if ((mp->mnt_flag & MNT_RDONLY) == 0) | ||||
vfs_allocate_syncvnode(mp); | vfs_allocate_syncvnode(mp); | ||||
Context not available. | |||||
VOP_UNLOCK(vp); | VOP_UNLOCK(vp); | ||||
vfs_op_enter(mp); | vfs_op_enter(mp); | ||||
vfs_seqc_write_begin(vp); | |||||
rootvp = NULL; | |||||
MNT_ILOCK(mp); | MNT_ILOCK(mp); | ||||
if ((mp->mnt_kern_flag & MNTK_UNMOUNT) != 0) { | if ((mp->mnt_kern_flag & MNTK_UNMOUNT) != 0) { | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
Context not available. | |||||
mp->mnt_kern_flag &= ~MNTK_ASYNC; | mp->mnt_kern_flag &= ~MNTK_ASYNC; | ||||
rootvp = vfs_cache_root_clear(mp); | rootvp = vfs_cache_root_clear(mp); | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
if (rootvp != NULL) | |||||
vrele(rootvp); | |||||
mp->mnt_optnew = *optlist; | mp->mnt_optnew = *optlist; | ||||
vfs_mergeopts(mp->mnt_optnew, mp->mnt_opt); | vfs_mergeopts(mp->mnt_optnew, mp->mnt_opt); | ||||
Context not available. | |||||
vfs_deallocate_syncvnode(mp); | vfs_deallocate_syncvnode(mp); | ||||
end: | end: | ||||
vfs_op_exit(mp); | vfs_op_exit(mp); | ||||
if (rootvp != NULL) { | |||||
vfs_seqc_write_end(rootvp); | |||||
vrele(rootvp); | |||||
} | |||||
vfs_seqc_write_end(vp); | |||||
vfs_unbusy(mp); | vfs_unbusy(mp); | ||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
vp->v_iflag &= ~VI_MOUNT; | vp->v_iflag &= ~VI_MOUNT; | ||||
Context not available. | |||||
} | } | ||||
mp->mnt_kern_flag |= MNTK_UNMOUNT; | mp->mnt_kern_flag |= MNTK_UNMOUNT; | ||||
rootvp = vfs_cache_root_clear(mp); | rootvp = vfs_cache_root_clear(mp); | ||||
if (coveredvp != NULL) | |||||
vfs_seqc_write_begin(coveredvp); | |||||
if (flags & MNT_NONBUSY) { | if (flags & MNT_NONBUSY) { | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
error = vfs_check_usecounts(mp); | error = vfs_check_usecounts(mp); | ||||
MNT_ILOCK(mp); | MNT_ILOCK(mp); | ||||
if (error != 0) { | if (error != 0) { | ||||
vfs_seqc_write_end(coveredvp); | |||||
dounmount_cleanup(mp, coveredvp, MNTK_UNMOUNT); | dounmount_cleanup(mp, coveredvp, MNTK_UNMOUNT); | ||||
if (rootvp != NULL) | if (rootvp != NULL) { | ||||
vfs_seqc_write_end(rootvp); | |||||
vrele(rootvp); | vrele(rootvp); | ||||
} | |||||
return (error); | return (error); | ||||
} | } | ||||
} | } | ||||
Context not available. | |||||
("%s: invalid return value for msleep in the drain path @ %s:%d", | ("%s: invalid return value for msleep in the drain path @ %s:%d", | ||||
__func__, __FILE__, __LINE__)); | __func__, __FILE__, __LINE__)); | ||||
if (rootvp != NULL) | if (rootvp != NULL) { | ||||
vhold(rootvp); | |||||
vrele(rootvp); | vrele(rootvp); | ||||
} | |||||
if (mp->mnt_flag & MNT_EXPUBLIC) | if (mp->mnt_flag & MNT_EXPUBLIC) | ||||
vfs_setpublicfs(NULL, NULL, NULL); | vfs_setpublicfs(NULL, NULL, NULL); | ||||
/* | |||||
* From now, we can claim that the use reference on the | |||||
* coveredvp is ours, and the ref can be released only by | |||||
* successfull unmount by us, or left for later unmount | |||||
* attempt. The previously acquired hold reference is no | |||||
* longer needed to protect the vnode from reuse. | |||||
*/ | |||||
if (coveredvp != NULL) | |||||
vdrop(coveredvp); | |||||
vfs_periodic(mp, MNT_WAIT); | vfs_periodic(mp, MNT_WAIT); | ||||
MNT_ILOCK(mp); | MNT_ILOCK(mp); | ||||
async_flag = mp->mnt_flag & MNT_ASYNC; | async_flag = mp->mnt_flag & MNT_ASYNC; | ||||
Context not available. | |||||
} | } | ||||
vfs_op_exit_locked(mp); | vfs_op_exit_locked(mp); | ||||
MNT_IUNLOCK(mp); | MNT_IUNLOCK(mp); | ||||
if (coveredvp) | if (coveredvp) { | ||||
vfs_seqc_write_end(coveredvp); | |||||
VOP_UNLOCK(coveredvp); | VOP_UNLOCK(coveredvp); | ||||
vdrop(coveredvp); | |||||
} | |||||
if (rootvp != NULL) { | |||||
vfs_seqc_write_end(rootvp); | |||||
vdrop(rootvp); | |||||
} | |||||
return (error); | return (error); | ||||
} | } | ||||
mtx_lock(&mountlist_mtx); | mtx_lock(&mountlist_mtx); | ||||
Context not available. | |||||
EVENTHANDLER_DIRECT_INVOKE(vfs_unmounted, mp, td); | EVENTHANDLER_DIRECT_INVOKE(vfs_unmounted, mp, td); | ||||
if (coveredvp != NULL) { | if (coveredvp != NULL) { | ||||
coveredvp->v_mountedhere = NULL; | coveredvp->v_mountedhere = NULL; | ||||
vfs_seqc_write_end(coveredvp); | |||||
VOP_UNLOCK(coveredvp); | VOP_UNLOCK(coveredvp); | ||||
vdrop(coveredvp); | |||||
} | |||||
if (rootvp != NULL) { | |||||
vfs_seqc_write_end(rootvp); | |||||
vdrop(rootvp); | |||||
} | } | ||||
vfs_event_signal(NULL, VQ_UNMOUNT, 0); | vfs_event_signal(NULL, VQ_UNMOUNT, 0); | ||||
if (rootvnode != NULL && mp == rootvnode->v_mount) { | if (rootvnode != NULL && mp == rootvnode->v_mount) { | ||||
Context not available. |