Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_mount.c
Show All 31 Lines | |||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | ||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
*/ | */ | ||||
#include <sys/cdefs.h> | #include <sys/cdefs.h> | ||||
__FBSDID("$FreeBSD: projects/nfs-over-tls/sys/kern/vfs_mount.c 363591 2020-07-27 01:20:49Z rmacklem $"); | __FBSDID("$FreeBSD: head/sys/kern/vfs_mount.c 363517 2020-07-25 10:31:52Z mjg $"); | ||||
#include <sys/param.h> | #include <sys/param.h> | ||||
#include <sys/conf.h> | #include <sys/conf.h> | ||||
#include <sys/smp.h> | #include <sys/smp.h> | ||||
#include <sys/eventhandler.h> | #include <sys/eventhandler.h> | ||||
#include <sys/fcntl.h> | #include <sys/fcntl.h> | ||||
#include <sys/jail.h> | #include <sys/jail.h> | ||||
#include <sys/kernel.h> | #include <sys/kernel.h> | ||||
▲ Show 20 Lines • Show All 912 Lines • ▼ Show 20 Lines | vfs_domount_first( | ||||
* Mount the filesystem. | * Mount the filesystem. | ||||
* XXX The final recipients of VFS_MOUNT just overwrite the ndp they | * XXX The final recipients of VFS_MOUNT just overwrite the ndp they | ||||
* get. No freeing of cn_pnbuf. | * get. No freeing of cn_pnbuf. | ||||
*/ | */ | ||||
error1 = 0; | error1 = 0; | ||||
if ((error = VFS_MOUNT(mp)) != 0 || | if ((error = VFS_MOUNT(mp)) != 0 || | ||||
(error1 = VFS_STATFS(mp, &mp->mnt_stat)) != 0 || | (error1 = VFS_STATFS(mp, &mp->mnt_stat)) != 0 || | ||||
(error1 = VFS_ROOT(mp, LK_EXCLUSIVE, &newdp)) != 0) { | (error1 = VFS_ROOT(mp, LK_EXCLUSIVE, &newdp)) != 0) { | ||||
rootvp = NULL; | |||||
if (error1 != 0) { | if (error1 != 0) { | ||||
error = error1; | error = error1; | ||||
rootvp = vfs_cache_root_clear(mp); | rootvp = vfs_cache_root_clear(mp); | ||||
if (rootvp != NULL) | if (rootvp != NULL) { | ||||
vhold(rootvp); | |||||
vrele(rootvp); | vrele(rootvp); | ||||
} | |||||
if ((error1 = VFS_UNMOUNT(mp, 0)) != 0) | if ((error1 = VFS_UNMOUNT(mp, 0)) != 0) | ||||
printf("VFS_UNMOUNT returned %d\n", error1); | printf("VFS_UNMOUNT returned %d\n", error1); | ||||
} | } | ||||
vfs_unbusy(mp); | vfs_unbusy(mp); | ||||
mp->mnt_vnodecovered = NULL; | mp->mnt_vnodecovered = NULL; | ||||
vfs_mount_destroy(mp); | vfs_mount_destroy(mp); | ||||
VI_LOCK(vp); | VI_LOCK(vp); | ||||
vp->v_iflag &= ~VI_MOUNT; | vp->v_iflag &= ~VI_MOUNT; | ||||
VI_UNLOCK(vp); | VI_UNLOCK(vp); | ||||
if (rootvp != NULL) { | |||||
vn_seqc_write_end(rootvp); | |||||
vdrop(rootvp); | |||||
} | |||||
vn_seqc_write_end(vp); | vn_seqc_write_end(vp); | ||||
vrele(vp); | vrele(vp); | ||||
return (error); | return (error); | ||||
} | } | ||||
vn_seqc_write_begin(newdp); | vn_seqc_write_begin(newdp); | ||||
VOP_UNLOCK(newdp); | VOP_UNLOCK(newdp); | ||||
if (mp->mnt_opt != NULL) | if (mp->mnt_opt != NULL) | ||||
▲ Show 20 Lines • Show All 1,435 Lines • Show Last 20 Lines |