vfs_mount.c (552afd9c120e6b11dbb1acf319bd71a4e9f2b913) vfs_mount.c (f257b7a54b4fe77840cf694314bdc401e00c31a1)
1/*
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.

--- 899 unchanged lines hidden (view full) ---

908 VI_LOCK(vp);
909 vp->v_iflag &= ~VI_MOUNT;
910 VI_UNLOCK(vp);
911 vp->v_mountedhere = mp;
912 mtx_lock(&mountlist_mtx);
913 TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
914 mtx_unlock(&mountlist_mtx);
915 vfs_event_signal(NULL, VQ_MOUNT, 0);
1/*
2 * Copyright (c) 1989, 1993
3 * The Regents of the University of California. All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.

--- 899 unchanged lines hidden (view full) ---

908 VI_LOCK(vp);
909 vp->v_iflag &= ~VI_MOUNT;
910 VI_UNLOCK(vp);
911 vp->v_mountedhere = mp;
912 mtx_lock(&mountlist_mtx);
913 TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
914 mtx_unlock(&mountlist_mtx);
915 vfs_event_signal(NULL, VQ_MOUNT, 0);
916 if (VFS_ROOT(mp, &newdp))
916 if (VFS_ROOT(mp, &newdp, td))
917 panic("mount: lost mount");
918 checkdirs(vp, newdp);
919 vput(newdp);
920 VOP_UNLOCK(vp, 0, td);
921 if ((mp->mnt_flag & MNT_RDONLY) == 0)
922 error = vfs_allocate_syncvnode(mp);
923 vfs_unbusy(mp, td);
924 if (error || (error = VFS_START(mp, 0, td)) != 0)

--- 184 unchanged lines hidden (view full) ---

1109 cache_purgevfs(mp); /* remove cache entries for this file sys */
1110 if (mp->mnt_syncer != NULL)
1111 vrele(mp->mnt_syncer);
1112 /*
1113 * For forced unmounts, move process cdir/rdir refs on the fs root
1114 * vnode to the covered vnode. For non-forced unmounts we want
1115 * such references to cause an EBUSY error.
1116 */
917 panic("mount: lost mount");
918 checkdirs(vp, newdp);
919 vput(newdp);
920 VOP_UNLOCK(vp, 0, td);
921 if ((mp->mnt_flag & MNT_RDONLY) == 0)
922 error = vfs_allocate_syncvnode(mp);
923 vfs_unbusy(mp, td);
924 if (error || (error = VFS_START(mp, 0, td)) != 0)

--- 184 unchanged lines hidden (view full) ---

1109 cache_purgevfs(mp); /* remove cache entries for this file sys */
1110 if (mp->mnt_syncer != NULL)
1111 vrele(mp->mnt_syncer);
1112 /*
1113 * For forced unmounts, move process cdir/rdir refs on the fs root
1114 * vnode to the covered vnode. For non-forced unmounts we want
1115 * such references to cause an EBUSY error.
1116 */
1117 if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp) == 0) {
1117 if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp, td) == 0) {
1118 if (mp->mnt_vnodecovered != NULL)
1119 checkdirs(fsrootvp, mp->mnt_vnodecovered);
1120 if (fsrootvp == rootvnode) {
1121 vrele(rootvnode);
1122 rootvnode = NULL;
1123 }
1124 vput(fsrootvp);
1125 }
1126 if (((mp->mnt_flag & MNT_RDONLY) ||
1127 (error = VFS_SYNC(mp, MNT_WAIT, td->td_ucred, td)) == 0) ||
1128 (flags & MNT_FORCE)) {
1129 error = VFS_UNMOUNT(mp, flags, td);
1130 }
1131 vn_finished_write(mp);
1132 if (error) {
1133 /* Undo cdir/rdir and rootvnode changes made above. */
1118 if (mp->mnt_vnodecovered != NULL)
1119 checkdirs(fsrootvp, mp->mnt_vnodecovered);
1120 if (fsrootvp == rootvnode) {
1121 vrele(rootvnode);
1122 rootvnode = NULL;
1123 }
1124 vput(fsrootvp);
1125 }
1126 if (((mp->mnt_flag & MNT_RDONLY) ||
1127 (error = VFS_SYNC(mp, MNT_WAIT, td->td_ucred, td)) == 0) ||
1128 (flags & MNT_FORCE)) {
1129 error = VFS_UNMOUNT(mp, flags, td);
1130 }
1131 vn_finished_write(mp);
1132 if (error) {
1133 /* Undo cdir/rdir and rootvnode changes made above. */
1134 if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp) == 0) {
1134 if ((flags & MNT_FORCE) && VFS_ROOT(mp, &fsrootvp, td) == 0) {
1135 if (mp->mnt_vnodecovered != NULL)
1136 checkdirs(mp->mnt_vnodecovered, fsrootvp);
1137 if (rootvnode == NULL) {
1138 rootvnode = fsrootvp;
1139 vref(rootvnode);
1140 }
1141 vput(fsrootvp);
1142 }

--- 317 unchanged lines hidden (view full) ---

1460 if (error)
1461 break;
1462 mp->mnt_flag |= MNT_RDONLY;
1463
1464 error = VFS_NMOUNT(mp, NULL, curthread);
1465 if (error)
1466 break;
1467 VFS_START(mp, 0, td);
1135 if (mp->mnt_vnodecovered != NULL)
1136 checkdirs(mp->mnt_vnodecovered, fsrootvp);
1137 if (rootvnode == NULL) {
1138 rootvnode = fsrootvp;
1139 vref(rootvnode);
1140 }
1141 vput(fsrootvp);
1142 }

--- 317 unchanged lines hidden (view full) ---

1460 if (error)
1461 break;
1462 mp->mnt_flag |= MNT_RDONLY;
1463
1464 error = VFS_NMOUNT(mp, NULL, curthread);
1465 if (error)
1466 break;
1467 VFS_START(mp, 0, td);
1468 VFS_ROOT(mp, &vroot);
1468 VFS_ROOT(mp, &vroot, td);
1469 VOP_UNLOCK(vroot, 0, td);
1470
1471 NDINIT(&nid, LOOKUP, NOCACHE|FOLLOW,
1472 UIO_SYSSPACE, cp, curthread);
1473 nid.ni_startdir = vroot;
1474 nid.ni_pathlen = strlen(cp);
1475 nid.ni_cnd.cn_cred = curthread->td_ucred;
1476 nid.ni_cnd.cn_nameptr = cp;

--- 138 unchanged lines hidden ---
1469 VOP_UNLOCK(vroot, 0, td);
1470
1471 NDINIT(&nid, LOOKUP, NOCACHE|FOLLOW,
1472 UIO_SYSSPACE, cp, curthread);
1473 nid.ni_startdir = vroot;
1474 nid.ni_pathlen = strlen(cp);
1475 nid.ni_cnd.cn_cred = curthread->td_ucred;
1476 nid.ni_cnd.cn_nameptr = cp;

--- 138 unchanged lines hidden ---