Print this page
patch lower-case-segops


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.