Print this page
*** NO COMMENTS ***
*** 2597,2608 ****
int pathflag;
vnode_t *mc_dvp = NULL;
vnode_t *realvp;
int error;
- *exi = NULL;
-
/*
* check if the given path is a url or native path. Since p is
* modified by MCLpath(), it may be empty after returning from
* there, and should be checked.
*/
--- 2597,2606 ----
*** 2798,2809 ****
* for odd case where a directory is provided as index
* option argument and leads us to another filesystem
*/
/* Release the reference on the old exi value */
- ASSERT(*exi != NULL);
exi_rele(*exi);
if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) {
VN_RELE(*vpp);
goto publicfh_done;
}
--- 2796,2807 ----
* for odd case where a directory is provided as index
* option argument and leads us to another filesystem
*/
/* Release the reference on the old exi value */
exi_rele(*exi);
+ *exi = NULL;
if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) {
VN_RELE(*vpp);
goto publicfh_done;
}
*** 2812,2821 ****
--- 2810,2822 ----
publicfh_done:
if (mc_dvp)
VN_RELE(mc_dvp);
+ if (error && *exi != NULL)
+ exi_rele(*exi);
+
return (error);
}
/*
* Evaluate a multi-component path
*** 2957,2988 ****
/*
* Get the export information for the lookup vnode, and verify its
* useable.
*/
int
nfs_check_vpexi(vnode_t *mc_dvp, vnode_t *vp, cred_t *cr,
! struct exportinfo **exi)
{
int walk;
int error = 0;
! *exi = nfs_vptoexi(mc_dvp, vp, cr, &walk, NULL, FALSE);
! if (*exi == NULL)
error = EACCES;
else {
/*
* If nosub is set for this export then
* a lookup relative to the public fh
* must not terminate below the
* exported directory.
*/
! if ((*exi)->exi_export.ex_flags & EX_NOSUB && walk > 0)
error = EACCES;
}
!
return (error);
}
/*
* Do the main work of handling HA-NFSv4 Resource Group failover on
--- 2958,2995 ----
/*
* Get the export information for the lookup vnode, and verify its
* useable.
+ *
+ * Set @exip only in success
*/
int
nfs_check_vpexi(vnode_t *mc_dvp, vnode_t *vp, cred_t *cr,
! struct exportinfo **exip)
{
int walk;
int error = 0;
+ struct exportinfo *exi;
! exi = nfs_vptoexi(mc_dvp, vp, cr, &walk, NULL, FALSE);
! if (exi == NULL)
error = EACCES;
else {
/*
* If nosub is set for this export then
* a lookup relative to the public fh
* must not terminate below the
* exported directory.
*/
! if (exi->exi_export.ex_flags & EX_NOSUB && walk > 0) {
error = EACCES;
+ exi_rele(exi);
}
! }
! if (error == 0)
! *exip = exi;
return (error);
}
/*
* Do the main work of handling HA-NFSv4 Resource Group failover on