3691 * in order to avoid a deadlock with the clock thread.
3692 * The process will not disappear and its address space
3693 * will not change because it is marked P_PR_LOCK.
3694 */
3695 mutex_exit(&p->p_lock);
3696 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
3697 if ((seg = AS_SEGFIRST(as)) == NULL) {
3698 vp = NULL;
3699 goto out;
3700 }
3701 if (strcmp(comp, "a.out") == 0) {
3702 vp = p->p_exec;
3703 goto out;
3704 }
3705 do {
3706 /*
3707 * Manufacture a filename for the "object" directory.
3708 */
3709 vattr.va_mask = AT_FSID|AT_NODEID;
3710 if (seg->s_ops == &segvn_ops &&
3711 SEGOP_GETVP(seg, seg->s_base, &vp) == 0 &&
3712 vp != NULL && vp->v_type == VREG &&
3713 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
3714 char name[64];
3715
3716 if (vp == p->p_exec) /* "a.out" */
3717 continue;
3718 pr_object_name(name, vp, &vattr);
3719 if (strcmp(name, comp) == 0)
3720 goto out;
3721 }
3722 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
3723
3724 vp = NULL;
3725 out:
3726 if (vp != NULL) {
3727 VN_HOLD(vp);
3728 }
3729 AS_LOCK_EXIT(as, &as->a_lock);
3730 mutex_enter(&p->p_lock);
3731 prunlock(dpnp);
4142 if (p->p_execdir != NULL) {
4143 vp = p->p_execdir;
4144 VN_HOLD(vp);
4145 type = NAME_OBJECT;
4146 flags |= PR_AOUT;
4147 } else {
4148 vp = p->p_exec;
4149 VN_HOLD(vp);
4150 type = NAME_OBJECT;
4151 }
4152 } else {
4153 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
4154 if ((seg = AS_SEGFIRST(as)) != NULL) {
4155 do {
4156 /*
4157 * Manufacture a filename for the
4158 * "object" directory.
4159 */
4160 vattr.va_mask = AT_FSID|AT_NODEID;
4161 if (seg->s_ops == &segvn_ops &&
4162 SEGOP_GETVP(seg, seg->s_base, &vp)
4163 == 0 &&
4164 vp != NULL && vp->v_type == VREG &&
4165 VOP_GETATTR(vp, &vattr, 0, CRED(),
4166 NULL) == 0) {
4167 char name[64];
4168
4169 if (vp == p->p_exec)
4170 continue;
4171 idx++;
4172 pr_object_name(name, vp,
4173 &vattr);
4174 if (strcmp(name, comp) == 0)
4175 break;
4176 }
4177 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
4178 }
4179
4180 if (seg == NULL) {
4181 vp = NULL;
4182 } else {
4843 if (as->a_updatedir == 0 && as->a_objectdir != NULL)
4844 return;
4845 as->a_updatedir = 0;
4846
4847 if ((nalloc = avl_numnodes(&as->a_segtree)) == 0 ||
4848 (seg = AS_SEGFIRST(as)) == NULL) /* can't happen? */
4849 return;
4850
4851 /*
4852 * Allocate space for the new object directory.
4853 * (This is usually about two times too many entries.)
4854 */
4855 nalloc = (nalloc + 0xf) & ~0xf; /* multiple of 16 */
4856 dir = kmem_zalloc(nalloc * sizeof (vnode_t *), KM_SLEEP);
4857
4858 /* fill in the new directory with desired entries */
4859 nentries = 0;
4860 do {
4861 vattr.va_mask = AT_FSID|AT_NODEID;
4862 if (seg->s_ops == &segvn_ops &&
4863 SEGOP_GETVP(seg, seg->s_base, &vp) == 0 &&
4864 vp != NULL && vp->v_type == VREG &&
4865 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
4866 for (i = 0; i < nentries; i++)
4867 if (vp == dir[i])
4868 break;
4869 if (i == nentries) {
4870 ASSERT(nentries < nalloc);
4871 dir[nentries++] = vp;
4872 }
4873 }
4874 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
4875
4876 if (as->a_objectdir == NULL) { /* first time */
4877 as->a_objectdir = dir;
4878 as->a_sizedir = nalloc;
4879 return;
4880 }
4881
4882 /*
4883 * Null out all of the defunct entries in the old directory.
|
3691 * in order to avoid a deadlock with the clock thread.
3692 * The process will not disappear and its address space
3693 * will not change because it is marked P_PR_LOCK.
3694 */
3695 mutex_exit(&p->p_lock);
3696 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
3697 if ((seg = AS_SEGFIRST(as)) == NULL) {
3698 vp = NULL;
3699 goto out;
3700 }
3701 if (strcmp(comp, "a.out") == 0) {
3702 vp = p->p_exec;
3703 goto out;
3704 }
3705 do {
3706 /*
3707 * Manufacture a filename for the "object" directory.
3708 */
3709 vattr.va_mask = AT_FSID|AT_NODEID;
3710 if (seg->s_ops == &segvn_ops &&
3711 segop_getvp(seg, seg->s_base, &vp) == 0 &&
3712 vp != NULL && vp->v_type == VREG &&
3713 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
3714 char name[64];
3715
3716 if (vp == p->p_exec) /* "a.out" */
3717 continue;
3718 pr_object_name(name, vp, &vattr);
3719 if (strcmp(name, comp) == 0)
3720 goto out;
3721 }
3722 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
3723
3724 vp = NULL;
3725 out:
3726 if (vp != NULL) {
3727 VN_HOLD(vp);
3728 }
3729 AS_LOCK_EXIT(as, &as->a_lock);
3730 mutex_enter(&p->p_lock);
3731 prunlock(dpnp);
4142 if (p->p_execdir != NULL) {
4143 vp = p->p_execdir;
4144 VN_HOLD(vp);
4145 type = NAME_OBJECT;
4146 flags |= PR_AOUT;
4147 } else {
4148 vp = p->p_exec;
4149 VN_HOLD(vp);
4150 type = NAME_OBJECT;
4151 }
4152 } else {
4153 AS_LOCK_ENTER(as, &as->a_lock, RW_READER);
4154 if ((seg = AS_SEGFIRST(as)) != NULL) {
4155 do {
4156 /*
4157 * Manufacture a filename for the
4158 * "object" directory.
4159 */
4160 vattr.va_mask = AT_FSID|AT_NODEID;
4161 if (seg->s_ops == &segvn_ops &&
4162 segop_getvp(seg, seg->s_base, &vp)
4163 == 0 &&
4164 vp != NULL && vp->v_type == VREG &&
4165 VOP_GETATTR(vp, &vattr, 0, CRED(),
4166 NULL) == 0) {
4167 char name[64];
4168
4169 if (vp == p->p_exec)
4170 continue;
4171 idx++;
4172 pr_object_name(name, vp,
4173 &vattr);
4174 if (strcmp(name, comp) == 0)
4175 break;
4176 }
4177 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
4178 }
4179
4180 if (seg == NULL) {
4181 vp = NULL;
4182 } else {
4843 if (as->a_updatedir == 0 && as->a_objectdir != NULL)
4844 return;
4845 as->a_updatedir = 0;
4846
4847 if ((nalloc = avl_numnodes(&as->a_segtree)) == 0 ||
4848 (seg = AS_SEGFIRST(as)) == NULL) /* can't happen? */
4849 return;
4850
4851 /*
4852 * Allocate space for the new object directory.
4853 * (This is usually about two times too many entries.)
4854 */
4855 nalloc = (nalloc + 0xf) & ~0xf; /* multiple of 16 */
4856 dir = kmem_zalloc(nalloc * sizeof (vnode_t *), KM_SLEEP);
4857
4858 /* fill in the new directory with desired entries */
4859 nentries = 0;
4860 do {
4861 vattr.va_mask = AT_FSID|AT_NODEID;
4862 if (seg->s_ops == &segvn_ops &&
4863 segop_getvp(seg, seg->s_base, &vp) == 0 &&
4864 vp != NULL && vp->v_type == VREG &&
4865 VOP_GETATTR(vp, &vattr, 0, CRED(), NULL) == 0) {
4866 for (i = 0; i < nentries; i++)
4867 if (vp == dir[i])
4868 break;
4869 if (i == nentries) {
4870 ASSERT(nentries < nalloc);
4871 dir[nentries++] = vp;
4872 }
4873 }
4874 } while ((seg = AS_SEGNEXT(as, seg)) != NULL);
4875
4876 if (as->a_objectdir == NULL) { /* first time */
4877 as->a_objectdir = dir;
4878 as->a_sizedir = nalloc;
4879 return;
4880 }
4881
4882 /*
4883 * Null out all of the defunct entries in the old directory.
|