Print this page
Try to remove assumption that zone's root vnode is marked VROOT

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/fs/nfs/nfs4_srv_attr.c
          +++ new/usr/src/uts/common/fs/nfs/nfs4_srv_attr.c
↓ open down ↓ 1295 lines elided ↑ open up ↑
1296 1296  static int
1297 1297  rfs4_get_mntdfileid(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg)
1298 1298  {
1299 1299          int error = 0;
1300 1300          vattr_t *vap, va;
1301 1301          vnode_t *stubvp = NULL, *vp;
1302 1302  
1303 1303          vp = sarg->cs->vp;
1304 1304          sarg->mntdfid_set = FALSE;
1305 1305  
1306      -        /* VROOT object, must untraverse */
1307      -        if (vp->v_flag & VROOT) {
     1306 +        /* VROOT object or zone's root, must untraverse */
     1307 +        if ((vp->v_flag & VROOT) || VN_IS_CURZONEROOT(vp)) {
1308 1308  
1309 1309                  /* extra hold for vp since untraverse might rele */
1310 1310                  VN_HOLD(vp);
1311 1311                  stubvp = untraverse(vp);
1312 1312  
1313 1313                  /*
1314      -                 * If vp/stubvp are same, we must be at system
     1314 +                 * If vp/stubvp are same, we must be at system-or-zone
1315 1315                   * root because untraverse returned same vp
1316 1316                   * for a VROOT object.  sarg->vap was setup
1317 1317                   * before we got here, so there's no need to do
1318 1318                   * another getattr -- just use the one in sarg.
1319 1319                   */
1320 1320                  if (VN_CMP(vp, stubvp)) {
1321 1321                          ASSERT(VN_CMP(vp, ZONE_ROOTVP()));
1322 1322                          vap = sarg->vap;
1323 1323                  } else {
1324 1324                          va.va_mask = AT_NODEID;
↓ open down ↓ 45 lines elided ↑ open up ↑
1370 1370          if (RFS4_MANDATTR_ONLY)
1371 1371                  return (ENOTSUP);
1372 1372  
1373 1373          switch (cmd) {
1374 1374          case NFS4ATTR_SUPPORTED:
1375 1375                  if (sarg->op == NFS4ATTR_SETIT)
1376 1376                          error = EINVAL;
1377 1377                  break;          /* this attr is supported */
1378 1378          case NFS4ATTR_GETIT:
1379 1379          case NFS4ATTR_VERIT:
1380      -                if (! sarg->mntdfid_set)
     1380 +                if (!sarg->mntdfid_set)
1381 1381                          error = rfs4_get_mntdfileid(cmd, sarg);
1382 1382  
1383      -                if (! error && sarg->mntdfid_set) {
     1383 +                if (!error && sarg->mntdfid_set) {
1384 1384                          if (cmd == NFS4ATTR_GETIT)
1385 1385                                  na->mounted_on_fileid = sarg->mounted_on_fileid;
1386 1386                          else
1387 1387                                  if (na->mounted_on_fileid !=
1388 1388                                      sarg->mounted_on_fileid)
1389 1389                                          error = -1;
1390 1390                  }
1391 1391                  break;
1392 1392          case NFS4ATTR_SETIT:
1393 1393                  /* read-only attr */
↓ open down ↓ 1469 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX