Print this page
*** NO COMMENTS ***
*** 19,29 ****
* CDDL HEADER END
*/
/*
* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
*
! * Copyright 2012 Nexenta Systems, Inc. All rights reserved.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
--- 19,29 ----
* CDDL HEADER END
*/
/*
* Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
*
! * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
*/
/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
/* All Rights Reserved */
*** 380,389 ****
--- 380,393 ----
struct sockaddr *ca;
char *name = NULL;
dvap = NULL;
+ /* Take an extra hold here in case of 'exi' switching */
+ if (exi != NULL)
+ exi_hold(exi);
+
/*
* Allow lookups from the root - the default
* location of the public filehandle.
*/
if (exi != NULL && (exi->exi_export.ex_flags & EX_PUBLIC)) {
*** 431,442 ****
if (name == NULL) {
resp->status = NFS3ERR_ACCES;
goto out1;
}
- exi_hold(exi);
-
/*
* If the public filehandle is used then allow
* a multi-component lookup
*/
if (PUBLIC_FH3(&args->what.dir)) {
--- 435,444 ----
*** 547,568 ****
VN_RELE(dvp);
return;
out:
- /*
- * The passed argument exportinfo is released by the
- * caller, common_dispatch
- */
- exi_rele(exi);
-
if (curthread->t_flag & T_WOULDBLOCK) {
curthread->t_flag &= ~T_WOULDBLOCK;
resp->status = NFS3ERR_JUKEBOX;
} else
resp->status = puterrno3(error);
out1:
DTRACE_NFSV3_4(op__lookup__done, struct svc_req *, req,
cred_t *, cr, vnode_t *, dvp, LOOKUP3res *, resp);
if (dvp != NULL)
VN_RELE(dvp);
--- 549,567 ----
VN_RELE(dvp);
return;
out:
if (curthread->t_flag & T_WOULDBLOCK) {
curthread->t_flag &= ~T_WOULDBLOCK;
resp->status = NFS3ERR_JUKEBOX;
} else
resp->status = puterrno3(error);
out1:
+ if (exi != NULL)
+ exi_rele(exi);
+
DTRACE_NFSV3_4(op__lookup__done, struct svc_req *, req,
cred_t *, cr, vnode_t *, dvp, LOOKUP3res *, resp);
if (dvp != NULL)
VN_RELE(dvp);