usr/src/uts/common/fs/nfs/nfs4_srv_attr.c
author jpk
Fri, 24 Mar 2006 12:29:20 -0800
changeset 1676 37f4a3e2bd99
parent 1232 1a9b1651d839
child 2058 40d3788a5679
permissions -rw-r--r--
PSARC/2002/762 Layered Trusted Solaris PSARC/2005/060 TSNET: Trusted Networking with Security Labels PSARC/2005/259 Layered Trusted Solaris Label Interfaces PSARC/2005/573 Solaris Trusted Extensions for Printing PSARC/2005/691 Trusted Extensions for Device Allocation PSARC/2005/723 Solaris Trusted Extensions Filesystem Labeling PSARC/2006/009 Labeled Auditing PSARC/2006/155 Trusted Extensions RBAC Changes PSARC/2006/191 is_system_labeled 6293271 Zone processes should use zone_kcred instead of kcred 6394554 integrate Solaris Trusted Extensions
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 * Common Development and Distribution License, Version 1.0 only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 * (the "License").  You may not use this file except in compliance
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 * with the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    22
/*
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
    23
 * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
#include <sys/systm.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#include <sys/cmn_err.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
#include <nfs/nfs.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <nfs/export.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <nfs/nfs4.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
void	rfs4_init_compound_state(struct compound_state *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
bitmap4 rfs4_supported_attrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
int MSG_PRT_DEBUG = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
/* If building with DEBUG enabled, enable mandattr tuneable by default */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
#ifdef DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#ifndef RFS4_SUPPORT_MANDATTR_ONLY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
#define	RFS4_SUPPORT_MANDATTR_ONLY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
 * If building with mandattr only code, disable it by default.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
 * To enable, set rfs4_mandattr_only in /etc/system and reboot.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
 * When building without mandattr ifdef, the compiler should
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
 * optimize away the the comparisons because RFS4_MANDATTR_ONLY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
 * is defined to be 0.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
#ifdef RFS4_SUPPORT_MANDATTR_ONLY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#define	NFS4_LAST_MANDATTR FATTR4_RDATTR_ERROR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#define	RFS4_MANDATTR_ONLY rfs4_mandattr_only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
int rfs4_mandattr_only = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
#define	RFS4_MANDATTR_ONLY 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
static void rfs4_ntov_init(void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
static int rfs4_fattr4_supported_attrs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
static int rfs4_fattr4_type();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
static int rfs4_fattr4_fh_expire_type();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
static int rfs4_fattr4_change();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
static int rfs4_fattr4_size();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
static int rfs4_fattr4_link_support();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
static int rfs4_fattr4_symlink_support();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
static int rfs4_fattr4_named_attr();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
static int rfs4_fattr4_fsid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
static int rfs4_fattr4_unique_handles();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
static int rfs4_fattr4_lease_time();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
static int rfs4_fattr4_rdattr_error();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
static int rfs4_fattr4_acl();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
static int rfs4_fattr4_aclsupport();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
static int rfs4_fattr4_archive();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
static int rfs4_fattr4_cansettime();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
static int rfs4_fattr4_case_insensitive();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
static int rfs4_fattr4_case_preserving();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
static int rfs4_fattr4_chown_restricted();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static int rfs4_fattr4_filehandle();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static int rfs4_fattr4_fileid();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
static int rfs4_fattr4_files_avail();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static int rfs4_fattr4_files_free();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
static int rfs4_fattr4_files_total();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
static int rfs4_fattr4_fs_locations();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
static int rfs4_fattr4_hidden();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
static int rfs4_fattr4_homogeneous();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
static int rfs4_fattr4_maxfilesize();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
static int rfs4_fattr4_maxlink();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
static int rfs4_fattr4_maxname();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
static int rfs4_fattr4_maxread();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
static int rfs4_fattr4_maxwrite();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
static int rfs4_fattr4_mimetype();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
static int rfs4_fattr4_mode();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
static int rfs4_fattr4_no_trunc();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
static int rfs4_fattr4_numlinks();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
static int rfs4_fattr4_owner();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
static int rfs4_fattr4_owner_group();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
static int rfs4_fattr4_quota_avail_hard();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
static int rfs4_fattr4_quota_avail_soft();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
static int rfs4_fattr4_quota_used();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
static int rfs4_fattr4_rawdev();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
static int rfs4_fattr4_space_avail();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
static int rfs4_fattr4_space_free();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
static int rfs4_fattr4_space_total();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
static int rfs4_fattr4_space_used();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
static int rfs4_fattr4_system();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
static int rfs4_fattr4_time_access();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
static int rfs4_fattr4_time_access_set();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
static int rfs4_fattr4_time_backup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
static int rfs4_fattr4_time_create();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
static int rfs4_fattr4_time_delta();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
static int rfs4_fattr4_time_metadata();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
static int rfs4_fattr4_time_modify();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
static int rfs4_fattr4_time_modify_set();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 * Initialize the supported attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
rfs4_attr_init()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	struct nfs4_svgetit_arg sarg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
	struct compound_state cs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	struct statvfs64 sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
	rfs4_init_compound_state(&cs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	cs.vp = rootvp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	cs.fh.nfs_fh4_val = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	cs.cr = kcred;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	 * Get all the supported attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
	sarg.op = NFS4ATTR_SUPPORTED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
	sarg.cs = &cs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
	sarg.vap->va_mask = AT_ALL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
	sarg.sbp = &sb;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
	sarg.flag = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
	sarg.rdattr_error = NFS4_OK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
	sarg.rdattr_error_req = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	rfs4_ntov_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
	rfs4_supported_attrs = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	for (i = 0; i < NFS4_MAXNUM_ATTRS; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
#ifdef RFS4_SUPPORT_MANDATTR_ONLY
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   153
		if (rfs4_mandattr_only == TRUE && i > NFS4_LAST_MANDATTR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
		if ((*nfs4_ntov_map[i].sv_getit)(NFS4ATTR_SUPPORTED,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
		    &sarg, NULL) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158
			rfs4_supported_attrs |= nfs4_ntov_map[i].fbit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
 * The following rfs4_fattr4_* functions convert between the fattr4
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
 * arguments/attributes and the system (e.g. vattr) values. The following
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
 * commands are currently in use:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
 * NFS4ATTR_SUPPORTED: checks if the attribute in question is supported:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
 *	sarg.op = SUPPORTED - all supported attrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
 *	sarg.op = GETIT - only supported readable attrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
 *	sarg.op = SETIT - only supported writable attrs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
 * NFS4ATTR_GETIT: getattr type conversion - convert system values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
 * (e.g. vattr struct) to fattr4 type values to be returned to the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 * user - usually in response to nfsv4 getattr request.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
 * NFS4ATTR_SETIT: convert fattr4 type values to system values to use by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
 * setattr. Allows only read/write and write attributes,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
 * even if not supported by the filesystem. Note that ufs only allows setattr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
 * of owner/group, mode, size, atime/mtime.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
 * NFS4ATTR_VERIT: convert fattr4 type values to system values to use by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
 * verify/nverify. Implemented to allow
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
 * almost everything that can be returned by getattr into known structs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
 * (like vfsstat64 or vattr_t), that is, both read only and read/write attrs.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
 * The function will return -1 if it found that the arguments don't match.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
 * This applies to system-wide values that don't require a VOP_GETATTR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
 * or other further checks to verify. It will return no error if they
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
 * either match or were retrieved successfully for later checking.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
 * NFS4ATTR_FREEIT: free up any space allocated by either of the above.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
 * The sargp->op should be either NFS4ATTR_GETIT or NFS4ATTR_SETIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
 * to indicate which op was used to allocate the space.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
 * XXX Note: these functions are currently used by the server only. A
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
 * XXX different method of conversion is used on the client side.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
 * XXX Eventually combining the two (possibly by adding NFS4ATTR_CLNT_GETIT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
 * XXX and SETIT) may be a cleaner approach.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
 * Mandatory attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
rfs4_fattr4_supported_attrs(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
		na->supported_attrs = rfs4_supported_attrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		 * Compare the input bitmap to the server's bitmap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
		if (na->supported_attrs != rfs4_supported_attrs) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
 * Translate vnode vtype to nfsv4_ftype.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
static nfs_ftype4 vt_to_nf4[] = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
	0, NF4REG, NF4DIR, NF4BLK, NF4CHR, NF4LNK, NF4FIFO, 0, 0, NF4SOCK, 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
rfs4_fattr4_type(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
	int		error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_TYPE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
		ASSERT(sarg->vap->va_mask & AT_TYPE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		 * if xattr flag not set, use v4_to_nf4 mapping;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		 * otherwise verify xattr flag is in sync with va_type
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		 * and set xattr types.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
		if (! (sarg->xattr & (FH4_NAMEDATTR | FH4_ATTRDIR)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
			na->type = vt_to_nf4[sarg->vap->va_type];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
		else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
			 * FH4 flag was set.  Dir type maps to attrdir,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
			 * and all other types map to namedattr.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
			if (sarg->vap->va_type == VDIR)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
				na->type = NF4ATTRDIR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
				na->type = NF4NAMEDATTR;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
		 * Compare the input type to the object type on server
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
		ASSERT(sarg->vap->va_mask & AT_TYPE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
		if (sarg->vap->va_type != nf4_to_vt[na->type])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
fattr4_get_fh_expire_type(struct exportinfo *exi, uint32_t *fh_expire_typep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
#ifdef	VOLATILE_FH_TEST
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	int	ex_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
	if (exi == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		return (ESTALE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
	ex_flags = exi->exi_export.ex_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
	if ((ex_flags & (EX_VOLFH | EX_VOLRNM | EX_VOLMIG | EX_NOEXPOPEN))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
		== 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
		*fh_expire_typep = FH4_PERSISTENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	*fh_expire_typep = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
	if (ex_flags & EX_NOEXPOPEN) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
		/* file handles should not expire with open - not used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
		*fh_expire_typep = FH4_NOEXPIRE_WITH_OPEN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
	if (ex_flags & EX_VOLFH) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
		 * file handles may expire any time - on share here.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
		 * If volatile any, no need to check other flags.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
		*fh_expire_typep |= FH4_VOLATILE_ANY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	if (ex_flags & EX_VOLRNM) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
		/* file handles may expire on rename */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
		*fh_expire_typep |= FH4_VOL_RENAME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
	if (ex_flags & EX_VOLMIG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
		/* file handles may expire on migration - not used */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
		*fh_expire_typep |= FH4_VOL_MIGRATION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
#else	/* not VOLATILE_FH_TEST */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
	*fh_expire_typep = FH4_PERSISTENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
#endif	/* VOLATILE_FH_TEST */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
 * At this point the only volatile filehandles we allow (for test purposes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
 * only) are either fh's that expire when the filesystem is shared (reshared),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
 * fh's that expire on a rename and persistent ones.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
rfs4_fattr4_fh_expire_type(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	uint32_t fh_expire_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
		error = fattr4_get_fh_expire_type(sarg->cs->exi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
				&na->fh_expire_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
		error = fattr4_get_fh_expire_type(sarg->cs->exi,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
				&fh_expire_type);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
		if (!error && (na->fh_expire_type != fh_expire_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
fattr4_get_change(struct nfs4_svgetit_arg *sarg, fattr4_change *changep)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	vattr_t vap2[1], *vap = sarg->vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	struct compound_state *cs = sarg->cs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
	vnode_t *vp = cs->vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	nfsstat4 status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	if ((vap->va_mask & AT_CTIME) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
		if (sarg->rdattr_error && (vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
			return (-1);	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
		ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
		vap = vap2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
		vap->va_mask = AT_CTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
		status = rfs4_vop_getattr(vp, vap, 0, cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
		if (status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
			return (geterrno4(status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
	NFS4_SET_FATTR4_CHANGE(*changep, vap->va_ctime)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
rfs4_fattr4_change(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
	fattr4_change change;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
	uint_t mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
	vattr_t *vap = sarg->vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
		error = fattr4_get_change(sarg, &na->change);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
		mask = vap->va_mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
		vap->va_mask &= ~AT_CTIME;	/* force a VOP_GETATTR */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		error = fattr4_get_change(sarg, &change);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		vap->va_mask = mask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		if (!error && (na->change != change))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
			error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
rfs4_fattr4_size(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_SIZE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
		ASSERT(sarg->vap->va_mask & AT_SIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
		na->size = sarg->vap->va_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
		ASSERT(sarg->vap->va_mask & AT_SIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
		sarg->vap->va_size = na->size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
		ASSERT(sarg->vap->va_mask & AT_SIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
		if (sarg->vap->va_size != na->size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
 * XXX - need VOP extension to ask file system (e.g. pcfs) if it supports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
 * hard links.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
rfs4_fattr4_link_support(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
		na->link_support = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
		if (!na->link_support)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
 * XXX - need VOP extension to ask file system (e.g. pcfs) if it supports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
 * sym links.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
rfs4_fattr4_symlink_support(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
		na->symlink_support = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
		if (!na->symlink_support)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
rfs4_fattr4_named_attr(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
	ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		if (sarg->rdattr_error && (sarg->cs->vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
		 * Solaris xattr model requires that VFS_XATTR is set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		 * in file systems enabled for xattr.  If VFS_XATTR
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		 * not set, no need to call pathconf.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
		if (sarg->cs->vp->v_vfsp->vfs_flag & VFS_XATTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
			error = VOP_PATHCONF(sarg->cs->vp, _PC_XATTR_EXISTS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
					&val, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
			val = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
		na->named_attr = (val ? TRUE : FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
		if (sarg->cs->vp->v_vfsp->vfs_flag & VFS_XATTR) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
			error = VOP_PATHCONF(sarg->cs->vp, _PC_XATTR_EXISTS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
					&val, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
			if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
		} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
			val = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
		if (na->named_attr != (val ? TRUE : FALSE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
rfs4_fattr4_fsid(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
	int *pmaj = (int *)&na->fsid.major;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
	 * fsid_t is 64bits so it fits completely in fattr4_fsid.major.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
	 * fattr4_fsid.minor is always set to 0 since it isn't needed (yet).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
		if (sarg->cs->exi->exi_volatile_dev) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
			pmaj[0] = sarg->cs->exi->exi_fsid.val[0];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
			pmaj[1] = sarg->cs->exi->exi_fsid.val[1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
			na->fsid.minor = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
			na->fsid.major = getmajor(sarg->vap->va_fsid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
			na->fsid.minor = getminor(sarg->vap->va_fsid);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   635
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   636
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   638
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
		if (sarg->cs->exi->exi_volatile_dev) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
			if (pmaj[0] != sarg->cs->exi->exi_fsid.val[0] ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
			    pmaj[1] != sarg->cs->exi->exi_fsid.val[1] ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
			    na->fsid.minor != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
				error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
			if (na->fsid.major != getmajor(sarg->vap->va_fsid) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
			    na->fsid.minor != getminor(sarg->vap->va_fsid))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
				error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
rfs4_fattr4_unique_handles(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
	 * XXX
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	 * For now, we can't support this. Problem of /export, beinging
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	 * a file system, /export/a and /export/b shared separately,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	 * and /export/a/l and /export/b/l are ahrd links of each other.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
		na->unique_handles = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
		if (na->unique_handles)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
rfs4_fattr4_lease_time(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
		na->lease_time = rfs4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
		if (na->lease_time != rfs4_lease_time)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
rfs4_fattr4_rdattr_error(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735
		if ((sarg->op == NFS4ATTR_SETIT) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
			(sarg->op == NFS4ATTR_VERIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
		ASSERT(sarg->rdattr_error_req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
		na->rdattr_error = sarg->rdattr_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   756
/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   757
 * Server side compare of a filehandle from the wire to a native
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   758
 * server filehandle.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   759
 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   760
static int
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   761
rfs4fhcmp(nfs_fh4 *wirefh, nfs_fh4 *srvfh)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   762
{
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   763
	nfs_fh4_fmt_t fh;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   764
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   765
	ASSERT(IS_P2ALIGNED(wirefh->nfs_fh4_val, sizeof (uint32_t)));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   766
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   767
	bzero(&fh, sizeof (nfs_fh4_fmt_t));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   768
	if (!xdr_inline_decode_nfs_fh4((uint32_t *)wirefh->nfs_fh4_val, &fh,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   769
	    wirefh->nfs_fh4_len))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   770
		return (1);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   771
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   772
	return (bcmp(srvfh->nfs_fh4_val, &fh, srvfh->nfs_fh4_len));
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   773
}
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   774
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
rfs4_fattr4_filehandle(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
	nfs_fh4 *fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
		if (sarg->op == NFS4ATTR_SETIT)
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   785
			return (EINVAL);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   786
		return (0);	/* this attr is supported */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
		 * If sarg->cs->fh is all zeros then should makefh a new
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
		 * one, otherwise, copy that one over.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
		fh = &sarg->cs->fh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
		if (sarg->cs->fh.nfs_fh4_len == 0) {
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   794
			if (sarg->rdattr_error && (sarg->cs->vp == NULL))
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   795
				return (-1);	/* okay if rdattr_error */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
			ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
			na->filehandle.nfs_fh4_val =
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   798
			    kmem_alloc(NFS_FH4_LEN, KM_SLEEP);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   799
			return (makefh4(&na->filehandle, sarg->cs->vp,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   800
			    sarg->cs->exi));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
		}
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   802
		na->filehandle.nfs_fh4_val =
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   803
		    kmem_alloc(fh->nfs_fh4_len, KM_SLEEP);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   804
		nfs_fh4_copy(fh, &na->filehandle);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   805
		return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
		 */
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   810
		return (EINVAL);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
	case NFS4ATTR_VERIT:
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   812
		/*
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   813
		 * A verify of a filehandle will have the client sending
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   814
		 * the raw format which needs to be compared to the
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   815
		 * native format.
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   816
		 */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   817
		if (rfs4fhcmp(&na->filehandle, &sarg->cs->fh) == 1)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   818
			return (-1);	/* no match */
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   819
		return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
	case NFS4ATTR_FREEIT:
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   821
		if (sarg->op != NFS4ATTR_GETIT)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   822
			return (0);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   823
		if (na->filehandle.nfs_fh4_val == NULL)
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   824
			return (0);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   825
		kmem_free(na->filehandle.nfs_fh4_val,
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   826
		    na->filehandle.nfs_fh4_len);
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   827
		na->filehandle.nfs_fh4_val = NULL;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   828
		na->filehandle.nfs_fh4_len = 0;
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   829
		return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
	}
1232
1a9b1651d839 4799697 nfs messages could be more useful
robinson
parents: 789
diff changeset
   831
	return (0);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835
 * Recommended attributes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
rfs4_fattr4_acl(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
	vsecattr_t vs_native, vs_ace4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
	ulong_t whichacl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
	nfsstat4 status;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
	vattr_t va, *vap = sarg->vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
	vnode_t *vp = sarg->cs->vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
		if (sarg->rdattr_error && (vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
		ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
		bzero(&vs_native, sizeof (vs_native));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
		/* see which ACLs fs supports */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
		error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &whichacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
		    sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
		if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
			 * If we got an error, then the filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
			 * likely does not understand the _PC_ACL_ENABLED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
			 * pathconf.  In this case, we fall back to trying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
			 * POSIX-draft (aka UFS-style) ACLs, since that's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
			 * the behavior used by earlier version of NFS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
			whichacl = _ACL_ACLENT_ENABLED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
		if (!(whichacl & (_ACL_ACE_ENABLED | _ACL_ACLENT_ENABLED))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
			 * If the file system supports neither ACE nor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
			 * ACLENT ACLs we will fall back to UFS-style ACLs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
			 * like we did above if there was an error upon
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
			 * calling VOP_PATHCONF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
			 * ACE and ACLENT type ACLs are the only interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
			 * supported thus far.  If any other bits are set on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
			 * 'whichacl' upon return from VOP_PATHCONF, we will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
			 * ignore them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
			whichacl = _ACL_ACLENT_ENABLED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		if (whichacl & _ACL_ACE_ENABLED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
			vs_native.vsa_mask = VSA_ACE | VSA_ACECNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
		else if (whichacl & _ACL_ACLENT_ENABLED)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
			vs_native.vsa_mask = VSA_ACL | VSA_ACLCNT |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
			    VSA_DFACL | VSA_DFACLCNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
		if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
		/* get the ACL, and translate it into nfsace4 style */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
		error = VOP_GETSECATTR(vp, &vs_native,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
		    0, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
		if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
		if (whichacl & _ACL_ACE_ENABLED) {
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   910
			error = vs_acet_to_ace4(&vs_native, &vs_ace4, TRUE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
			vs_acet_destroy(&vs_native);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
			error = vs_aent_to_ace4(&vs_native, &vs_ace4,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
			    vp->v_type == VDIR, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
			vs_aent_destroy(&vs_native);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
		if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
		if (cmd == NFS4ATTR_GETIT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
			na->acl.fattr4_acl_len = vs_ace4.vsa_aclcnt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
			/* see case NFS4ATTR_FREEIT for this being freed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
			na->acl.fattr4_acl_val = vs_ace4.vsa_aclentp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
			if (na->acl.fattr4_acl_len != vs_ace4.vsa_aclcnt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
				error = -1; /* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
			else if (ln_ace4_cmp(na->acl.fattr4_acl_val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
			    vs_ace4.vsa_aclentp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
			    vs_ace4.vsa_aclcnt) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
				error = -1; /* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
		if (sarg->rdattr_error && (vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
			return (-1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
		ASSERT(vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
		/* prepare vs_ace4 from fattr4 data */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
		bzero(&vs_ace4, sizeof (vs_ace4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
		vs_ace4.vsa_mask = VSA_ACE | VSA_ACECNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
		vs_ace4.vsa_aclcnt = na->acl.fattr4_acl_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
		vs_ace4.vsa_aclentp = na->acl.fattr4_acl_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
		/* make sure we have correct owner/group */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
		if ((vap->va_mask & (AT_UID | AT_GID)) !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
		    (AT_UID | AT_GID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
			vap = &va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
			vap->va_mask = AT_UID | AT_GID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
			status = rfs4_vop_getattr(vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   953
			    vap, 0, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
			if (status != NFS4_OK)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
				return (geterrno4(status));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
		/* see which ACLs the fs supports */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   959
		error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &whichacl,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   960
		    sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
		if (error != 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
			 * If we got an error, then the filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
			 * likely does not understand the _PC_ACL_ENABLED
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
			 * pathconf.  In this case, we fall back to trying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
			 * POSIX-draft (aka UFS-style) ACLs, since that's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
			 * the behavior used by earlier version of NFS.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   969
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   970
			whichacl = _ACL_ACLENT_ENABLED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   971
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   972
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
		if (!(whichacl & (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED))) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   974
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
			 * If the file system supports neither ACE nor
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
			 * ACLENT ACLs we will fall back to UFS-style ACLs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
			 * like we did above if there was an error upon
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   978
			 * calling VOP_PATHCONF.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   979
			 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   980
			 * ACE and ACLENT type ACLs are the only interfaces
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   981
			 * supported thus far.  If any other bits are set on
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   982
			 * 'whichacl' upon return from VOP_PATHCONF, we will
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   983
			 * ignore them.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   985
			whichacl = _ACL_ACLENT_ENABLED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
		if (whichacl & _ACL_ACE_ENABLED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
			error = vs_ace4_to_acet(&vs_ace4, &vs_native,
789
b348f31ed315 PSARC 2002/240 ZFS
ahrens
parents: 0
diff changeset
   990
			    vap->va_uid, vap->va_gid, TRUE, FALSE);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
			if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
			(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
			error = VOP_SETSECATTR(vp, &vs_native,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
			    0, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
			VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
			vs_acet_destroy(&vs_native);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
		} else if (whichacl & _ACL_ACLENT_ENABLED) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
			error = vs_ace4_to_aent(&vs_ace4, &vs_native,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1000
			    vap->va_uid, vap->va_gid, vp->v_type == VDIR, TRUE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1001
			    FALSE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1002
			if (error != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1003
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1004
			(void) VOP_RWLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1005
			error = VOP_SETSECATTR(vp, &vs_native,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1006
			    0, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1007
			VOP_RWUNLOCK(vp, V_WRITELOCK_TRUE, NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1008
			vs_aent_destroy(&vs_native);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1009
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1010
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1011
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1012
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1013
		if (sarg->op == NFS4ATTR_GETIT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1014
			vs_ace4.vsa_mask = VSA_ACE | VSA_ACECNT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1015
			vs_ace4.vsa_aclcnt = na->acl.fattr4_acl_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1016
			vs_ace4.vsa_aclentp = na->acl.fattr4_acl_val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1017
			vs_ace4_destroy(&vs_ace4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1018
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1019
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1020
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1021
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1022
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1023
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1025
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1026
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1027
rfs4_fattr4_aclsupport(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1028
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1029
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1030
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1032
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1033
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1035
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1036
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1037
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1038
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1039
		break;	/* supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1040
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1041
		na->aclsupport = ACL4_SUPPORT_ALLOW_ACL |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1042
		    ACL4_SUPPORT_DENY_ACL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1043
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1044
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
		if (na->aclsupport != (ACL4_SUPPORT_ALLOW_ACL |
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
		    ACL4_SUPPORT_DENY_ACL))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1050
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1055
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1056
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1057
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
rfs4_fattr4_archive(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
rfs4_fattr4_cansettime(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1077
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1078
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1079
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1080
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1081
		na->cansettime = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
		if (!na->cansettime)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1091
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1092
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1100
 * XXX - need VOP extension to ask file system (e.g. pcfs) if it supports
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
 * case insenstive.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105
rfs4_fattr4_case_insensitive(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
		na->case_insensitive = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
		if (!na->case_insensitive)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1129
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
rfs4_fattr4_case_preserving(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
		na->case_preserving = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1158
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
		if (!na->case_preserving)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
/* fattr4_chown_restricted should reall be fattr4_chown_allowed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
rfs4_fattr4_chown_restricted(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
	ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
		if (sarg->rdattr_error && (sarg->cs->vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
		error = VOP_PATHCONF(sarg->cs->vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
				_PC_CHOWN_RESTRICTED, &val, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
		na->chown_restricted = (val == 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
		error = VOP_PATHCONF(sarg->cs->vp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
				_PC_CHOWN_RESTRICTED, &val, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
		if (na->chown_restricted != (val == 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
rfs4_fattr4_fileid(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_NODEID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1242
		ASSERT(sarg->vap->va_mask & AT_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1243
		na->fileid = sarg->vap->va_nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1244
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1245
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
		ASSERT(sarg->vap->va_mask & AT_NODEID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
		if (sarg->vap->va_nodeid != na->fileid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1262
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1263
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1264
rfs4_get_mntdfileid(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1265
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1266
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1267
	vattr_t	*vap, va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
	vnode_t *stubvp = NULL, *vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
	vp = sarg->cs->vp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
	sarg->mntdfid_set = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
	/* VROOT object, must untraverse */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
	if (vp->v_flag & VROOT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
		/* extra hold for vp since untraverse might rele */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
		VN_HOLD(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
		stubvp = untraverse(vp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
		 * If vp/stubvp are same, we must be at system
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
		 * root because untraverse returned same vp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
		 * for a VROOT object.  sarg->vap was setup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
		 * before we got here, so there's no need to do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
		 * another getattr -- just use the one in sarg.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
		if (VN_CMP(vp, stubvp)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
			ASSERT(VN_CMP(vp, rootdir));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
			vap = sarg->vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
			va.va_mask = AT_NODEID;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
			vap = &va;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
			error = rfs4_vop_getattr(stubvp, vap, 0, sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
		 * Done with stub, time to rele.  If vp and stubvp
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
		 * were the same, then we need to rele either vp or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
		 * stubvp.  If they weren't the same, then untraverse()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
		 * already took case of the extra hold on vp, and only
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
		 * the stub needs to be rele'd.  Both cases are handled
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
		 * by unconditionally rele'ing the stub.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
		VN_RELE(stubvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
	} else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
		vap = sarg->vap;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
	 * At this point, vap should contain "correct" AT_NODEID --
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
	 * (for V_ROOT case, nodeid of stub, for non-VROOT case,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
	 * nodeid of vp).  If error or AT_NODEID not available, then
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
	 * make the obligatory (yet mysterious) rdattr_error
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
	 * check that is so common in the attr code.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
	if (!error && (vap->va_mask & AT_NODEID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
		sarg->mounted_on_fileid = vap->va_nodeid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
		sarg->mntdfid_set = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
	} else if (sarg->rdattr_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
		error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	 * error describes these cases:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
	 *	0 : success
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
	 *	-1: failure due to previous attr processing error (rddir only).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
	 *	* : new attr failure  (if rddir, caller will set rdattr_error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
rfs4_fattr4_mounted_on_fileid(nfs4_attr_cmd_t cmd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
	struct nfs4_svgetit_arg *sarg, union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
		if (! sarg->mntdfid_set)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
			error = rfs4_get_mntdfileid(cmd, sarg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
		if (! error && sarg->mntdfid_set) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
			if (cmd == NFS4ATTR_GETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
				na->mounted_on_fileid = sarg->mounted_on_fileid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
				if (na->mounted_on_fileid !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
				    sarg->mounted_on_fileid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
					error = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
		/* read-only attr */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
rfs4_fattr4_files_avail(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
		if (sarg->rdattr_error && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
		na->files_avail = sarg->sbp->f_favail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
		if (sarg->sbp->f_favail != na->files_avail)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
rfs4_fattr4_files_free(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
		if (sarg->rdattr_error && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
		na->files_free = sarg->sbp->f_ffree;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
		if (sarg->sbp->f_ffree != na->files_free)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
rfs4_fattr4_files_total(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1459
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
		if (sarg->rdattr_error && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
		na->files_total = sarg->sbp->f_files;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
		if (sarg->sbp->f_files != na->files_total)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
rfs4_fattr4_fs_locations(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
rfs4_fattr4_hidden(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
rfs4_fattr4_homogeneous(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
		na->homogeneous = TRUE; /* XXX - need a VOP extension */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
		if (!na->homogeneous)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1534
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1535
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1536
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1537
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1539
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1540
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1541
rfs4_fattr4_maxfilesize(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1542
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1543
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1544
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1545
	ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1546
	fattr4_maxfilesize maxfilesize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1547
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1548
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1550
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1552
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1553
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1554
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1555
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
		if (sarg->rdattr_error && (sarg->cs->vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1560
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1561
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1562
		error = VOP_PATHCONF(sarg->cs->vp, _PC_FILESIZEBITS, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1563
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1564
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1565
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1566
		if (val >= (sizeof (uint64_t) * 8))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1567
			na->maxfilesize = UINT64_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1568
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1569
			na->maxfilesize = ((1LL << val) - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1570
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1571
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1572
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1573
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1574
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1575
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1576
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1577
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1578
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1579
		error = VOP_PATHCONF(sarg->cs->vp, _PC_FILESIZEBITS, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1580
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1581
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1582
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1583
		if (val >= (sizeof (uint64_t) * 8))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
			maxfilesize = UINT64_MAX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
		else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
			maxfilesize = ((1LL << val) - 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
		if (na->maxfilesize != maxfilesize)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
rfs4_fattr4_maxlink(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1599
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1600
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1601
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1602
	ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1610
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
		if (sarg->rdattr_error && (sarg->cs->vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
		error = VOP_PATHCONF(sarg->cs->vp, _PC_LINK_MAX, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1619
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1620
		if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1621
			na->maxlink = val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1622
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1623
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1624
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1625
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1626
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1627
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1628
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1629
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1630
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1631
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1632
		error = VOP_PATHCONF(sarg->cs->vp, _PC_LINK_MAX, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1633
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1634
		if (!error && (na->maxlink != val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1635
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1636
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1637
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1638
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1639
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1640
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1641
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1642
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
rfs4_fattr4_maxname(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
	ulong_t val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1659
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1660
		if (sarg->rdattr_error && (sarg->cs->vp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1662
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1663
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1664
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1665
		error = VOP_PATHCONF(sarg->cs->vp, _PC_NAME_MAX, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1666
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1667
		if (error == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1668
			na->maxname = val;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1669
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1670
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1671
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1672
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1673
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1674
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
		ASSERT(sarg->cs->vp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
		error = VOP_PATHCONF(sarg->cs->vp, _PC_NAME_MAX, &val,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
				sarg->cs->cr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
		if (!error && (na->maxname != val))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1688
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1689
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1690
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1691
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1692
rfs4_fattr4_maxread(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1693
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1694
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1695
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1696
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1697
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
		na->maxread = rfs4_tsize(sarg->cs->req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1709
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1710
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1711
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1712
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1713
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1714
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1715
		if (na->maxread != rfs4_tsize(sarg->cs->req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1716
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
rfs4_fattr4_maxwrite(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
		na->maxwrite = rfs4_tsize(sarg->cs->req);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
		if (na->maxwrite != rfs4_tsize(sarg->cs->req))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
rfs4_fattr4_mimetype(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
rfs4_fattr4_mode(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_MODE)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
		ASSERT(sarg->vap->va_mask & AT_MODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
		na->mode = sarg->vap->va_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
		ASSERT(sarg->vap->va_mask & AT_MODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
		sarg->vap->va_mode = na->mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
		 * If the filesystem is exported with nosuid, then mask off
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
		 * the setuid and setgid bits.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
		if (sarg->cs->vp->v_type == VREG &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
			(sarg->cs->exi->exi_export.ex_flags & EX_NOSUID))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
			sarg->vap->va_mode &= ~(VSUID | VSGID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
		ASSERT(sarg->vap->va_mask & AT_MODE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
		if (sarg->vap->va_mode != na->mode)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
rfs4_fattr4_no_trunc(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
		na->no_trunc = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1830
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
		if (!na->no_trunc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
rfs4_fattr4_numlinks(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_NLINK)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
		ASSERT(sarg->vap->va_mask & AT_NLINK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
		na->numlinks = sarg->vap->va_nlink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
		ASSERT(sarg->vap->va_mask & AT_NLINK);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
		if (sarg->vap->va_nlink != na->numlinks)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
rfs4_fattr4_owner(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
	uid_t	uid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_UID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
		ASSERT(sarg->vap->va_mask & AT_UID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
		 * There are well defined polices for what happens on server-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
		 * side GETATTR when uid to attribute string conversion cannot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
		 * occur. Please refer to nfs4_idmap.c for details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
		error = nfs_idmap_uid_str(sarg->vap->va_uid, &na->owner, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
		switch (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
		case ECONNREFUSED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
			error = NFS4ERR_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
		ASSERT(sarg->vap->va_mask & AT_UID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
		 * There are well defined policies for what happens on server-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
		 * side SETATTR of 'owner' when a "user@domain" mapping cannot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
		 * occur. Please refer to nfs4_idmap.c for details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
		 * Any other errors, such as the mapping not being found by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
		 * nfsmapid(1m), and interrupted clnt_call, etc, will result
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
		 * in NFS4ERR_BADOWNER.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
		 * XXX need to return consistent errors, perhaps all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
		 * server side attribute routines should return NFS4ERR*.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
		error = nfs_idmap_str_uid(&na->owner, &sarg->vap->va_uid, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
		switch (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
		case NFS4_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
		case ENOTSUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
			 * Ignore warning that we are the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
			 * nfsmapid (can't happen on srv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
			MSG_PRT_DEBUG = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
		case ECOMM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
		case ECONNREFUSED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
			if (!MSG_PRT_DEBUG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
				 * printed just once per daemon death,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
				 * inform the user and then stay silent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
				cmn_err(CE_WARN, "!Unable to contact "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
				    "nfsmapid");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
				MSG_PRT_DEBUG = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
			error = NFS4ERR_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
		case EINVAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
			error = NFS4ERR_INVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
			error = NFS4ERR_BADOWNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
		ASSERT(sarg->vap->va_mask & AT_UID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
		error = nfs_idmap_str_uid(&na->owner, &uid, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
		 * Ignore warning that we are the nfsmapid (can't happen on srv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
		if (error == ENOTSUP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		else if (sarg->vap->va_uid != uid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
		if (sarg->op == NFS4ATTR_GETIT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
			if (na->owner.utf8string_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
				UTF8STRING_FREE(na->owner)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
				bzero(&na->owner, sizeof (na->owner));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
rfs4_fattr4_owner_group(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
	gid_t	gid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_GID)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
		ASSERT(sarg->vap->va_mask & AT_GID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
		 * There are well defined polices for what happens on server-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
		 * side GETATTR when gid to attribute string conversion cannot
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
		 * occur. Please refer to nfs4_idmap.c for details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
		error = nfs_idmap_gid_str(sarg->vap->va_gid, &na->owner_group,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
		    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
		switch (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
		case ECONNREFUSED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025
			error = NFS4ERR_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
		ASSERT(sarg->vap->va_mask & AT_GID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
		 * There are well defined policies for what happens on server-
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
		 * side SETATTR of 'owner_group' when a "group@domain" mapping
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
		 * cannot occur. Please refer to nfs4_idmap.c for details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
		 * Any other errors, such as the mapping not being found by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
		 * nfsmapid(1m), and interrupted clnt_call, etc, will result
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
		 * in NFS4ERR_BADOWNER.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
		 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
		 * XXX need to return consistent errors, perhaps all
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
		 * server side attribute routines should return NFS4ERR*.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
		error = nfs_idmap_str_gid(&na->owner_group, &sarg->vap->va_gid,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
		    TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049
		switch (error) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
		case NFS4_OK:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
		case ENOTSUP:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
			/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
			 * Ignore warning that we are the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
			 * nfsmapid (can't happen on srv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
			 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
			MSG_PRT_DEBUG = FALSE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
		case ECOMM:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
		case ECONNREFUSED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
			if (!MSG_PRT_DEBUG) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
				/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
				 * printed just once per daemon death,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
				 * inform the user and then stay silent
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
				 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
				cmn_err(CE_WARN, "!Unable to contact "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
				    "nfsmapid");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
				MSG_PRT_DEBUG = TRUE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
			error = NFS4ERR_DELAY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
		case EINVAL:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
			error = NFS4ERR_INVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
			error = NFS4ERR_BADOWNER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
		ASSERT(sarg->vap->va_mask & AT_GID);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
		error = nfs_idmap_str_gid(&na->owner_group, &gid, TRUE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
		 * Ignore warning that we are the nfsmapid (can't happen on srv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
		if (error == ENOTSUP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
			error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
		else if (sarg->vap->va_gid != gid)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
		if (sarg->op == NFS4ATTR_GETIT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
			if (na->owner_group.utf8string_val) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
				UTF8STRING_FREE(na->owner_group)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
				bzero(&na->owner_group,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
					sizeof (na->owner_group));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
/* XXX - quota attributes should be supportable on Solaris 2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
rfs4_fattr4_quota_avail_hard(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
rfs4_fattr4_quota_avail_soft(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
rfs4_fattr4_quota_used(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
rfs4_fattr4_rawdev(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_RDEV)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
		ASSERT(sarg->vap->va_mask & AT_RDEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
		na->rawdev.specdata1 =  (uint32)getmajor(sarg->vap->va_rdev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
		na->rawdev.specdata2 =  (uint32)getminor(sarg->vap->va_rdev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
		ASSERT(sarg->vap->va_mask & AT_RDEV);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
		if ((na->rawdev.specdata1 !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
			(uint32)getmajor(sarg->vap->va_rdev)) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
		    (na->rawdev.specdata2 !=
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
			(uint32)getminor(sarg->vap->va_rdev)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2178
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2179
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
rfs4_fattr4_space_avail(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2183
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2184
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
		if (sarg->rdattr_error && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
		if (sarg->sbp->f_bavail != (fsblkcnt64_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
			na->space_avail =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
				(fattr4_space_avail) sarg->sbp->f_frsize *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
				(fattr4_space_avail) sarg->sbp->f_bavail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2204
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2205
			na->space_avail =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2206
				(fattr4_space_avail) sarg->sbp->f_bavail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2207
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2208
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2210
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2211
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2214
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
		if (sarg->sbp->f_bavail != na->space_avail)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2227
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2228
rfs4_fattr4_space_free(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2231
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
		if (sarg->rdattr_error && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
		if (sarg->sbp->f_bfree != (fsblkcnt64_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
			na->space_free =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
				(fattr4_space_free) sarg->sbp->f_frsize *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
				(fattr4_space_free) sarg->sbp->f_bfree;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
			na->space_free =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
				(fattr4_space_free) sarg->sbp->f_bfree;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
		if (sarg->sbp->f_bfree != na->space_free)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
rfs4_fattr4_space_total(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
		if (sarg->rdattr_error_req && (sarg->sbp == NULL)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
		if (sarg->sbp->f_blocks != (fsblkcnt64_t)-1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
			na->space_total =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
				(fattr4_space_total) sarg->sbp->f_frsize *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
				(fattr4_space_total) sarg->sbp->f_blocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
			na->space_total =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
				(fattr4_space_total) sarg->sbp->f_blocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
		ASSERT(sarg->sbp != NULL);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
		if (sarg->sbp->f_blocks != na->space_total)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
rfs4_fattr4_space_used(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_NBLOCKS)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
		ASSERT(sarg->vap->va_mask & AT_NBLOCKS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
		na->space_used =  (fattr4_space_used) DEV_BSIZE *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
			(fattr4_space_used) sarg->vap->va_nblocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
		ASSERT(sarg->vap->va_mask & AT_NBLOCKS);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
		if (sarg->vap->va_nblocks != na->space_used)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
rfs4_fattr4_system(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
rfs4_fattr4_time_access(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
	timestruc_t atime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2382
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2383
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2384
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2385
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2386
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_ATIME)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2387
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2388
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2389
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
		ASSERT(sarg->vap->va_mask & AT_ATIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
		error = nfs4_time_vton(&sarg->vap->va_atime, &na->time_access);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
		ASSERT(sarg->vap->va_mask & AT_ATIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
		error = nfs4_time_ntov(&na->time_access, &atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
		if (bcmp(&atime, &sarg->vap->va_atime, sizeof (atime)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
 * XXX - need to support the setting of access time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
rfs4_fattr4_time_access_set(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
	settime4 *ta;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
		if ((sarg->op == NFS4ATTR_GETIT) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
		    (sarg->op == NFS4ATTR_VERIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
		 * write only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
		ASSERT(sarg->vap->va_mask & AT_ATIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
		 * Set access time (by server or by client)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
		ta = &na->time_access_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
		if (ta->set_it == SET_TO_CLIENT_TIME4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
			error = nfs4_time_ntov(&ta->time, &sarg->vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
		} else if (ta->set_it == SET_TO_SERVER_TIME4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
			gethrestime(&sarg->vap->va_atime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
rfs4_fattr4_time_backup(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
rfs4_fattr4_time_create(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
	return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
rfs4_fattr4_time_delta(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
	int error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
		na->time_delta.seconds = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
		na->time_delta.nseconds = 1000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
		 * write only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
		if ((na->time_delta.seconds != 0) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
		    (na->time_delta.nseconds != 1000))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
rfs4_fattr4_time_metadata(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
	timestruc_t ctime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_CTIME)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
		ASSERT(sarg->vap->va_mask & AT_CTIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
		error = nfs4_time_vton(&sarg->vap->va_ctime,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
				&na->time_metadata);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
		ASSERT(sarg->vap->va_mask & AT_CTIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
		error = nfs4_time_ntov(&na->time_metadata, &ctime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
		if (bcmp(&ctime, &sarg->vap->va_ctime, sizeof (ctime)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
rfs4_fattr4_time_modify(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	timestruc_t mtime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
		if (sarg->op == NFS4ATTR_SETIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2574
		if (sarg->rdattr_error && !(sarg->vap->va_mask & AT_MTIME)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
			error = -1;	/* may be okay if rdattr_error */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
		ASSERT(sarg->vap->va_mask & AT_MTIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
		error = nfs4_time_vton(&sarg->vap->va_mtime, &na->time_modify);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
		 * read-only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
		ASSERT(sarg->vap->va_mask & AT_MTIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
		error = nfs4_time_ntov(&na->time_modify, &mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
		if (error)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
		if (bcmp(&mtime, &sarg->vap->va_mtime, sizeof (mtime)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
			error = -1;	/* no match */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
 * XXX - need to add support for setting modify time
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
/* ARGSUSED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
rfs4_fattr4_time_modify_set(nfs4_attr_cmd_t cmd, struct nfs4_svgetit_arg *sarg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	union nfs4_attr_u *na)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	int	error = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
	settime4 *tm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
	if (RFS4_MANDATTR_ONLY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
		return (ENOTSUP);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
	switch (cmd) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
	case NFS4ATTR_SUPPORTED:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2617
		if ((sarg->op == NFS4ATTR_GETIT) ||
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
		    (sarg->op == NFS4ATTR_VERIT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
		break;		/* this attr is supported */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
	case NFS4ATTR_GETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
	case NFS4ATTR_VERIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
		 * write only attr
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
		error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	case NFS4ATTR_SETIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
		ASSERT(sarg->vap->va_mask & AT_MTIME);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
		 * Set modify time (by server or by client)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
		tm = &na->time_modify_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
		if (tm->set_it == SET_TO_CLIENT_TIME4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
			error = nfs4_time_ntov(&tm->time, &sarg->vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
			sarg->flag = ATTR_UTIME;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
		} else if (tm->set_it == SET_TO_SERVER_TIME4) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
			gethrestime(&sarg->vap->va_mtime);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
		} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
			error = EINVAL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
	case NFS4ATTR_FREEIT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
	return (error);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
rfs4_ntov_init(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
	/* index must be same as corresponding FATTR4_* define */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
	nfs4_ntov_map[0].sv_getit = rfs4_fattr4_supported_attrs;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
	nfs4_ntov_map[1].sv_getit = rfs4_fattr4_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	nfs4_ntov_map[2].sv_getit = rfs4_fattr4_fh_expire_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
	nfs4_ntov_map[3].sv_getit = rfs4_fattr4_change;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
	nfs4_ntov_map[4].sv_getit = rfs4_fattr4_size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
	nfs4_ntov_map[5].sv_getit = rfs4_fattr4_link_support;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
	nfs4_ntov_map[6].sv_getit = rfs4_fattr4_symlink_support;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
	nfs4_ntov_map[7].sv_getit = rfs4_fattr4_named_attr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
	nfs4_ntov_map[8].sv_getit = rfs4_fattr4_fsid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
	nfs4_ntov_map[9].sv_getit = rfs4_fattr4_unique_handles;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
	nfs4_ntov_map[10].sv_getit = rfs4_fattr4_lease_time;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
	nfs4_ntov_map[11].sv_getit = rfs4_fattr4_rdattr_error;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
	nfs4_ntov_map[12].sv_getit = rfs4_fattr4_acl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
	nfs4_ntov_map[13].sv_getit = rfs4_fattr4_aclsupport;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
	nfs4_ntov_map[14].sv_getit = rfs4_fattr4_archive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
	nfs4_ntov_map[15].sv_getit = rfs4_fattr4_cansettime;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
	nfs4_ntov_map[16].sv_getit = rfs4_fattr4_case_insensitive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
	nfs4_ntov_map[17].sv_getit = rfs4_fattr4_case_preserving;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
	nfs4_ntov_map[18].sv_getit = rfs4_fattr4_chown_restricted;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
	nfs4_ntov_map[19].sv_getit = rfs4_fattr4_filehandle;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
	nfs4_ntov_map[20].sv_getit = rfs4_fattr4_fileid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
	nfs4_ntov_map[21].sv_getit = rfs4_fattr4_files_avail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
	nfs4_ntov_map[22].sv_getit = rfs4_fattr4_files_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
	nfs4_ntov_map[23].sv_getit = rfs4_fattr4_files_total;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
	nfs4_ntov_map[24].sv_getit = rfs4_fattr4_fs_locations;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
	nfs4_ntov_map[25].sv_getit = rfs4_fattr4_hidden;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
	nfs4_ntov_map[26].sv_getit = rfs4_fattr4_homogeneous;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
	nfs4_ntov_map[27].sv_getit = rfs4_fattr4_maxfilesize;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
	nfs4_ntov_map[28].sv_getit = rfs4_fattr4_maxlink;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
	nfs4_ntov_map[29].sv_getit = rfs4_fattr4_maxname;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
	nfs4_ntov_map[30].sv_getit = rfs4_fattr4_maxread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
	nfs4_ntov_map[31].sv_getit = rfs4_fattr4_maxwrite;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
	nfs4_ntov_map[32].sv_getit = rfs4_fattr4_mimetype;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
	nfs4_ntov_map[33].sv_getit = rfs4_fattr4_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
	nfs4_ntov_map[34].sv_getit = rfs4_fattr4_no_trunc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
	nfs4_ntov_map[35].sv_getit = rfs4_fattr4_numlinks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
	nfs4_ntov_map[36].sv_getit = rfs4_fattr4_owner;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
	nfs4_ntov_map[37].sv_getit = rfs4_fattr4_owner_group;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
	nfs4_ntov_map[38].sv_getit = rfs4_fattr4_quota_avail_hard;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
	nfs4_ntov_map[39].sv_getit = rfs4_fattr4_quota_avail_soft;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
	nfs4_ntov_map[40].sv_getit = rfs4_fattr4_quota_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
	nfs4_ntov_map[41].sv_getit = rfs4_fattr4_rawdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
	nfs4_ntov_map[42].sv_getit = rfs4_fattr4_space_avail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
	nfs4_ntov_map[43].sv_getit = rfs4_fattr4_space_free;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
	nfs4_ntov_map[44].sv_getit = rfs4_fattr4_space_total;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
	nfs4_ntov_map[45].sv_getit = rfs4_fattr4_space_used;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
	nfs4_ntov_map[46].sv_getit = rfs4_fattr4_system;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
	nfs4_ntov_map[47].sv_getit = rfs4_fattr4_time_access;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
	nfs4_ntov_map[48].sv_getit = rfs4_fattr4_time_access_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
	nfs4_ntov_map[49].sv_getit = rfs4_fattr4_time_backup;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
	nfs4_ntov_map[50].sv_getit = rfs4_fattr4_time_create;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
	nfs4_ntov_map[51].sv_getit = rfs4_fattr4_time_delta;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
	nfs4_ntov_map[52].sv_getit = rfs4_fattr4_time_metadata;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
	nfs4_ntov_map[53].sv_getit = rfs4_fattr4_time_modify;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
	nfs4_ntov_map[54].sv_getit = rfs4_fattr4_time_modify_set;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
	nfs4_ntov_map[55].sv_getit = rfs4_fattr4_mounted_on_fileid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710
}