diff options
Diffstat (limited to 'usr/src/uts/common/fs/vfs.c')
-rw-r--r-- | usr/src/uts/common/fs/vfs.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/usr/src/uts/common/fs/vfs.c b/usr/src/uts/common/fs/vfs.c index 409e69a00d..6e93d056df 100644 --- a/usr/src/uts/common/fs/vfs.c +++ b/usr/src/uts/common/fs/vfs.c @@ -20,6 +20,7 @@ */ /* * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, Joyent, Inc. All rights reserved. */ /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ @@ -1129,6 +1130,7 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp, struct pathname pn, rpn; vsk_anchor_t *vskap; char fstname[FSTYPSZ]; + zone_t *zone; /* * The v_flag value for the mount point vp is permanently set @@ -1590,9 +1592,24 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp, } /* - * Serialize with zone creations. + * Serialize with zone state transitions. + * See vfs_list_add; zone mounted into is: + * zone_find_by_path(refstr_value(vfsp->vfs_mntpt)) + * not the zone doing the mount (curproc->p_zone), but if we're already + * inside a NGZ, then we know what zone we are. */ - mount_in_progress(); + if (INGLOBALZONE(curproc)) { + zone = zone_find_by_path(mountpt); + ASSERT(zone != NULL); + } else { + zone = curproc->p_zone; + /* + * zone_find_by_path does a hold, so do one here too so that + * we can do a zone_rele after mount_completed. + */ + zone_hold(zone); + } + mount_in_progress(zone); /* * Instantiate (or reinstantiate) the file system. If appropriate, * splice it into the file system name space. @@ -1761,7 +1778,8 @@ domount(char *fsname, struct mounta *uap, vnode_t *vp, struct cred *credp, vfs_unlock(vfsp); } - mount_completed(); + mount_completed(zone); + zone_rele(zone); if (splice) vn_vfsunlock(vp); |