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_srv_deleg.c
          +++ new/usr/src/uts/common/fs/nfs/nfs4_srv_deleg.c
↓ open down ↓ 152 lines elided ↑ open up ↑
 153  153  
 154  154  void
 155  155  rfs4_rele_deleg_policy(nfs4_srv_t *nsrv4)
 156  156  {
 157  157          rw_exit(&nsrv4->deleg_policy_lock);
 158  158  }
 159  159  
 160  160  srv_deleg_policy_t
 161  161  nfs4_get_deleg_policy()
 162  162  {
 163      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
      163 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
 164  164          return (nsrv4->nfs4_deleg_policy);
 165  165  }
 166  166  
 167  167  
 168  168  /*
 169  169   * This free function is to be used when the client struct is being
 170  170   * released and nothing at all is needed of the callback info any
 171  171   * longer.
 172  172   */
 173  173  void
↓ open down ↓ 1089 lines elided ↑ open up ↑
1263 1263  rfs4_grant_delegation(delegreq_t dreq, rfs4_state_t *sp, int *recall)
1264 1264  {
1265 1265          nfs4_srv_t *nsrv4;
1266 1266          rfs4_file_t *fp = sp->rs_finfo;
1267 1267          open_delegation_type4 dtype;
1268 1268          int no_delegation;
1269 1269  
1270 1270          ASSERT(rfs4_dbe_islocked(sp->rs_dbe));
1271 1271          ASSERT(rfs4_dbe_islocked(fp->rf_dbe));
1272 1272  
1273      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1273 +        nsrv4 = nfs4_get_srv();
1274 1274  
1275 1275          /* Is the server even providing delegations? */
1276 1276          if (nsrv4->nfs4_deleg_policy == SRV_NEVER_DELEGATE || dreq == DELEG_NONE)
1277 1277                  return (NULL);
1278 1278  
1279 1279          /* Check to see if delegations have been temporarily disabled */
1280 1280          mutex_enter(&nsrv4->deleg_lock);
1281 1281          no_delegation = rfs4_deleg_disabled;
1282 1282          mutex_exit(&nsrv4->deleg_lock);
1283 1283  
↓ open down ↓ 158 lines elided ↑ open up ↑
1442 1442   * recalled, unless the clientid of the caller matches the clientid of the
1443 1443   * delegation. If the caller has specified, there is a slight delay
1444 1444   * inserted in the hopes that the delegation will be returned quickly.
1445 1445   */
1446 1446  bool_t
1447 1447  rfs4_check_delegated_byfp(int mode, rfs4_file_t *fp,
1448 1448      bool_t trunc, bool_t do_delay, bool_t is_rm, clientid4 *cp)
1449 1449  {
1450 1450          rfs4_deleg_state_t *dsp;
1451 1451  
1452      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1452 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
1453 1453  
1454 1454          /* Is delegation enabled? */
1455 1455          if (nsrv4->nfs4_deleg_policy == SRV_NEVER_DELEGATE)
1456 1456                  return (FALSE);
1457 1457  
1458 1458          /* do we have a delegation on this file? */
1459 1459          rfs4_dbe_lock(fp->rf_dbe);
1460 1460          if (fp->rf_dinfo.rd_dtype == OPEN_DELEGATE_NONE) {
1461 1461                  if (is_rm)
1462 1462                          fp->rf_dinfo.rd_hold_grant++;
↓ open down ↓ 52 lines elided ↑ open up ↑
1515 1515   * drop the request and in the case of v3 JUKEBOX should be returned.
1516 1516   */
1517 1517  bool_t
1518 1518  rfs4_check_delegated(int mode, vnode_t *vp, bool_t trunc)
1519 1519  {
1520 1520          nfs4_srv_t *nsrv4;
1521 1521          rfs4_file_t *fp;
1522 1522          bool_t create = FALSE;
1523 1523          bool_t rc = FALSE;
1524 1524  
1525      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1525 +        nsrv4 = nfs4_get_srv();
1526 1526          rfs4_hold_deleg_policy(nsrv4);
1527 1527  
1528 1528          /* Is delegation enabled? */
1529 1529          if (nsrv4->nfs4_deleg_policy != SRV_NEVER_DELEGATE) {
1530 1530                  fp = rfs4_findfile(vp, NULL, &create);
1531 1531                  if (fp != NULL) {
1532 1532                          if (rfs4_check_delegated_byfp(mode, fp, trunc,
1533 1533                              TRUE, FALSE, NULL)) {
1534 1534                                  rc = TRUE;
1535 1535                          }
↓ open down ↓ 5 lines elided ↑ open up ↑
1541 1541  }
1542 1542  
1543 1543  /*
1544 1544   * Release a hold on the hold_grant counter which
1545 1545   * prevents delegation from being granted while a remove
1546 1546   * or a rename is in progress.
1547 1547   */
1548 1548  void
1549 1549  rfs4_clear_dont_grant(rfs4_file_t *fp)
1550 1550  {
1551      -        nfs4_srv_t *nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1551 +        nfs4_srv_t *nsrv4 = nfs4_get_srv();
1552 1552  
1553 1553          if (nsrv4->nfs4_deleg_policy == SRV_NEVER_DELEGATE)
1554 1554                  return;
1555 1555          rfs4_dbe_lock(fp->rf_dbe);
1556 1556          ASSERT(fp->rf_dinfo.rd_hold_grant > 0);
1557 1557          fp->rf_dinfo.rd_hold_grant--;
1558 1558          fp->rf_dinfo.rd_time_rm_delayed = 0;
1559 1559          rfs4_dbe_unlock(fp->rf_dbe);
1560 1560  }
1561 1561  
↓ open down ↓ 319 lines elided ↑ open up ↑
1881 1881                  }
1882 1882          }
1883 1883          return (FALSE);
1884 1884  }
1885 1885  
1886 1886  void
1887 1887  rfs4_disable_delegation(void)
1888 1888  {
1889 1889          nfs4_srv_t *nsrv4;
1890 1890  
1891      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1891 +        nsrv4 = nfs4_get_srv();
1892 1892          mutex_enter(&nsrv4->deleg_lock);
1893 1893          rfs4_deleg_disabled++;
1894 1894          mutex_exit(&nsrv4->deleg_lock);
1895 1895  }
1896 1896  
1897 1897  void
1898 1898  rfs4_enable_delegation(void)
1899 1899  {
1900 1900          nfs4_srv_t *nsrv4;
1901 1901  
1902      -        nsrv4 = zone_getspecific(rfs4_zone_key, curzone);
     1902 +        nsrv4 = nfs4_get_srv();
1903 1903          mutex_enter(&nsrv4->deleg_lock);
1904 1904          ASSERT(rfs4_deleg_disabled > 0);
1905 1905          rfs4_deleg_disabled--;
1906 1906          mutex_exit(&nsrv4->deleg_lock);
1907 1907  }
1908 1908  
1909 1909  void
1910 1910  rfs4_mon_hold(void *arg)
1911 1911  {
1912 1912          rfs4_file_t *fp = arg;
↓ open down ↓ 11 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX