Print this page
Hyperaggressive asserts pt 2/N
Be far more judicious in the use of curzone-using macros.
(Merge and extra asserts by danmcd.)
dss_paths[] entries need cleanup too
Try to remove assumption that zone's root vnode is marked VROOT
*** 816,827 ****
sip->dss_npaths = dss_npaths;
sip->dss_paths = kmem_alloc(dss_npaths *
sizeof (rfs4_dss_path_t *), KM_SLEEP);
for (i = 0; i < dss_npaths; i++) {
! /* CSTYLED */
! sip->dss_paths[i] = rfs4_dss_newpath(nsrv4, sip, dss_paths[i], i);
}
mutex_enter(&nsrv4->servinst_lock);
if (nsrv4->nfs4_cur_servinst != NULL) {
/* add to linked list */
--- 816,827 ----
sip->dss_npaths = dss_npaths;
sip->dss_paths = kmem_alloc(dss_npaths *
sizeof (rfs4_dss_path_t *), KM_SLEEP);
for (i = 0; i < dss_npaths; i++) {
! sip->dss_paths[i] =
! rfs4_dss_newpath(nsrv4, sip, dss_paths[i], i);
}
mutex_enter(&nsrv4->servinst_lock);
if (nsrv4->nfs4_cur_servinst != NULL) {
/* add to linked list */
*** 855,867 ****
for (sip = current; sip != NULL; sip = prev) {
prev = sip->prev;
rw_destroy(&sip->rwlock);
if (sip->oldstate)
kmem_free(sip->oldstate, sizeof (rfs4_oldstate_t));
! if (sip->dss_paths)
kmem_free(sip->dss_paths,
sip->dss_npaths * sizeof (rfs4_dss_path_t *));
kmem_free(sip, sizeof (rfs4_servinst_t));
#ifdef DEBUG
n++;
#endif
}
--- 855,883 ----
for (sip = current; sip != NULL; sip = prev) {
prev = sip->prev;
rw_destroy(&sip->rwlock);
if (sip->oldstate)
kmem_free(sip->oldstate, sizeof (rfs4_oldstate_t));
! if (sip->dss_paths) {
! int i = sip->dss_npaths;
!
! while (i > 0) {
! i--;
! if (sip->dss_paths[i] != NULL) {
! char *path = sip->dss_paths[i]->path;
!
! if (path != NULL) {
! kmem_free(path,
! strlen(path) + 1);
! }
! kmem_free(sip->dss_paths[i],
! sizeof (rfs4_dss_path_t));
! }
! }
kmem_free(sip->dss_paths,
sip->dss_npaths * sizeof (rfs4_dss_path_t *));
+ }
kmem_free(sip, sizeof (rfs4_servinst_t));
#ifdef DEBUG
n++;
#endif
}
*** 935,945 ****
static nfsstat4
do_rfs4_op_secinfo(struct compound_state *cs, char *nm, SECINFO4res *resp)
{
int error, different_export = 0;
vnode_t *dvp, *vp;
! struct exportinfo *exi = NULL;
fid_t fid;
uint_t count, i;
secinfo4 *resok_val;
struct secinfo *secp;
seconfig_t *si;
--- 951,961 ----
static nfsstat4
do_rfs4_op_secinfo(struct compound_state *cs, char *nm, SECINFO4res *resp)
{
int error, different_export = 0;
vnode_t *dvp, *vp;
! struct exportinfo *exi;
fid_t fid;
uint_t count, i;
secinfo4 *resok_val;
struct secinfo *secp;
seconfig_t *si;
*** 946,969 ****
bool_t did_traverse = FALSE;
int dotdot, walk;
nfs_export_t *ne = nfs_get_export();
dvp = cs->vp;
dotdot = (nm[0] == '.' && nm[1] == '.' && nm[2] == '\0');
/*
* If dotdotting, then need to check whether it's above the
* root of a filesystem, or above an export point.
*/
if (dotdot) {
!
/*
* If dotdotting at the root of a filesystem, then
* need to traverse back to the mounted-on filesystem
* and do the dotdot lookup there.
*/
! if (cs->vp->v_flag & VROOT) {
/*
* If at the system root, then can
* go up no further.
*/
--- 962,987 ----
bool_t did_traverse = FALSE;
int dotdot, walk;
nfs_export_t *ne = nfs_get_export();
dvp = cs->vp;
+ exi = cs->exi;
+ ASSERT(exi != NULL);
dotdot = (nm[0] == '.' && nm[1] == '.' && nm[2] == '\0');
/*
* If dotdotting, then need to check whether it's above the
* root of a filesystem, or above an export point.
*/
if (dotdot) {
! ASSERT3U(exi->exi_zoneid, ==, curzone->zone_id);
/*
* If dotdotting at the root of a filesystem, then
* need to traverse back to the mounted-on filesystem
* and do the dotdot lookup there.
*/
! if ((dvp->v_flag & VROOT) || VN_IS_CURZONEROOT(dvp)) {
/*
* If at the system root, then can
* go up no further.
*/
*** 971,981 ****
return (puterrno4(ENOENT));
/*
* Traverse back to the mounted-on filesystem
*/
! dvp = untraverse(cs->vp);
/*
* Set the different_export flag so we remember
* to pick up a new exportinfo entry for
* this new filesystem.
--- 989,999 ----
return (puterrno4(ENOENT));
/*
* Traverse back to the mounted-on filesystem
*/
! dvp = untraverse(dvp);
/*
* Set the different_export flag so we remember
* to pick up a new exportinfo entry for
* this new filesystem.
*** 985,995 ****
/*
* If dotdotting above an export point then set
* the different_export to get new export info.
*/
! different_export = nfs_exported(cs->exi, cs->vp);
}
}
/*
* Get the vnode for the component "nm".
--- 1003,1013 ----
/*
* If dotdotting above an export point then set
* the different_export to get new export info.
*/
! different_export = nfs_exported(exi, dvp);
}
}
/*
* Get the vnode for the component "nm".
*** 1004,1016 ****
* used in the request is valid but not an explicitly shared flavor,
* or the access bit indicates that this is a limited access,
* check whether this vnode is visible.
*/
if (!different_export &&
! (PSEUDO(cs->exi) || ! is_exported_sec(cs->nfsflavor, cs->exi) ||
cs->access & CS_ACCESS_LIMITED)) {
! if (! nfs_visible(cs->exi, vp, &different_export)) {
VN_RELE(vp);
return (puterrno4(ENOENT));
}
}
--- 1022,1034 ----
* used in the request is valid but not an explicitly shared flavor,
* or the access bit indicates that this is a limited access,
* check whether this vnode is visible.
*/
if (!different_export &&
! (PSEUDO(exi) || !is_exported_sec(cs->nfsflavor, exi) ||
cs->access & CS_ACCESS_LIMITED)) {
! if (! nfs_visible(exi, vp, &different_export)) {
VN_RELE(vp);
return (puterrno4(ENOENT));
}
}
*** 1048,1057 ****
--- 1066,1076 ----
if (error) {
VN_RELE(vp);
return (puterrno4(error));
}
+ /* We'll need to reassign "exi". */
if (dotdot)
exi = nfs_vptoexi(NULL, vp, cs->cr, &walk, NULL, TRUE);
else
exi = checkexport4(&vp->v_vfsp->vfs_fsid, &fid, vp);
*** 1068,1079 ****
} else {
VN_RELE(vp);
return (puterrno4(EACCES));
}
}
- } else {
- exi = cs->exi;
}
ASSERT(exi != NULL);
/*
--- 1087,1096 ----
*** 2700,2716 ****
* If dotdotting, then need to check whether it's
* above the root of a filesystem, or above an
* export point.
*/
if (dotdot) {
!
/*
* If dotdotting at the root of a filesystem, then
* need to traverse back to the mounted-on filesystem
* and do the dotdot lookup there.
*/
! if (cs->vp->v_flag & VROOT) {
/*
* If at the system root, then can
* go up no further.
*/
--- 2717,2734 ----
* If dotdotting, then need to check whether it's
* above the root of a filesystem, or above an
* export point.
*/
if (dotdot) {
! ASSERT(cs->exi != NULL);
! ASSERT3U(cs->exi->exi_zoneid, ==, curzone->zone_id);
/*
* If dotdotting at the root of a filesystem, then
* need to traverse back to the mounted-on filesystem
* and do the dotdot lookup there.
*/
! if ((cs->vp->v_flag & VROOT) || VN_IS_CURZONEROOT(cs->vp)) {
/*
* If at the system root, then can
* go up no further.
*/