usr/src/uts/common/fs/nfs/nfs_server.c
changeset 13985 ad441dd34478
parent 13814 829c00a55a37
child 14028 bcbb822da4dd
equal deleted inserted replaced
13984:dc0c7baefe32 13985:ad441dd34478
    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 			}
  2812 	}
  2811 	}
  2813 
  2812 
  2814 publicfh_done:
  2813 publicfh_done:
  2815 	if (mc_dvp)
  2814 	if (mc_dvp)
  2816 		VN_RELE(mc_dvp);
  2815 		VN_RELE(mc_dvp);
  2817 
       
  2818 	if (error && *exi != NULL)
       
  2819 		exi_rele(*exi);
       
  2820 
  2816 
  2821 	return (error);
  2817 	return (error);
  2822 }
  2818 }
  2823 
  2819 
  2824 /*
  2820 /*
  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