19 * CDDL HEADER END |
19 * CDDL HEADER END |
20 */ |
20 */ |
21 /* |
21 /* |
22 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. |
22 * Copyright (c) 1990, 2010, Oracle and/or its affiliates. All rights reserved. |
23 * Copyright (c) 2011 Bayard G. Bell. All rights reserved. |
23 * Copyright (c) 2011 Bayard G. Bell. All rights reserved. |
24 * Copyright 2012 Nexenta Systems, Inc. All rights reserved. |
|
25 */ |
24 */ |
26 |
25 |
27 /* |
26 /* |
28 * Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T. |
27 * Copyright (c) 1983,1984,1985,1986,1987,1988,1989 AT&T. |
29 * All rights reserved. |
28 * All rights reserved. |
2799 * for odd case where a directory is provided as index |
2798 * for odd case where a directory is provided as index |
2800 * option argument and leads us to another filesystem |
2799 * option argument and leads us to another filesystem |
2801 */ |
2800 */ |
2802 |
2801 |
2803 /* Release the reference on the old exi value */ |
2802 /* Release the reference on the old exi value */ |
|
2803 ASSERT(*exi != NULL); |
2804 exi_rele(*exi); |
2804 exi_rele(*exi); |
2805 *exi = NULL; |
|
2806 |
2805 |
2807 if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) { |
2806 if (error = nfs_check_vpexi(mc_dvp, *vpp, kcred, exi)) { |
2808 VN_RELE(*vpp); |
2807 VN_RELE(*vpp); |
2809 goto publicfh_done; |
2808 goto publicfh_done; |
2810 } |
2809 } |
2961 |
2957 |
2962 |
2958 |
2963 /* |
2959 /* |
2964 * Get the export information for the lookup vnode, and verify its |
2960 * Get the export information for the lookup vnode, and verify its |
2965 * useable. |
2961 * useable. |
2966 * |
|
2967 * Set @exip only in success |
|
2968 */ |
2962 */ |
2969 int |
2963 int |
2970 nfs_check_vpexi(vnode_t *mc_dvp, vnode_t *vp, cred_t *cr, |
2964 nfs_check_vpexi(vnode_t *mc_dvp, vnode_t *vp, cred_t *cr, |
2971 struct exportinfo **exip) |
2965 struct exportinfo **exi) |
2972 { |
2966 { |
2973 int walk; |
2967 int walk; |
2974 int error = 0; |
2968 int error = 0; |
2975 struct exportinfo *exi; |
2969 |
2976 |
2970 *exi = nfs_vptoexi(mc_dvp, vp, cr, &walk, NULL, FALSE); |
2977 exi = nfs_vptoexi(mc_dvp, vp, cr, &walk, NULL, FALSE); |
2971 if (*exi == NULL) |
2978 if (exi == NULL) |
|
2979 error = EACCES; |
2972 error = EACCES; |
2980 else { |
2973 else { |
2981 /* |
2974 /* |
2982 * If nosub is set for this export then |
2975 * If nosub is set for this export then |
2983 * a lookup relative to the public fh |
2976 * a lookup relative to the public fh |
2984 * must not terminate below the |
2977 * must not terminate below the |
2985 * exported directory. |
2978 * exported directory. |
2986 */ |
2979 */ |
2987 if (exi->exi_export.ex_flags & EX_NOSUB && walk > 0) { |
2980 if ((*exi)->exi_export.ex_flags & EX_NOSUB && walk > 0) |
2988 error = EACCES; |
2981 error = EACCES; |
2989 exi_rele(exi); |
2982 } |
2990 } |
2983 |
2991 } |
|
2992 if (error == 0) |
|
2993 *exip = exi; |
|
2994 return (error); |
2984 return (error); |
2995 } |
2985 } |
2996 |
2986 |
2997 /* |
2987 /* |
2998 * Do the main work of handling HA-NFSv4 Resource Group failover on |
2988 * Do the main work of handling HA-NFSv4 Resource Group failover on |