Print this page
Revert exi_zone to exi_zoneid, and install exi_ne backpointer
Caution with use after exi_rele()
Be far more judicious in the use of curzone-using macros.
(Merge and extra asserts by danmcd.)
curzone reality check and teardown changes to use the RIGHT zone
Try to remove assumption that zone's root vnode is marked VROOT
        
*** 409,418 ****
--- 409,419 ----
          /*
           * Allow lookups from the root - the default
           * location of the public filehandle.
           */
          if (exi != NULL && (exi->exi_export.ex_flags & EX_PUBLIC)) {
+                 ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id);
                  dvp = ZONE_ROOTVP();
                  VN_HOLD(dvp);
  
                  DTRACE_NFSV3_5(op__lookup__start, struct svc_req *, req,
                      cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi,
*** 442,455 ****
                  resp->status = NFS3ERR_ACCES;
                  goto out1;
          }
  
          fhp = &args->what.dir;
          if (strcmp(args->what.name, "..") == 0 &&
              EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) {
                  if ((exi->exi_export.ex_flags & EX_NOHIDE) &&
!                     (dvp->v_flag & VROOT)) {
                          /*
                           * special case for ".." and 'nohide'exported root
                           */
                          if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) {
                                  resp->status = NFS3ERR_ACCES;
--- 443,457 ----
                  resp->status = NFS3ERR_ACCES;
                  goto out1;
          }
  
          fhp = &args->what.dir;
+         ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is non-NULL */
          if (strcmp(args->what.name, "..") == 0 &&
              EQFID(&exi->exi_fid, FH3TOFIDP(fhp))) {
                  if ((exi->exi_export.ex_flags & EX_NOHIDE) &&
!                     ((dvp->v_flag & VROOT) || VN_IS_CURZONEROOT(dvp))) {
                          /*
                           * special case for ".." and 'nohide'exported root
                           */
                          if (rfs_climb_crossmnt(&dvp, &exi, cr) != 0) {
                                  resp->status = NFS3ERR_ACCES;
*** 476,485 ****
--- 478,488 ----
           */
          if (PUBLIC_FH3(&args->what.dir)) {
                  publicfh_flag = TRUE;
  
                  exi_rele(exi);
+                 exi = NULL;
  
                  error = rfs_publicfh_mclookup(name, dvp, cr, &vp,
                      &exi, &sec);
  
                  /*
*** 559,569 ****
          }
  
          va.va_mask = AT_ALL;
          vap = rfs4_delegated_getattr(vp, &va, 0, cr) ? NULL : &va;
  
-         exi_rele(exi);
          VN_RELE(vp);
  
          resp->status = NFS3_OK;
          vattr_to_post_op_attr(vap, &resp->resok.obj_attributes);
          vattr_to_post_op_attr(dvap, &resp->resok.dir_attributes);
--- 562,571 ----
*** 578,587 ****
--- 580,590 ----
  
          DTRACE_NFSV3_5(op__lookup__done, struct svc_req *, req,
              cred_t *, cr, vnode_t *, dvp, struct exportinfo *, exi,
              LOOKUP3res *, resp);
          VN_RELE(dvp);
+         exi_rele(exi);
  
          return;
  
  out:
          if (curthread->t_flag & T_WOULDBLOCK) {
*** 1331,1341 ****
--- 1334,1346 ----
          if (vp == NULL) {
                  error = ESTALE;
                  goto err;
          }
  
+         ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is non-NULL. */
          ns = nfs3_get_srv();
+ 
          if (is_system_labeled()) {
                  bslabel_t *clabel = req->rq_label;
  
                  ASSERT(clabel != NULL);
                  DTRACE_PROBE2(tx__rfs3__log__info__opwrite__clabel, char *,
*** 2669,2678 ****
--- 2674,2684 ----
          if (name == NULL) {
                  resp->status = NFS3ERR_INVAL;
                  goto err1;
          }
  
+         ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id);
          error = VOP_RMDIR(vp, name, ZONE_ROOTVP(), cr, NULL, 0);
  
          if (name != args->object.name)
                  kmem_free(name, MAXPATHLEN + 1);
  
*** 4131,4140 ****
--- 4137,4147 ----
          if (vp == NULL) {
                  error = ESTALE;
                  goto out;
          }
  
+         ASSERT3U(curzone->zone_id, ==, exi->exi_zoneid); /* exi is non-NULL. */
          ns = nfs3_get_srv();
          bva.va_mask = AT_ALL;
          error = VOP_GETATTR(vp, &bva, 0, cr, NULL);
  
          /*