Lines Matching refs:mp

146 void enablequotas(struct mount *mp, vfs_context_t ctx);
147 static int getfsstat_callback(mount_t mp, void * arg);
151 static int munge_statfs(struct mount *mp, struct vfsstatfs *sfsp,
154 static int statfs64_common(struct mount *mp, struct vfsstatfs *sfsp,
166 static int authorize_devpath_and_update_mntfromname(mount_t mp, user_addr_t devpath, vnode_t *devvpp, vfs_context_t ctx);
167 static int place_mount_and_checkdirs(mount_t mp, vnode_t vp, vfs_context_t ctx);
168 static void undo_place_on_covered_vp(mount_t mp, vnode_t vp);
169 static int mount_begin_update(mount_t mp, vfs_context_t ctx, int flags);
170 static void mount_end_update(mount_t mp);
209 vfs_iskernelmount(mount_t mp)
211 return ((mp->mnt_kern_flag & MNTK_KERNEL_MOUNT) ? TRUE : FALSE);
434 struct mount *mp;
454 mp = vp->v_mount;
457 mount_lock_spin(mp);
458 if (mp->mnt_lflag & MNT_LUNMOUNT) {
459 mount_unlock(mp);
463 mount_unlock(mp);
464 lck_rw_lock_exclusive(&mp->mnt_rwlock);
471 ((mp->mnt_flag & MNT_RDONLY) == 0)) {
480 if ((mp->mnt_flag & MNT_CPROTECT) &&
488 if ((mp->mnt_kern_flag & MNTK_BACKS_ROOT) &&
489 (!vfs_isrdonly(mp)) && (flags & MNT_RDONLY)) {
499 if (mp->mnt_vfsstat.f_owner != kauth_cred_getuid(vfs_context_ucred(ctx)) &&
504 error = mac_mount_check_remount(ctx, mp);
515 if (mp->mnt_flag & MNT_NOEXEC)
518 flag = mp->mnt_flag;
522 mp->mnt_flag |= flags & (MNT_RELOAD | MNT_FORCE | MNT_UPDATE);
524 vfsp = mp->mnt_vtable;
568 MALLOC_ZONE(mp, struct mount *, (u_int32_t)sizeof(struct mount),
570 bzero((char *)mp, (u_int32_t)sizeof(struct mount));
574 mp->mnt_maxreadcnt = mp->mnt_maxwritecnt = MAXPHYS;
575 mp->mnt_segreadcnt = mp->mnt_segwritecnt = 32;
576 mp->mnt_maxsegreadsize = mp->mnt_maxreadcnt;
577 mp->mnt_maxsegwritesize = mp->mnt_maxwritecnt;
578 mp->mnt_devblocksize = DEV_BSIZE;
579 mp->mnt_alignmentmask = PAGE_MASK;
580 mp->mnt_ioqueue_depth = MNT_DEFAULT_IOQUEUE_DEPTH;
581 mp->mnt_ioscale = 1;
582 mp->mnt_ioflags = 0;
583 mp->mnt_realrootvp = NULLVP;
584 mp->mnt_authcache_ttl = CACHED_LOOKUP_RIGHT_TTL;
586 TAILQ_INIT(&mp->mnt_vnodelist);
587 TAILQ_INIT(&mp->mnt_workerqueue);
588 TAILQ_INIT(&mp->mnt_newvnodes);
589 mount_lock_init(mp);
590 lck_rw_lock_exclusive(&mp->mnt_rwlock);
592 mp->mnt_op = vfsp->vfc_vfsops;
593 mp->mnt_vtable = vfsp;
594 //mp->mnt_stat.f_type = vfsp->vfc_typenum;
595 mp->mnt_flag |= vfsp->vfc_flags & MNT_VISFLAGMASK;
596 strncpy(mp->mnt_vfsstat.f_fstypename, vfsp->vfc_name, MFSTYPENAMELEN);
597 strncpy(mp->mnt_vfsstat.f_mntonname, cnp->cn_pnbuf, MAXPATHLEN);
598 mp->mnt_vnodecovered = vp;
599 mp->mnt_vfsstat.f_owner = kauth_cred_getuid(vfs_context_ucred(ctx));
600 mp->mnt_throttle_mask = LOWPRI_MAX_NUM_DEV - 1;
601 mp->mnt_devbsdunit = 0;
604 vfs_setowner(mp, KAUTH_UID_NONE, KAUTH_GID_NONE);
608 mp->mnt_kern_flag |= MNTK_KERNEL_MOUNT;
610 mp->mnt_kern_flag |= MNTK_PERMIT_UNMOUNT;
618 mp->mnt_flag |= MNT_RDONLY;
619 else if (mp->mnt_flag & MNT_RDONLY) {
622 if (mp->mnt_kern_flag & MNTK_TYPENAME_OVERRIDE) {
626 mp->mnt_kern_flag |= MNTK_WANTRDWR;
628 mp->mnt_flag &= ~(MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
633 mp->mnt_flag |= flags & (MNT_NOSUID | MNT_NOEXEC | MNT_NODEV |
645 mp->mnt_flag |= MNT_MULTILABEL;
673 strncpy(mp->mnt_vfsstat.f_mntfromname, nd.ni_cnd.cn_pnbuf, MAXPATHLEN);
693 if ((mp->mnt_flag & MNT_RDONLY) == 0)
712 if (vcount(devvp) > 1 && !(vfs_flags(mp) & MNT_ROOTFS)) {
723 ronly = (mp->mnt_flag & MNT_RDONLY) != 0;
734 mp->mnt_devvp = devvp;
737 } else if ((mp->mnt_flag & MNT_RDONLY) &&
738 (mp->mnt_kern_flag & MNTK_WANTRDWR) &&
739 (device_vnode = mp->mnt_devvp)) {
773 mac_mount_label_init(mp);
774 mac_mount_label_associate(ctx, mp);
778 error = mac_mount_check_label_update(ctx, mp);
787 error = VFS_MOUNT(mp, device_vnode, fsmountargs, ctx);
790 if (mp->mnt_kern_flag & MNTK_WANTRDWR)
791 mp->mnt_flag &= ~MNT_RDONLY;
792 mp->mnt_flag &=~
794 mp->mnt_kern_flag &=~ MNTK_WANTRDWR;
796 mp->mnt_flag = flag; /* restore flag value */
798 lck_rw_done(&mp->mnt_rwlock);
801 enablequotas(mp, ctx);
811 if (vfs_flags(mp) & MNT_MULTILABEL) {
812 error = VFS_ROOT(mp, &rvp, ctx);
817 error = vnode_label(mp, NULL, rvp, NULL, 0, ctx);
830 vp->v_mountedhere = mp;
861 (void)VFS_START(mp, 0, ctx);
863 if (mount_list_add(mp) != 0) {
871 lck_rw_done(&mp->mnt_rwlock);
878 if (strncmp(mp->mnt_vfsstat.f_fstypename, "webdav", sizeof("webdav")) != 0 &&
879 vfs_getattr(mp, &vfsattr, ctx) == 0 &&
883 mp->mnt_kern_flag |= MNTK_EXTENDED_ATTRS;
888 mp->mnt_kern_flag |= MNTK_NAMED_STREAMS;
894 mp->mnt_kern_flag |= MNTK_PATH_FROM_ID;
895 } else if (mp->mnt_flag & MNT_DOVOLFS) {
897 mp->mnt_kern_flag |= MNTK_PATH_FROM_ID;
900 if (mp->mnt_vtable->vfc_vfsflags & VFC_VFSNATIVEXATTR) {
901 mp->mnt_kern_flag |= MNTK_EXTENDED_ATTRS;
903 if (mp->mnt_vtable->vfc_vfsflags & VFC_VFSPREFLIGHT) {
904 mp->mnt_kern_flag |= MNTK_UNMOUNT_PREFLIGHT;
908 enablequotas(mp, ctx);
919 vfs_init_io_attributes(device_vnode, mp);
926 if (mp->mnt_vnodelist.tqh_first != NULL) {
928 mp->mnt_vtable->vfc_name, error);
935 mp->mnt_vtable->vfc_refcount--;
942 lck_rw_done(&mp->mnt_rwlock);
948 * no need to worry about other threads holding a crossref on this mp
951 mount_lock_destroy(mp);
953 mac_mount_label_destroy(mp);
955 FREE_ZONE((caddr_t)mp, sizeof (struct mount), M_MOUNT);
968 (void)VFS_UNMOUNT(mp, MNT_FORCE, ctx);
975 mount_lock_spin(mp);
976 mp->mnt_lflag |= MNT_LDEAD;
977 mount_unlock(mp);
981 VNOP_CLOSE(device_vnode, mp->mnt_flag & MNT_RDONLY ? FREAD : FREAD|FWRITE,
988 mp->mnt_crossref++;
1005 lck_rw_done(&mp->mnt_rwlock);
1009 if (mp->mnt_crossref)
1010 mount_dropcrossref(mp, vp, 0);
1012 mount_lock_destroy(mp);
1014 mac_mount_label_destroy(mp);
1016 FREE_ZONE((caddr_t)mp, sizeof (struct mount), M_MOUNT);
1093 authorize_devpath_and_update_mntfromname(mount_t mp, user_addr_t devpath, vnode_t *devvpp, vfs_context_t ctx)
1114 realdevvp = mp->mnt_devvp;
1133 strlcpy(mp->mnt_vfsstat.f_mntfromname, nd.ni_cnd.cn_pnbuf, MAXPATHLEN);
1141 if ((mp->mnt_flag & MNT_RDONLY) == 0)
1167 place_mount_and_checkdirs(mount_t mp, vnode_t vp, vfs_context_t ctx)
1171 mp->mnt_vnodecovered = vp; /* XXX This is normally only set at init-time ... */
1175 vp->v_mountedhere = mp;
1204 mp->mnt_vnodecovered = NULLVP;
1210 undo_place_on_covered_vp(mount_t mp, vnode_t vp)
1217 mp->mnt_vnodecovered = NULLVP;
1221 mount_begin_update(mount_t mp, vfs_context_t ctx, int flags)
1226 mount_lock_spin(mp);
1227 if (mp->mnt_lflag & MNT_LUNMOUNT) {
1228 mount_unlock(mp);
1231 mount_unlock(mp);
1232 lck_rw_lock_exclusive(&mp->mnt_rwlock);
1239 ((mp->mnt_flag & MNT_RDONLY) == 0)) {
1248 if (mp->mnt_vfsstat.f_owner != kauth_cred_getuid(vfs_context_ucred(ctx)) &&
1254 error = mac_mount_check_remount(ctx, mp);
1262 lck_rw_done(&mp->mnt_rwlock);
1269 mount_end_update(mount_t mp)
1271 lck_rw_done(&mp->mnt_rwlock);
1298 mount_t mp;
1383 mp = vnode_mount(rvp);
1384 if ((mp->mnt_kern_flag & MNTK_HAS_MOVED) == MNTK_HAS_MOVED) {
1392 /* Get exclusive rwlock on mount, authorize update on mp */
1393 error = mount_begin_update(mp , ctx, 0);
1403 if ((mp->mnt_kern_flag & MNTK_HAS_MOVED) == MNTK_HAS_MOVED) {
1421 vfsp = mp->mnt_vtable;
1433 error = authorize_devpath_and_update_mntfromname(mp, devpath, &devvp, ctx);
1444 * Place mp on top of vnode, ref the vnode, call checkdirs(),
1449 error = place_mount_and_checkdirs(mp, vp, ctx);
1456 strncpy(old_mntonname, mp->mnt_vfsstat.f_mntonname, MAXPATHLEN);
1457 strncpy(mp->mnt_vfsstat.f_mntonname, cnp->cn_pnbuf, MAXPATHLEN);
1460 mount_lock(mp);
1461 mp->mnt_kern_flag |= MNTK_HAS_MOVED;
1462 mount_unlock(mp);
1465 if (mount_list_add(mp) != 0) {
1474 mount_end_update(mp);
1482 strncpy(mp->mnt_vfsstat.f_mntonname, old_mntonname, MAXPATHLEN);
1484 mount_lock(mp);
1485 mp->mnt_kern_flag &= ~(MNTK_HAS_MOVED);
1486 mount_unlock(mp);
1490 * Placing the mp on the vnode clears VMOUNT,
1495 undo_place_on_covered_vp(mp, vp);
1502 mount_end_update(mp);
1513 enablequotas(struct mount *mp, vfs_context_t ctx)
1523 if (strncmp(mp->mnt_vfsstat.f_fstypename, "hfs", sizeof("hfs")) != 0 ) {
1531 snprintf(qfpath, sizeof(qfpath), "%s/%s.%s", mp->mnt_vfsstat.f_mntonname, qfopsname, qfextension[type]);
1538 snprintf(qfpath, sizeof(qfpath), "%s/%s.%s", mp->mnt_vfsstat.f_mntonname, qfname, qfextension[type]);
1540 (void) VFS_QUOTACTL(mp, QCMD(Q_QUOTAON, type), 0, qfpath, ctx);
1656 struct mount *mp;
1667 mp = vp->v_mount;
1671 error = mac_mount_check_umount(ctx, mp);
1684 mount_ref(mp, 0);
1687 return (safedounmount(mp, uap->flags, ctx));
1693 mount_t mp;
1695 mp = mount_list_lookupby_fsid(fsid, 0, 1);
1696 if (mp == (mount_t)0) {
1699 mount_ref(mp, 0);
1700 mount_iterdrop(mp);
1702 return(safedounmount(mp, flags, ctx));
1711 safedounmount(struct mount *mp, int flags, vfs_context_t ctx)
1720 if ((mp->mnt_kern_flag & MNT_LNOTRESP) &&
1730 if (!(((mp->mnt_kern_flag & MNTK_PERMIT_UNMOUNT) != 0) && ((flags & MNT_FORCE) == 0))) {
1735 if ((mp->mnt_vfsstat.f_owner != kauth_cred_getuid(kauth_cred_get())) &&
1742 if (mp->mnt_flag & MNT_ROOTFS) {
1748 if (mp->mnt_kern_flag & MNTK_BACKS_ROOT) {
1754 return (dounmount(mp, flags, 1, ctx));
1757 mount_drop(mp, 0);
1765 dounmount(struct mount *mp, int flags, int withref, vfs_context_t ctx)
1780 mount_lock(mp);
1783 mp->mnt_kern_flag |= MNTK_FRCUNMOUNT;
1784 mp->mnt_lflag |= MNT_LFORCE;
1786 if (mp->mnt_lflag & MNT_LUNMOUNT) {
1787 mp->mnt_lflag |= MNT_LWAIT;
1789 mount_drop(mp, 1);
1790 msleep((caddr_t)mp, &mp->mnt_mlock, (PVFS | PDROP), "dounmount", NULL);
1793 * Do not dereference mp here - returning EBUSY is safest.
1797 mp->mnt_kern_flag |= MNTK_UNMOUNT;
1798 mp->mnt_lflag |= MNT_LUNMOUNT;
1799 mp->mnt_flag &=~ MNT_ASYNC;
1806 mp->mnt_realrootvp = NULLVP;
1807 mount_unlock(mp);
1822 lck_rw_lock_exclusive(&mp->mnt_rwlock);
1824 mount_drop(mp, 0);
1826 fsevent_unmount(mp); /* has to come first! */
1830 ubc_umount(mp); /* release cached vnodes */
1831 if ((mp->mnt_flag & MNT_RDONLY) == 0) {
1832 error = VFS_SYNC(mp, MNT_WAIT, ctx);
1834 mount_lock(mp);
1835 mp->mnt_kern_flag &= ~MNTK_UNMOUNT;
1836 mp->mnt_lflag &= ~MNT_LUNMOUNT;
1837 mp->mnt_lflag &= ~MNT_LFORCE;
1844 vfs_nested_trigger_unmounts(mp, flags, ctx);
1849 error = vflush(mp, NULLVP, SKIPSWAP | SKIPSYSTEM | SKIPROOT | lflags);
1851 mount_lock(mp);
1852 mp->mnt_kern_flag &= ~MNTK_UNMOUNT;
1853 mp->mnt_lflag &= ~MNT_LUNMOUNT;
1854 mp->mnt_lflag &= ~MNT_LFORCE;
1859 mount_iterdrain(mp);
1861 error = VFS_UNMOUNT(mp, flags, ctx);
1863 mount_iterreset(mp);
1864 mount_lock(mp);
1865 mp->mnt_kern_flag &= ~MNTK_UNMOUNT;
1866 mp->mnt_lflag &= ~MNT_LUNMOUNT;
1867 mp->mnt_lflag &= ~MNT_LFORCE;
1875 if ( mp->mnt_devvp && mp->mnt_vtable->vfc_vfsflags & VFC_VFSLOCALARGS) {
1877 devvp = mp->mnt_devvp;
1880 VNOP_CLOSE(devvp, mp->mnt_flag & MNT_RDONLY ? FREAD : FREAD|FWRITE,
1885 lck_rw_done(&mp->mnt_rwlock);
1886 mount_list_remove(mp);
1887 lck_rw_lock_exclusive(&mp->mnt_rwlock);
1890 if ((coveredvp = mp->mnt_vnodecovered) != NULLVP) {
1894 mp->mnt_crossref++;
1902 mp->mnt_vtable->vfc_refcount--;
1905 cache_purgevfs(mp); /* remove cache entries for this file sys */
1907 mount_lock(mp);
1908 mp->mnt_lflag |= MNT_LDEAD;
1910 if (mp->mnt_lflag & MNT_LWAIT) {
1918 mp->mnt_lflag &= ~MNT_LWAIT;
1919 wakeup((caddr_t)mp);
1921 mount_refdrain(mp);
1923 if (mp->mnt_lflag & MNT_LWAIT) {
1924 mp->mnt_lflag &= ~MNT_LWAIT;
1935 if (mp->mnt_triggercallback != NULL) {
1936 mount_unlock(mp);
1938 mp->mnt_triggercallback(mp, VTC_RELEASE, mp->mnt_triggerdata, ctx);
1940 mp->mnt_triggercallback(mp, VTC_REPLACE, mp->mnt_triggerdata, ctx);
1943 mount_unlock(mp);
1946 mount_unlock(mp);
1949 lck_rw_done(&mp->mnt_rwlock);
1952 wakeup((caddr_t)mp);
1962 mount_dropcrossref(mp, coveredvp, 0);
1973 } else if (mp->mnt_flag & MNT_ROOTFS) {
1974 mount_lock_destroy(mp);
1976 mac_mount_label_destroy(mp);
1978 FREE_ZONE((caddr_t)mp, sizeof (struct mount), M_MOUNT);
1986 mount_dropcrossref(mount_t mp, vnode_t dp, int need_put)
1989 mp->mnt_crossref--;
1991 if (mp->mnt_crossref < 0)
1994 if ((mp != dp->v_mountedhere) && (mp->mnt_crossref == 0)) {
2000 mount_lock_destroy(mp);
2002 mac_mount_label_destroy(mp);
2004 FREE_ZONE((caddr_t)mp, sizeof (struct mount), M_MOUNT);
2024 sync_callback(mount_t mp, void * arg)
2028 if ((mp->mnt_flag & MNT_RDONLY) == 0) {
2029 asyncflag = mp->mnt_flag & MNT_ASYNC;
2030 mp->mnt_flag &= ~MNT_ASYNC;
2031 VFS_SYNC(mp, arg ? MNT_WAIT : MNT_NOWAIT, vfs_context_current());
2033 mp->mnt_flag |= MNT_ASYNC;
2092 struct mount *mp;
2107 mp = nd.ni_vp->v_mount;
2150 error = VFS_QUOTACTL(mp, uap->cmd, uap->uid, datap, ctx);
2203 struct mount *mp;
2216 mp = vp->v_mount;
2217 sp = &mp->mnt_vfsstat;
2220 error = vfs_update_vfsstat(mp, ctx, VFS_USER_EVENT);
2225 error = munge_statfs(mp, sp, uap->buf, NULL, IS_64BIT_PROCESS(p), TRUE);
2237 struct mount *mp;
2254 mp = vp->v_mount;
2255 if (!mp) {
2259 sp = &mp->mnt_vfsstat;
2260 if ((error = vfs_update_vfsstat(mp,vfs_context_current(),VFS_USER_EVENT)) != 0) {
2264 error = munge_statfs(mp, sp, uap->buf, NULL, IS_64BIT_PROCESS(p), TRUE);
2277 statfs64_common(struct mount *mp, struct vfsstatfs *sfsp, user_addr_t bufp)
2293 sfs.f_type = mp->mnt_vtable->vfc_typenum;
2294 sfs.f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
2296 if (mp->mnt_kern_flag & MNTK_TYPENAME_OVERRIDE) {
2297 strlcpy(&sfs.f_fstypename[0], &mp->fstypename_override[0], MFSTYPENAMELEN);
2315 struct mount *mp;
2328 mp = vp->v_mount;
2329 sp = &mp->mnt_vfsstat;
2332 error = vfs_update_vfsstat(mp, ctxp, VFS_USER_EVENT);
2337 error = statfs64_common(mp, sp, uap->buf);
2349 struct mount *mp;
2366 mp = vp->v_mount;
2367 if (!mp) {
2371 sp = &mp->mnt_vfsstat;
2372 if ((error = vfs_update_vfsstat(mp, vfs_context_current(), VFS_USER_EVENT)) != 0) {
2376 error = statfs64_common(mp, sp, uap->buf);
2387 user_addr_t *mp;
2396 getfsstat_callback(mount_t mp, void * arg)
2405 sp = &mp->mnt_vfsstat;
2411 (error = vfs_update_vfsstat(mp, ctx,
2420 error = munge_statfs(mp, sp, fstp->sfsp, &my_size, IS_64BIT_PROCESS(vfs_context_proc(ctx)), FALSE);
2427 if (fstp->mp) {
2428 error = mac_mount_label_get(mp, *fstp->mp);
2433 fstp->mp++;
2479 user_addr_t *mp;
2495 mp = NULL;
2520 MALLOC(mp, user_addr_t *, count * sizeof(user_addr_t), M_MACTEMP, M_WAITOK);
2521 if (mp == NULL) {
2528 mp[i] = ((user_addr_t *)mp0)[i];
2530 mp[i] = (user_addr_t)mp0[i];
2538 fst.mp = mp;
2547 if (mp)
2548 FREE(mp, M_MACTEMP);
2563 getfsstat64_callback(mount_t mp, void * arg)
2570 sp = &mp->mnt_vfsstat;
2581 (error = vfs_update_vfsstat(mp, vfs_context_current(), VFS_USER_EVENT))) {
2586 error = statfs64_common(mp, sp, fstp->sfsp);
2644 struct mount *mp;
2692 while (!error && (mp = vp->v_mountedhere) != NULL) {
2693 if (vfs_busy(mp, LK_NOWAIT)) {
2697 error = VFS_ROOT(mp, &tdp, ctx);
2698 vfs_unbusy(mp);
6356 struct mount *mp;
6360 mp = fvp->v_mountedhere;
6362 if (vfs_busy(mp, LK_NOWAIT)) {
6371 pathend = &mp->mnt_vfsstat.f_mntonname[0];
6382 maxlen = MAXPATHLEN - (pathend - mp->mnt_vfsstat.f_mntonname);
6388 vfs_unbusy(mp);
8404 mount_t mp = vp->v_mount;
8415 error = mount_iterref (mp, 0);
8422 (void)sync_callback(mp, (arg & FSCTL_SYNC_WAIT) ? &arg : NULL);
8428 mount_iterdrop(mp);
9212 struct mount *mp = NULL;
9234 if ((mp = mount_lookupby_volfsid(fsid.val[0], 1)) == NULL) {
9240 error = VFS_ROOT(mp, &vp, ctx);
9242 error = VFS_VGET(mp, (ino64_t)uap->objid, &vp, ctx);
9244 vfs_unbusy(mp);
9282 munge_statfs(struct mount *mp, struct vfsstatfs *sfsp,
9293 sfs.f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
9294 sfs.f_type = mp->mnt_vtable->vfc_typenum;
9305 if (mp->mnt_kern_flag & MNTK_TYPENAME_OVERRIDE) {
9306 strlcpy(&sfs.f_fstypename[0], &mp->fstypename_override[0], MFSTYPENAMELEN);
9324 sfs.f_flags = mp->mnt_flag & MNT_VISFLAGMASK;
9325 sfs.f_type = mp->mnt_vtable->vfc_typenum;
9382 if (mp->mnt_kern_flag & MNTK_TYPENAME_OVERRIDE) {
9383 strlcpy(&sfs.f_fstypename[0], &mp->fstypename_override[0], MFSTYPENAMELEN);