+/*
+ * Handle uid/gid == 99 and MNT_IGNORE_OWNERSHIP here.
+ */
+void
+vnode_attr_handle_mnt_ignore_ownership(struct vnode_attr *vap, mount_t mp, vfs_context_t ctx)
+{
+ uid_t nuid;
+ gid_t ngid;
+
+ if (VATTR_IS_ACTIVE(vap, va_uid)) {
+ if (vfs_context_issuser(ctx) && VATTR_IS_SUPPORTED(vap, va_uid)) {
+ nuid = vap->va_uid;
+ } else if (mp->mnt_flag & MNT_IGNORE_OWNERSHIP) {
+ nuid = mp->mnt_fsowner;
+ if (nuid == KAUTH_UID_NONE) {
+ nuid = 99;
+ }
+ } else if (VATTR_IS_SUPPORTED(vap, va_uid)) {
+ nuid = vap->va_uid;
+ } else {
+ /* this will always be something sensible */
+ nuid = mp->mnt_fsowner;
+ }
+ if ((nuid == 99) && !vfs_context_issuser(ctx)) {
+ nuid = kauth_cred_getuid(vfs_context_ucred(ctx));
+ }
+ VATTR_RETURN(vap, va_uid, nuid);
+ }
+ if (VATTR_IS_ACTIVE(vap, va_gid)) {
+ if (vfs_context_issuser(ctx) && VATTR_IS_SUPPORTED(vap, va_gid)) {
+ ngid = vap->va_gid;
+ } else if (mp->mnt_flag & MNT_IGNORE_OWNERSHIP) {
+ ngid = mp->mnt_fsgroup;
+ if (ngid == KAUTH_GID_NONE) {
+ ngid = 99;
+ }
+ } else if (VATTR_IS_SUPPORTED(vap, va_gid)) {
+ ngid = vap->va_gid;
+ } else {
+ /* this will always be something sensible */
+ ngid = mp->mnt_fsgroup;
+ }
+ if ((ngid == 99) && !vfs_context_issuser(ctx)) {
+ ngid = kauth_cred_getgid(vfs_context_ucred(ctx));
+ }
+ VATTR_RETURN(vap, va_gid, ngid);
+ }
+}