Print this page
Fix NFS design problems re. multiple zone keys
Make NFS server zone-specific data all have the same lifetime
Fix rfs4_clean_state_exi
Fix exi_cache_reclaim
Fix mistakes in zone keys work
More fixes re. exi_zoneid and exi_tree
(danmcd -> Keep some ASSERT()s around for readability.)

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs4_state.c
          +++ new/usr/src/uts/common/fs/nfs/nfs4_state.c
↓ open down ↓ 1125 lines elided ↑ open up ↑
1126 1126  }
1127 1127  
1128 1128  /*
1129 1129   * This is called from nfssys() in order to clear server state
1130 1130   * for the specified client IP Address.
1131 1131   */
1132 1132  void
1133 1133  rfs4_clear_client_state(struct nfs4clrst_args *clr)
1134 1134  {
1135 1135          nfs4_srv_t *nsrv4;
1136      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1136 +        nsrv4 = nfs4_get_srv();
1137 1137          (void) rfs4_dbe_walk(nsrv4->rfs4_client_tab, rfs4_client_scrub, clr);
1138 1138  }
1139 1139  
1140 1140  /*
1141 1141   * Used to initialize the NFSv4 server's state or database.  All of
1142 1142   * the tables are created and timers are set.
1143 1143   */
1144 1144  void
1145 1145  rfs4_state_g_init()
1146 1146  {
↓ open down ↓ 338 lines elided ↑ open up ↑
1485 1485  
1486 1486  /*
1487 1487   * Used at server shutdown to cleanup all of NFSv4 server's zone structures
1488 1488   * and state.
1489 1489   */
1490 1490  void
1491 1491  rfs4_state_zone_fini()
1492 1492  {
1493 1493          rfs4_database_t *dbp;
1494 1494          nfs4_srv_t *nsrv4;
1495      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1495 +        nsrv4 = nfs4_get_srv();
1496 1496  
1497 1497          rfs4_set_deleg_policy(nsrv4, SRV_NEVER_DELEGATE);
1498 1498  
1499 1499          /*
1500 1500           * Clean up any dangling stable storage structures BEFORE calling
1501 1501           * rfs4_servinst_destroy_all() so there are no dangling structures
1502 1502           * (i.e. the srvinsts are all cleared of danglers BEFORE they get
1503 1503           * freed).
1504 1504           */
1505 1505          rfs4_ss_fini(nsrv4);
↓ open down ↓ 155 lines elided ↑ open up ↑
1661 1661          nfs4_srv_t *nsrv4;
1662 1662          rfs4_servinst_t *sip;
1663 1663          char *leaf = cp->rc_ss_pn->leaf;
1664 1664  
1665 1665          /*
1666 1666           * since the state files are written to all DSS
1667 1667           * paths we must remove this leaf file instance
1668 1668           * from all server instances.
1669 1669           */
1670 1670  
1671      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1671 +        nsrv4 = nfs4_get_srv();
1672 1672          mutex_enter(&nsrv4->servinst_lock);
1673 1673          for (sip = nsrv4->nfs4_cur_servinst; sip != NULL; sip = sip->prev) {
1674 1674                  /* remove the leaf file associated with this server instance */
1675 1675                  rfs4_dss_remove_leaf(sip, NFS4_DSS_STATE_LEAF, leaf);
1676 1676          }
1677 1677          mutex_exit(&nsrv4->servinst_lock);
1678 1678  }
1679 1679  
1680 1680  static void
1681 1681  rfs4_dss_remove_leaf(rfs4_servinst_t *sip, char *dir_leaf, char *leaf)
↓ open down ↓ 55 lines elided ↑ open up ↑
1737 1737  static bool_t
1738 1738  rfs4_client_create(rfs4_entry_t u_entry, void *arg)
1739 1739  {
1740 1740          rfs4_client_t *cp = (rfs4_client_t *)u_entry;
1741 1741          nfs_client_id4 *client = (nfs_client_id4 *)arg;
1742 1742          struct sockaddr *ca;
1743 1743          cid *cidp;
1744 1744          scid_confirm_verf *scvp;
1745 1745          nfs4_srv_t *nsrv4;
1746 1746  
1747      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1747 +        nsrv4 = nfs4_get_srv();
1748 1748  
1749 1749          /* Get a clientid to give to the client */
1750 1750          cidp = (cid *)&cp->rc_clientid;
1751 1751          cidp->impl_id.start_time = nsrv4->rfs4_start_time;
1752 1752          cidp->impl_id.c_id = (uint32_t)rfs4_dbe_getid(cp->rc_dbe);
1753 1753  
1754 1754          /* If we are booted as a cluster node, embed our nodeid */
1755 1755          if (cluster_bootflags & CLUSTER_BOOTED)
1756 1756                  embed_nodeid(cidp);
1757 1757  
↓ open down ↓ 73 lines elided ↑ open up ↑
1831 1831  rfs4_client_rele(rfs4_client_t *cp)
1832 1832  {
1833 1833          rfs4_dbe_rele(cp->rc_dbe);
1834 1834  }
1835 1835  
1836 1836  rfs4_client_t *
1837 1837  rfs4_findclient(nfs_client_id4 *client, bool_t *create, rfs4_client_t *oldcp)
1838 1838  {
1839 1839          rfs4_client_t *cp;
1840 1840          nfs4_srv_t *nsrv4;
1841      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1841 +        nsrv4 = nfs4_get_srv();
1842 1842  
1843 1843  
1844 1844          if (oldcp) {
1845 1845                  rw_enter(&nsrv4->rfs4_findclient_lock, RW_WRITER);
1846 1846                  rfs4_dbe_hide(oldcp->rc_dbe);
1847 1847          } else {
1848 1848                  rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
1849 1849          }
1850 1850  
1851 1851          cp = (rfs4_client_t *)rfs4_dbsearch(nsrv4->rfs4_nfsclnt_idx, client,
↓ open down ↓ 6 lines elided ↑ open up ↑
1858 1858  
1859 1859          return (cp);
1860 1860  }
1861 1861  
1862 1862  rfs4_client_t *
1863 1863  rfs4_findclient_by_id(clientid4 clientid, bool_t find_unconfirmed)
1864 1864  {
1865 1865          rfs4_client_t *cp;
1866 1866          bool_t create = FALSE;
1867 1867          cid *cidp = (cid *)&clientid;
1868      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1868 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
1869 1869  
1870 1870          /* If we're a cluster and the nodeid isn't right, short-circuit */
1871 1871          if (cluster_bootflags & CLUSTER_BOOTED && foreign_clientid(cidp))
1872 1872                  return (NULL);
1873 1873  
1874 1874          rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
1875 1875  
1876 1876          cp = (rfs4_client_t *)rfs4_dbsearch(nsrv4->rfs4_clientid_idx, &clientid,
1877 1877              &create, NULL, RFS4_DBS_VALID);
1878 1878  
↓ open down ↓ 100 lines elided ↑ open up ↑
1979 1979  
1980 1980          return (TRUE);
1981 1981  }
1982 1982  
1983 1983  rfs4_clntip_t *
1984 1984  rfs4_find_clntip(struct sockaddr *addr, bool_t *create)
1985 1985  {
1986 1986          rfs4_clntip_t *cp;
1987 1987          nfs4_srv_t *nsrv4;
1988 1988  
1989      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1989 +        nsrv4 = nfs4_get_srv();
1990 1990  
1991 1991          rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
1992 1992  
1993 1993          cp = (rfs4_clntip_t *)rfs4_dbsearch(nsrv4->rfs4_clntip_idx, addr,
1994 1994              create, addr, RFS4_DBS_VALID);
1995 1995  
1996 1996          rw_exit(&nsrv4->rfs4_findclient_lock);
1997 1997  
1998 1998          return (cp);
1999 1999  }
2000 2000  
2001 2001  void
2002 2002  rfs4_invalidate_clntip(struct sockaddr *addr)
2003 2003  {
2004 2004          rfs4_clntip_t *cp;
2005 2005          bool_t create = FALSE;
2006      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2006 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2007 2007  
2008 2008          rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
2009 2009  
2010 2010          cp = (rfs4_clntip_t *)rfs4_dbsearch(nsrv4->rfs4_clntip_idx, addr,
2011 2011              &create, NULL, RFS4_DBS_VALID);
2012 2012          if (cp == NULL) {
2013 2013                  rw_exit(&nsrv4->rfs4_findclient_lock);
2014 2014                  return;
2015 2015          }
2016 2016          rfs4_dbe_invalidate(cp->ri_dbe);
↓ open down ↓ 140 lines elided ↑ open up ↑
2157 2157  
2158 2158  static bool_t
2159 2159  rfs4_openowner_create(rfs4_entry_t u_entry, void *arg)
2160 2160  {
2161 2161          rfs4_openowner_t *oo = (rfs4_openowner_t *)u_entry;
2162 2162          rfs4_openowner_t *argp = (rfs4_openowner_t *)arg;
2163 2163          open_owner4 *openowner = &argp->ro_owner;
2164 2164          seqid4 seqid = argp->ro_open_seqid;
2165 2165          rfs4_client_t *cp;
2166 2166          bool_t create = FALSE;
2167      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2167 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2168 2168  
2169 2169          rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
2170 2170  
2171 2171          cp = (rfs4_client_t *)rfs4_dbsearch(nsrv4->rfs4_clientid_idx,
2172 2172              &openowner->clientid,
2173 2173              &create, NULL, RFS4_DBS_VALID);
2174 2174  
2175 2175          rw_exit(&nsrv4->rfs4_findclient_lock);
2176 2176  
2177 2177          if (cp == NULL)
↓ open down ↓ 29 lines elided ↑ open up ↑
2207 2207          rfs4_dbe_unlock(cp->rc_dbe);
2208 2208  
2209 2209          return (TRUE);
2210 2210  }
2211 2211  
2212 2212  rfs4_openowner_t *
2213 2213  rfs4_findopenowner(open_owner4 *openowner, bool_t *create, seqid4 seqid)
2214 2214  {
2215 2215          rfs4_openowner_t *oo;
2216 2216          rfs4_openowner_t arg;
2217      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2217 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2218 2218  
2219 2219          arg.ro_owner = *openowner;
2220 2220          arg.ro_open_seqid = seqid;
2221 2221          /* CSTYLED */
2222 2222          oo = (rfs4_openowner_t *)rfs4_dbsearch(nsrv4->rfs4_openowner_idx, openowner,
2223 2223              create, &arg, RFS4_DBS_VALID);
2224 2224  
2225 2225          return (oo);
2226 2226  }
2227 2227  
↓ open down ↓ 127 lines elided ↑ open up ↑
2355 2355          return (TRUE);
2356 2356  }
2357 2357  
2358 2358  static bool_t
2359 2359  rfs4_lockowner_create(rfs4_entry_t u_entry, void *arg)
2360 2360  {
2361 2361          rfs4_lockowner_t *lo = (rfs4_lockowner_t *)u_entry;
2362 2362          lock_owner4 *lockowner = (lock_owner4 *)arg;
2363 2363          rfs4_client_t *cp;
2364 2364          bool_t create = FALSE;
2365      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2365 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2366 2366  
2367 2367          rw_enter(&nsrv4->rfs4_findclient_lock, RW_READER);
2368 2368  
2369 2369          cp = (rfs4_client_t *)rfs4_dbsearch(nsrv4->rfs4_clientid_idx,
2370 2370              &lockowner->clientid,
2371 2371              &create, NULL, RFS4_DBS_VALID);
2372 2372  
2373 2373          rw_exit(&nsrv4->rfs4_findclient_lock);
2374 2374  
2375 2375          if (cp == NULL)
↓ open down ↓ 8 lines elided ↑ open up ↑
2384 2384          lo->rl_owner.owner_len = lockowner->owner_len;
2385 2385          lo->rl_pid = rfs4_dbe_getid(lo->rl_dbe);
2386 2386  
2387 2387          return (TRUE);
2388 2388  }
2389 2389  
2390 2390  rfs4_lockowner_t *
2391 2391  rfs4_findlockowner(lock_owner4 *lockowner, bool_t *create)
2392 2392  {
2393 2393          rfs4_lockowner_t *lo;
2394      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2394 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2395 2395  
2396 2396          /* CSTYLED */
2397 2397          lo = (rfs4_lockowner_t *)rfs4_dbsearch(nsrv4->rfs4_lockowner_idx, lockowner,
2398 2398              create, lockowner, RFS4_DBS_VALID);
2399 2399  
2400 2400          return (lo);
2401 2401  }
2402 2402  
2403 2403  rfs4_lockowner_t *
2404 2404  rfs4_findlockowner_by_pid(pid_t pid)
2405 2405  {
2406 2406          rfs4_lockowner_t *lo;
2407 2407          bool_t create = FALSE;
2408      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2408 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2409 2409  
2410 2410          lo = (rfs4_lockowner_t *)rfs4_dbsearch(nsrv4->rfs4_lockowner_pid_idx,
2411 2411              (void *)(uintptr_t)pid, &create, NULL, RFS4_DBS_VALID);
2412 2412  
2413 2413          return (lo);
2414 2414  }
2415 2415  
2416 2416  
2417 2417  static uint32_t
2418 2418  file_hash(void *key)
↓ open down ↓ 92 lines elided ↑ open up ↑
2511 2511          mutex_exit(&vp->v_vsd_lock);
2512 2512  
2513 2513          return (TRUE);
2514 2514  }
2515 2515  
2516 2516  rfs4_file_t *
2517 2517  rfs4_findfile(vnode_t *vp, nfs_fh4 *fh, bool_t *create)
2518 2518  {
2519 2519          rfs4_file_t *fp;
2520 2520          rfs4_fcreate_arg arg;
2521      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2521 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2522 2522  
2523 2523          arg.vp = vp;
2524 2524          arg.fh = fh;
2525 2525  
2526 2526          if (*create == TRUE)
2527 2527                  /* CSTYLED */
2528 2528                  fp = (rfs4_file_t *)rfs4_dbsearch(nsrv4->rfs4_file_idx, vp, create,
2529 2529                      &arg, RFS4_DBS_VALID);
2530 2530          else {
2531 2531                  mutex_enter(&vp->v_vsd_lock);
↓ open down ↓ 21 lines elided ↑ open up ↑
2553 2553   * assumes that a file struct that has a NULL vnode pointer is marked
2554 2554   * at 'invalid' and will not be found in the db the second time
2555 2555   * around.
2556 2556   */
2557 2557  rfs4_file_t *
2558 2558  rfs4_findfile_withlock(vnode_t *vp, nfs_fh4 *fh, bool_t *create)
2559 2559  {
2560 2560          rfs4_file_t *fp;
2561 2561          rfs4_fcreate_arg arg;
2562 2562          bool_t screate = *create;
2563      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2563 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2564 2564  
2565 2565          if (screate == FALSE) {
2566 2566                  mutex_enter(&vp->v_vsd_lock);
2567 2567                  fp = (rfs4_file_t *)vsd_get(vp, nfs4_srv_vkey);
2568 2568                  if (fp) {
2569 2569                          rfs4_dbe_lock(fp->rf_dbe);
2570 2570                          if (rfs4_dbe_is_invalid(fp->rf_dbe) ||
2571 2571                              (rfs4_dbe_refcnt(fp->rf_dbe) == 0)) {
2572 2572                                  rfs4_dbe_unlock(fp->rf_dbe);
2573 2573                                  mutex_exit(&vp->v_vsd_lock);
↓ open down ↓ 166 lines elided ↑ open up ↑
2740 2740          if (unlock_fp == TRUE)
2741 2741                  rw_exit(&lsp->rls_state->rs_finfo->rf_file_rwlock);
2742 2742          rfs4_dbe_rele(lsp->rls_dbe);
2743 2743  }
2744 2744  
2745 2745  static rfs4_lo_state_t *
2746 2746  rfs4_findlo_state(stateid_t *id, bool_t lock_fp)
2747 2747  {
2748 2748          rfs4_lo_state_t *lsp;
2749 2749          bool_t create = FALSE;
2750      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2750 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2751 2751  
2752 2752          lsp = (rfs4_lo_state_t *)rfs4_dbsearch(nsrv4->rfs4_lo_state_idx, id,
2753 2753              &create, NULL, RFS4_DBS_VALID);
2754 2754          if (lock_fp == TRUE && lsp != NULL)
2755 2755                  rw_enter(&lsp->rls_state->rs_finfo->rf_file_rwlock, RW_READER);
2756 2756  
2757 2757          return (lsp);
2758 2758  }
2759 2759  
2760 2760  
↓ open down ↓ 20 lines elided ↑ open up ↑
2781 2781  {
2782 2782          return (u_entry);
2783 2783  }
2784 2784  
2785 2785  rfs4_lo_state_t *
2786 2786  rfs4_findlo_state_by_owner(rfs4_lockowner_t *lo, rfs4_state_t *sp,
2787 2787      bool_t *create)
2788 2788  {
2789 2789          rfs4_lo_state_t *lsp;
2790 2790          rfs4_lo_state_t arg;
2791      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2791 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
2792 2792  
2793 2793          arg.rls_locker = lo;
2794 2794          arg.rls_state = sp;
2795 2795  
2796 2796          lsp = (rfs4_lo_state_t *)rfs4_dbsearch(nsrv4->rfs4_lo_state_owner_idx,
2797 2797              &arg, create, &arg, RFS4_DBS_VALID);
2798 2798  
2799 2799          return (lsp);
2800 2800  }
2801 2801  
2802 2802  static stateid_t
2803 2803  get_stateid(id_t eid)
2804 2804  {
2805 2805          stateid_t id;
2806 2806          nfs4_srv_t *nsrv4;
2807 2807  
2808      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     2808 +        nsrv4 = nfs4_get_srv();
2809 2809  
2810 2810          id.bits.boottime = nsrv4->rfs4_start_time;
2811 2811          id.bits.ident = eid;
2812 2812          id.bits.chgseq = 0;
2813 2813          id.bits.type = 0;
2814 2814          id.bits.pid = 0;
2815 2815  
2816 2816          /*
2817 2817           * If we are booted as a cluster node, embed our nodeid.
2818 2818           * We've already done sanity checks in rfs4_client_create() so no
↓ open down ↓ 237 lines elided ↑ open up ↑
3056 3056  
3057 3057          /* And now with the openowner */
3058 3058          rfs4_client_rele(dsp->rds_client);
3059 3059          dsp->rds_client = NULL;
3060 3060  }
3061 3061  
3062 3062  rfs4_deleg_state_t *
3063 3063  rfs4_finddeleg(rfs4_state_t *sp, bool_t *create)
3064 3064  {
3065 3065          rfs4_deleg_state_t ds, *dsp;
3066      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3066 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
3067 3067  
3068 3068          ds.rds_client = sp->rs_owner->ro_client;
3069 3069          ds.rds_finfo = sp->rs_finfo;
3070 3070  
3071 3071          dsp = (rfs4_deleg_state_t *)rfs4_dbsearch(nsrv4->rfs4_deleg_idx, &ds,
3072 3072              create, &ds, RFS4_DBS_VALID);
3073 3073  
3074 3074          return (dsp);
3075 3075  }
3076 3076  
3077 3077  rfs4_deleg_state_t *
3078 3078  rfs4_finddelegstate(stateid_t *id)
3079 3079  {
3080 3080          rfs4_deleg_state_t *dsp;
3081 3081          bool_t create = FALSE;
3082      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3082 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
3083 3083  
3084 3084          dsp = (rfs4_deleg_state_t *)rfs4_dbsearch(nsrv4->rfs4_deleg_state_idx,
3085 3085              id, &create, NULL, RFS4_DBS_VALID);
3086 3086  
3087 3087          return (dsp);
3088 3088  }
3089 3089  
3090 3090  void
3091 3091  rfs4_deleg_state_rele(rfs4_deleg_state_t *dsp)
3092 3092  {
↓ open down ↓ 101 lines elided ↑ open up ↑
3194 3194  
3195 3195          return (sp->rs_finfo);
3196 3196  }
3197 3197  
3198 3198  rfs4_state_t *
3199 3199  rfs4_findstate_by_owner_file(rfs4_openowner_t *oo, rfs4_file_t *fp,
3200 3200      bool_t *create)
3201 3201  {
3202 3202          rfs4_state_t *sp;
3203 3203          rfs4_state_t key;
3204      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3204 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
3205 3205  
3206 3206          key.rs_owner = oo;
3207 3207          key.rs_finfo = fp;
3208 3208  
3209 3209          sp = (rfs4_state_t *)rfs4_dbsearch(nsrv4->rfs4_state_owner_file_idx,
3210 3210              &key, create, &key, RFS4_DBS_VALID);
3211 3211  
3212 3212          return (sp);
3213 3213  }
3214 3214  
3215 3215  /* This returns ANY state struct that refers to this file */
3216 3216  static rfs4_state_t *
3217 3217  rfs4_findstate_by_file(rfs4_file_t *fp)
3218 3218  {
3219 3219          bool_t create = FALSE;
3220      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3220 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
3221 3221  
3222 3222          return ((rfs4_state_t *)rfs4_dbsearch(nsrv4->rfs4_state_file_idx, fp,
3223 3223              &create, fp, RFS4_DBS_VALID));
3224 3224  }
3225 3225  
3226 3226  static bool_t
3227 3227  rfs4_state_expiry(rfs4_entry_t u_entry)
3228 3228  {
3229 3229          rfs4_state_t *sp = (rfs4_state_t *)u_entry;
3230 3230  
↓ open down ↓ 32 lines elided ↑ open up ↑
3263 3263          rfs4_dbe_unlock(oo->ro_dbe);
3264 3264  
3265 3265          return (TRUE);
3266 3266  }
3267 3267  
3268 3268  static rfs4_state_t *
3269 3269  rfs4_findstate(stateid_t *id, rfs4_dbsearch_type_t find_invalid, bool_t lock_fp)
3270 3270  {
3271 3271          rfs4_state_t *sp;
3272 3272          bool_t create = FALSE;
3273      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3273 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
3274 3274  
3275 3275          sp = (rfs4_state_t *)rfs4_dbsearch(nsrv4->rfs4_state_idx, id,
3276 3276              &create, NULL, find_invalid);
3277 3277          if (lock_fp == TRUE && sp != NULL)
3278 3278                  rw_enter(&sp->rs_finfo->rf_file_rwlock, RW_READER);
3279 3279  
3280 3280          return (sp);
3281 3281  }
3282 3282  
3283 3283  void
↓ open down ↓ 51 lines elided ↑ open up ↑
3335 3335          /* Release the client */
3336 3336          rfs4_client_rele(cp);
3337 3337  }
3338 3338  
3339 3339  nfsstat4
3340 3340  rfs4_check_clientid(clientid4 *cp, int setclid_confirm)
3341 3341  {
3342 3342          cid *cidp = (cid *) cp;
3343 3343          nfs4_srv_t *nsrv4;
3344 3344  
3345      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3345 +        nsrv4 = nfs4_get_srv();
3346 3346  
3347 3347          /*
3348 3348           * If we are booted as a cluster node, check the embedded nodeid.
3349 3349           * If it indicates that this clientid was generated on another node,
3350 3350           * inform the client accordingly.
3351 3351           */
3352 3352          if (cluster_bootflags & CLUSTER_BOOTED && foreign_clientid(cidp))
3353 3353                  return (NFS4ERR_STALE_CLIENTID);
3354 3354  
3355 3355          /*
↓ open down ↓ 11 lines elided ↑ open up ↑
3367 3367  /*
3368 3368   * This is used when a stateid has not been found amongst the
3369 3369   * current server's state.  Check the stateid to see if it
3370 3370   * was from this server instantiation or not.
3371 3371   */
3372 3372  static nfsstat4
3373 3373  what_stateid_error(stateid_t *id, stateid_type_t type)
3374 3374  {
3375 3375          nfs4_srv_t *nsrv4;
3376 3376  
3377      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     3377 +        nsrv4 = nfs4_get_srv();
3378 3378  
3379 3379          /* If we are booted as a cluster node, was stateid locally generated? */
3380 3380          if ((cluster_bootflags & CLUSTER_BOOTED) && foreign_stateid(id))
3381 3381                  return (NFS4ERR_STALE_STATEID);
3382 3382  
3383 3383          /* If types don't match then no use checking further */
3384 3384          if (type != id->bits.type)
3385 3385                  return (NFS4ERR_BAD_STATEID);
3386 3386  
3387 3387          /* From a different server instantiation, return STALE */
↓ open down ↓ 713 lines elided ↑ open up ↑
4101 4101                  }
4102 4102                  rfs4_dbe_invalidate(fp->rf_dbe);
4103 4103          }
4104 4104  }
4105 4105  
4106 4106  /*
4107 4107   * Given a directory that is being unexported, cleanup/release all
4108 4108   * state in the server that refers to objects residing underneath this
4109 4109   * particular export.  The ordering of the release is important.
4110 4110   * Lock_owner, then state and then file.
     4111 + *
     4112 + * NFS zones note: nfs_export.c:unexport() calls this from a
     4113 + * thread in the global zone for NGZ data structures, so we
     4114 + * CANNOT use zone_getspecific anywhere in this code path.
4111 4115   */
4112 4116  void
4113      -rfs4_clean_state_exi(struct exportinfo *exi)
     4117 +rfs4_clean_state_exi(nfs_export_t *ne, struct exportinfo *exi)
4114 4118  {
     4119 +        nfs_globals_t *ng;
4115 4120          nfs4_srv_t *nsrv4;
4116 4121  
4117      -        /* curzone mightn't be exi_zone, so use exi_zone instead. */
4118      -        ASSERT(exi->exi_zone == curzone || curzone == global_zone);
4119      -        nsrv4 = zone_getspecific(rfs4_zone_key, exi->exi_zone);
4120      -        if (nsrv4 == NULL) /* NOTE: NFSv4 cleanup MAY have already happened. */
4121      -                return;
     4122 +        ng = ne->ne_globals;
     4123 +        ASSERT(ng->nfs_zoneid == exi->exi_zoneid);
     4124 +        nsrv4 = ng->nfs4_srv;
     4125 +
4122 4126          mutex_enter(&nsrv4->state_lock);
4123 4127  
4124 4128          if (nsrv4->nfs4_server_state == NULL) {
4125 4129                  mutex_exit(&nsrv4->state_lock);
4126 4130                  return;
4127 4131          }
4128 4132  
4129      -        /* CSTYLED */
4130      -        rfs4_dbe_walk(nsrv4->rfs4_lo_state_tab, rfs4_lo_state_walk_callout, exi);
     4133 +        rfs4_dbe_walk(nsrv4->rfs4_lo_state_tab,
     4134 +            rfs4_lo_state_walk_callout, exi);
4131 4135          rfs4_dbe_walk(nsrv4->rfs4_state_tab, rfs4_state_walk_callout, exi);
4132      -        /* CSTYLED */
4133      -        rfs4_dbe_walk(nsrv4->rfs4_deleg_state_tab, rfs4_deleg_state_walk_callout, exi);
     4136 +        rfs4_dbe_walk(nsrv4->rfs4_deleg_state_tab,
     4137 +            rfs4_deleg_state_walk_callout, exi);
4134 4138          rfs4_dbe_walk(nsrv4->rfs4_file_tab, rfs4_file_walk_callout, exi);
4135 4139  
4136 4140          mutex_exit(&nsrv4->state_lock);
4137 4141  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX