399 exi_rele(*exip);
400 *exip = exi;
401
402 VN_RELE(*vpp);
403 *vpp = vp;
404 }
405
406 return (0);
407 }
408
409 /*
410 * Given mounted "dvp" and "exi", go upper mountpoint
411 * with dvp/exi correction
412 * Return 0 in success
413 */
414 int
415 rfs_climb_crossmnt(vnode_t **dvpp, struct exportinfo **exip, cred_t *cr)
416 {
417 struct exportinfo *exi;
418 vnode_t *dvp = *dvpp;
419
420 ASSERT3U((*exip)->exi_zoneid, ==, curzone->zone_id);
421 ASSERT((dvp->v_flag & VROOT) || VN_IS_CURZONEROOT(dvp));
422
423 VN_HOLD(dvp);
424 dvp = untraverse(dvp);
425 exi = nfs_vptoexi(NULL, dvp, cr, NULL, NULL, FALSE);
426 if (exi == NULL) {
427 VN_RELE(dvp);
428 return (-1);
429 }
430
431 ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id);
432 exi_rele(*exip);
433 *exip = exi;
434 VN_RELE(*dvpp);
435 *dvpp = dvp;
436
437 return (0);
438 }
439 /*
440 * Directory lookup.
441 * Returns an fhandle and file attributes for file name in a directory.
442 */
443 /* ARGSUSED */
444 void
445 rfs_lookup(struct nfsdiropargs *da, struct nfsdiropres *dr,
446 struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro)
447 {
448 int error;
449 vnode_t *dvp;
450 vnode_t *vp;
451 struct vattr va;
|
399 exi_rele(*exip);
400 *exip = exi;
401
402 VN_RELE(*vpp);
403 *vpp = vp;
404 }
405
406 return (0);
407 }
408
409 /*
410 * Given mounted "dvp" and "exi", go upper mountpoint
411 * with dvp/exi correction
412 * Return 0 in success
413 */
414 int
415 rfs_climb_crossmnt(vnode_t **dvpp, struct exportinfo **exip, cred_t *cr)
416 {
417 struct exportinfo *exi;
418 vnode_t *dvp = *dvpp;
419 vnode_t *zone_rootvp;
420
421 zone_rootvp = (*exip)->exi_ne->exi_root->exi_vp;
422 ASSERT((dvp->v_flag & VROOT) || VN_CMP(zone_rootvp, dvp));
423
424 VN_HOLD(dvp);
425 dvp = untraverse(dvp, zone_rootvp);
426 exi = nfs_vptoexi(NULL, dvp, cr, NULL, NULL, FALSE);
427 if (exi == NULL) {
428 VN_RELE(dvp);
429 return (-1);
430 }
431
432 ASSERT3U(exi->exi_zoneid, ==, (*exip)->exi_zoneid);
433 exi_rele(*exip);
434 *exip = exi;
435 VN_RELE(*dvpp);
436 *dvpp = dvp;
437
438 return (0);
439 }
440 /*
441 * Directory lookup.
442 * Returns an fhandle and file attributes for file name in a directory.
443 */
444 /* ARGSUSED */
445 void
446 rfs_lookup(struct nfsdiropargs *da, struct nfsdiropres *dr,
447 struct exportinfo *exi, struct svc_req *req, cred_t *cr, bool_t ro)
448 {
449 int error;
450 vnode_t *dvp;
451 vnode_t *vp;
452 struct vattr va;
|