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 --- |