xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_nt_transact_quota.c (revision 148c5f43199ca0b43fc8e3b643aab11cd66ea327)
19fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
29fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * CDDL HEADER START
39fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
49fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The contents of this file are subject to the terms of the
59fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Common Development and Distribution License (the "License").
69fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * You may not use this file except in compliance with the License.
79fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
89fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * or http://www.opensolaris.org/os/licensing.
109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * See the License for the specific language governing permissions
119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and limitations under the License.
129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * When distributing Covered Code, include this CDDL HEADER in each
149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If applicable, add the following below this CDDL HEADER, with the
169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * fields enclosed by brackets "[]" replaced with your own identifying
179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * information: Portions Copyright [yyyy] [name of copyright owner]
189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * CDDL HEADER END
209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
21*148c5f43SAlan Wright 
229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
23*148c5f43SAlan Wright  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
25*148c5f43SAlan Wright 
269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h>
279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h>
289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_share.h>
299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/string.h>
309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <sys/fs/zfs.h>
319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_xdr.h>
329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_door.h>
339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_idmap.h>
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * A user/group quota entry passed over the wire consists of:
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - next offset (uint32_t)
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - length of SID (uint32_t)
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - last modified time (uint64_t)
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - quota used (uint64_t)
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - quota limit (uint64_t)
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - quota threahold (uint64_t)
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * - variable length sid - max = 32 bytes
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB_QUOTA_SIZE_NO_SID is the size of the above, excluding the sid.
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_QUOTA_SIZE_NO_SID \
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	((2 * sizeof (uint32_t)) + (4 * sizeof (uint64_t)))
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_QUOTA_EST_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_EST_SID_SIZE)
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	SMB_QUOTA_MAX_SIZE (SMB_QUOTA_SIZE_NO_SID + SMB_MAX_SID_SIZE)
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_quota_query(smb_quota_query_t *, smb_quota_response_t *);
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_quota_set(smb_quota_set_t *, uint32_t *);
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_init_sids(smb_xa_t *, smb_quota_query_t *,
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_ofile_t *);
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_decode_sids(smb_xa_t *, list_t *);
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_free_sids(smb_quota_query_t *);
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_max_quota(smb_xa_t *, smb_quota_query_t *);
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_decode_quotas(smb_xa_t *, list_t *);
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t smb_quota_encode_quotas(smb_xa_t *, smb_quota_query_t *,
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_quota_response_t *, smb_ofile_t *);
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void smb_quota_free_quotas(list_t *);
629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_nt_transact_query_quota
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This method allows the client to retrieve quota information from
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the server. The result of the call is returned to the client in the
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Data part of the transaction response.
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * On entry, the 'TotalParameterCount' field must be equal to 16, and the
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * client parameter block must be encoded with the following parameters:
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Request                    Description
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * ========================== ==================================
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * WORD fid                   SMB file identifier of the target directory
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * BYTE ReturnSingleEntry     A boolean indicating whether to return
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            a single entry (TRUE) or multiple entries (FALSE).
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * BYTE RestartScan           A boolean indicating whether to continue from
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            the previous request (FALSE) or restart a new
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            sequence (TRUE).
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * DWORD SidListLength        The length, in bytes, of the SidList in the
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            data block or 0 if there is no SidList.
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * DWORD StartSidLength       If SidListLength is 0 (i.e. there is no SidList
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            in the data block), then this is either:
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                 1) the (non-zero) length in bytes of the
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                    StartSid in the parameter buffer, or
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                 2) if 0, there is no StartSid in the
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                    parameter buffer, in which case, all SIDs
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                    are to be enumerated as if they were
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                    passed in the SidList.
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            Otherwise, StartSidLength is ignored.
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * DWORD StartSidOffset       The offset, in bytes, to the StartSid in the
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                            parameter block (if one exists).
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * One of SidListLength and StartSidLength must be 0.
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * An SMB_COM_NT_TRANSACTION response is sent in reply when the request
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is successful.  The 'TotalParameterCount' is set to 4, and the parameter
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * block in the server response contains a 32-bit unsigned integer
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * indicating the length, in bytes, of the returned quota information.
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The 'TotalDataCount' is set to indicate the length of the data buffer,
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and the data buffer contains the following quota information:
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  Data Block Encoding                Description
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ================================== =================================
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ULONG NextEntryOffset;             Offset to start of next entry from
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                     start of this entry, or 0 for the
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                     final entry
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ULONG SidLength;                   Length (bytes) of SID
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_TIME ChangeTime;               Time that the quota was last changed
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaUsed;           Amount of quota (bytes) used by user
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaThreshold;      Quota warning limit (bytes) for user
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaLimit;          The quota limit (bytes) for this user
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  USHORT Sid;                        Search handle
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_nt_transact_query_quota(smb_request_t *sr, smb_xa_t *xa)
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint8_t		single, restart;
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	sidlistlen, startsidlen, startsidoff;
1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_node_t	*tnode;
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_ofile_t	*ofile;
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_query_t request;
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_response_t reply;
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t status = NT_STATUS_SUCCESS;
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_query_t));
1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_quota_response_t));
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) {
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 0, 0);
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (xa->smb_tpscnt != 16) {
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0);
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_mbc_decodef(&xa->req_param_mb, "%wbblll", sr, &sr->smb_fid,
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &single, &restart, &sidlistlen, &startsidlen, &startsidoff)) {
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0);
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((sidlistlen != 0) && (startsidlen != 0)) {
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0);
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbsr_lookup_file(sr);
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ofile = sr->fid_ofile;
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ofile == NULL) {
1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((ofile->f_node == NULL) || (ofile->f_ftype != SMB_FTYPE_DISK)) {
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS,
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERROR_ACCESS_DENIED);
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_release_file(sr);
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tnode = sr->tid_tree->t_snode;
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_node_getmntpath(tnode, request.qq_root_path, MAXPATHLEN) != 0) {
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, ERRDOS,
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERROR_INVALID_PARAMETER);
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_release_file(sr);
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(request.qq_root_path, MAXPATHLEN);
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (sidlistlen != 0)
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST;
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else if (startsidlen != 0)
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request.qq_query_op = SMB_QUOTA_QUERY_STARTSID;
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request.qq_query_op = SMB_QUOTA_QUERY_ALL;
1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_single = single;
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_restart = restart;
1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_max_quota(xa, &request);
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_init_sids(xa, &request, ofile);
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status == NT_STATUS_SUCCESS) {
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_quota_query(&request, &reply) != 0) {
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INTERNAL_ERROR;
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = reply.qr_status;
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (status == NT_STATUS_SUCCESS) {
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				status = smb_quota_encode_quotas(xa,
1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				    &request, &reply, ofile);
1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			xdr_free(smb_quota_response_xdr, (char *)&reply);
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kmem_free(request.qq_root_path, MAXPATHLEN);
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_free_sids(&request);
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status != NT_STATUS_SUCCESS) {
205*148c5f43SAlan Wright 		if (status == NT_STATUS_NO_MORE_ENTRIES) {
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_ofile_set_quota_resume(ofile, NULL);
2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smbsr_warn(sr, status, 0, 0);
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_SUCCESS;
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smbsr_error(sr, status, 0, 0);
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_param_mb, "l", 0);
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbsr_release_file(sr);
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return ((status == NT_STATUS_SUCCESS) ? SDRC_SUCCESS : SDRC_ERROR);
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_nt_transact_set_quota
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This method allows the client to set quota information on the server.
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The result status of the call is returned to the client in the
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * 'status' field of the SMB response header.
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * On entry, the 'TotalParameterCount' field must be equal to 2, and the
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * client parameter block must be encoded with the following parameters:
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  Data Block Encoding                Description
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ================================== =================================
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ULONG NextEntryOffset;             Offset to start of next entry from
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                     start of this entry, or 0 for the
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *                                     final entry
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ULONG SidLength;                   Length (bytes) of SID
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_TIME ChangeTime;               Time that the quota was last changed
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaUsed;           Amount of quota (bytes) used by user
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaThreshold;      Quota warning limit (bytes) for user
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  LARGE_INTEGER QuotaLimit;          The quota limit (bytes) for this user
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  VARIABLE Sid;                      Security identifier of the user
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * An SMB_COM_NT_TRANSACTION response is sent in reply when the request
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is successful.  The 'TotalParameterCount' and the 'TotalDataCount' are set
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * to 0, and the parameter block 'Status' field in the server SMB response
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * header contains a 32-bit unsigned integer indicating the result status
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * (NT_STATUS_SUCCESS if successful).
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Only users with Admin privileges (i.e. of the BUILTIN/Administrators
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * group) will be allowed to set quotas.
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_nt_transact_set_quota(smb_request_t *sr, smb_xa_t *xa)
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char		*root_path;
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status = NT_STATUS_SUCCESS;
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_node_t	*tnode;
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_ofile_t	*ofile;
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_set_t request;
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	reply;
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t 		*quota_list;
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_set_t));
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) {
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED, 0, 0);
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_user_is_admin(sr->uid_user)) {
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRSRV, ERRaccess);
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (xa->smb_tpscnt != 2) {
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0);
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_mbc_decodef(&xa->req_param_mb, "%w", sr,
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &sr->smb_fid)) {
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, 0, 0);
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbsr_lookup_file(sr);
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	ofile = sr->fid_ofile;
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (ofile == NULL) {
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_HANDLE, ERRDOS, ERRbadfid);
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((ofile->f_node == NULL) || (ofile->f_ftype != SMB_FTYPE_DISK)) {
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS,
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERROR_ACCESS_DENIED);
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_release_file(sr);
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tnode = sr->tid_tree->t_snode;
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	root_path  = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_node_getmntpath(tnode, root_path, MAXPATHLEN) != 0) {
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER, ERRDOS,
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERROR_INVALID_PARAMETER);
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_release_file(sr);
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(root_path, MAXPATHLEN);
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	quota_list = &request.qs_quota_list;
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(quota_list, sizeof (smb_quota_t),
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_quota_t, q_list_node));
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	status = smb_quota_decode_quotas(xa, quota_list);
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status == NT_STATUS_SUCCESS) {
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request.qs_root_path = root_path;
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_quota_set(&request, &reply) != 0) {
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INTERNAL_ERROR;
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = reply;
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			xdr_free(xdr_uint32_t, (char *)&reply);
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kmem_free(root_path, MAXPATHLEN);
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_free_quotas(&request.qs_quota_list);
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smbsr_release_file(sr);
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (status != NT_STATUS_SUCCESS) {
3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, status, 0, 0);
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_param_mb, "l", 0);
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SDRC_SUCCESS);
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_init_sids
3389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the query is of type SMB_QUOTA_QUERY_SIDLIST or
3409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB_QUOTA_QUERY_STARTSID decode the list of sids from
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the client request into request->qq_sid_list.
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Otherwise (type SMB_QUOTA_QUERY_ALL) find the resume sid
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and insert it into request->qq_sid_list, or reset the
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * resume sid to NULL if request->qq_restart.
3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns: NT_STATUS codes
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_init_sids(smb_xa_t *xa, smb_quota_query_t *request,
3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_ofile_t *ofile)
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_sid_t *sid;
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t *sid_list;
3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t status = NT_STATUS_SUCCESS;
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sid_list = &request->qq_sid_list;
3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(sid_list, sizeof (smb_quota_sid_t),
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_quota_sid_t, qs_list_node));
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (request->qq_query_op) {
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUOTA_QUERY_SIDLIST:
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUOTA_QUERY_STARTSID:
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		status = smb_quota_decode_sids(xa, sid_list);
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUOTA_QUERY_ALL:
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (request->qq_restart)
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_ofile_set_quota_resume(ofile, NULL);
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else {
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			sid = kmem_zalloc(sizeof (smb_quota_sid_t), KM_SLEEP);
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			list_insert_tail(sid_list, sid);
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_ofile_get_quota_resume(ofile, sid->qs_sidstr,
3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    SMB_SID_STRSZ);
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (*sid->qs_sidstr == '\0')
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				status = NT_STATUS_INVALID_PARAMETER;
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		status = NT_STATUS_INVALID_PARAMETER;
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (status);
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_free_sids
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_sids(smb_quota_query_t *request)
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t *sid_list;
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_sid_t *sid;
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sid_list = &request->qq_sid_list;
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while ((sid = list_head(sid_list)) != NULL) {
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_remove(sid_list, sid);
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(sid, sizeof (smb_quota_sid_t));
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(sid_list);
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_decode_sids
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Decode the SIDs from the data block and stores them in string form in list.
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Eaxh sid entry comprises:
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	next_offset (4 bytes) - offset of next entry
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	sid length (4 bytes)
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	sid (variable length = sidlen)
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The last entry will have a next_offset value of 0.
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns NT_STATUS codes.
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_decode_sids(smb_xa_t *xa, list_t *list)
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	offset, mb_offset, sid_offset, bytes_left;
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	next_offset, sidlen;
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t	*sid;
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_sid_t	*qsid;
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t status = NT_STATUS_SUCCESS;
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct mbuf_chain sidbuf;
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	offset = 0;
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	do {
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mb_offset = offset + xa->req_data_mb.chain_offset;
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bytes_left = xa->req_data_mb.max_bytes - mb_offset;
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) MBC_SHADOW_CHAIN(&sidbuf, &xa->req_data_mb,
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    mb_offset, bytes_left);
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_mbc_decodef(&sidbuf, "ll", &next_offset, &sidlen)) {
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INVALID_PARAMETER;
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid_offset = offset + (2 * sizeof (uint32_t));
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid = smb_decode_sid(xa, sid_offset);
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sid == NULL) {
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INVALID_PARAMETER;
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		qsid = kmem_zalloc(sizeof (smb_quota_sid_t), KM_SLEEP);
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(sid, qsid->qs_sidstr);
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_free(sid);
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid = NULL;
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_insert_tail(list, qsid);
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		offset += next_offset;
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} while ((next_offset != 0) && (bytes_left > 0));
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (status);
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_max_quota
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If the query is if type SMB_QUOTA_QUERY_SIDLIST a quota entry
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is returned for each sid in the sidlist. request->qr_max_quota
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is set to 0 and is unused.
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Otherwise (for SMB_QUOTA_QUERY_STARTSID and SMB_QUOTA_QUERY_ALL)
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * max_quota is the maximum number of quota entries requested from
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the file system (via door call smb_quota_query()).
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If single is set max_quota is set to 1. If single is not set
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * max quota is calculated as the number of quotas of size
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB_QUOTA_EST_SIZE that would fit in the response buffer.
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_max_quota(smb_xa_t *xa, smb_quota_query_t *request)
4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (request->qq_query_op == SMB_QUOTA_QUERY_SIDLIST)
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request->qq_max_quota = 0;
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else if (request->qq_single)
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request->qq_max_quota = 1;
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	else
4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		request->qq_max_quota = (xa->smb_mdrcnt / SMB_QUOTA_EST_SIZE);
4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_decode_quotas
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Decode the quota entries into a list_t of smb_quota_t.
4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB_QUOTA_SIZE_NO_SID is the size of a quota entry,
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * excluding the sid.
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The last entry will have a next_offset value of 0.
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns NT_STATUS codes.
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t
4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_decode_quotas(smb_xa_t *xa, list_t *list)
4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	offset, mb_offset, sid_offset, bytes_left;
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	next_offset, sidlen;
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	mtime;
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t	*sid;
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_t	*quota;
4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	status = NT_STATUS_SUCCESS;
5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct mbuf_chain quotabuf;
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	offset = 0;
5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	do {
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		mb_offset = offset + xa->req_data_mb.chain_offset;
5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bytes_left = xa->req_data_mb.max_bytes - mb_offset;
5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) MBC_SHADOW_CHAIN(&quotabuf, &xa->req_data_mb,
5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    mb_offset, bytes_left);
5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		quota = kmem_zalloc(sizeof (smb_quota_t), KM_SLEEP);
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_mbc_decodef(&quotabuf, "llqqqq",
5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &next_offset, &sidlen, &mtime,
5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    &quota->q_used, &quota->q_thresh, &quota->q_limit)) {
5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			kmem_free(quota, sizeof (smb_quota_t));
5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INVALID_PARAMETER;
5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid_offset = offset + SMB_QUOTA_SIZE_NO_SID;
5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid = smb_decode_sid(xa, sid_offset);
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (sid == NULL) {
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			kmem_free(quota, sizeof (smb_quota_t));
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INVALID_PARAMETER;
5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		bzero(quota->q_sidstr, SMB_SID_STRSZ);
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_tostr(sid, quota->q_sidstr);
5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_free(sid);
5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid = NULL;
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_insert_tail(list, quota);
5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		offset += next_offset;
5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} while ((next_offset != 0) && (bytes_left > 0));
5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (status);
5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_free_quotas
5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static void
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_free_quotas(list_t *list)
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_t *quota;
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while ((quota = list_head(list)) != NULL) {
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		list_remove(list, quota);
5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(quota, sizeof (smb_quota_t));
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(list);
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_encode_quotas
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Encode the quota entries from a list_t of smb_quota_t.
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * SMB_QUOTA_SIZE_NO_SID is the size of a quota entry,
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * excluding the sid.
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The last entry will have a next_offset value of 0.
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Sets the last encoded SID as the resume sid.
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static uint32_t
5659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_encode_quotas(smb_xa_t *xa, smb_quota_query_t *request,
5669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States     smb_quota_response_t *reply, smb_ofile_t *ofile)
5679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t next_offset, sid_offset, total_bytes;
5699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t mtime = 0;
5709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t sidlen, pad;
5719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t *sid;
5729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char *sidstr = NULL, *resume = NULL;
5739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_t *quota, *next_quota;
5749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t *list = &reply->qr_quota_list;
5759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
5779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t status = NT_STATUS_SUCCESS;
5789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	total_bytes = 0;
5809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	quota = list_head(list);
5819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (quota) {
5829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		next_quota = list_next(list, quota);
5839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sidstr = quota->q_sidstr;
5849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((sid = smb_sid_fromstr(sidstr)) == NULL) {
5859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			quota = next_quota;
5869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			continue;
5879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
5889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sidlen = smb_sid_len(sid);
5909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		sid_offset = SMB_QUOTA_SIZE_NO_SID;
5919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		next_offset = sid_offset + sidlen;
5929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		pad = smb_pad_align(next_offset, 8);
5939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		next_offset += pad;
5949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (!MBC_ROOM_FOR(&xa->rep_data_mb, next_offset)) {
5969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_sid_free(sid);
5979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
5989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
5999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (!MBC_ROOM_FOR(&xa->rep_data_mb,
6009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    next_offset + SMB_QUOTA_MAX_SIZE)) {
6019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			next_quota = NULL;
6029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
6039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		rc = smb_mbc_encodef(&xa->rep_data_mb, "llqqqq",
6059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    next_quota ? next_offset : 0, sidlen, mtime,
6069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    quota->q_used, quota->q_thresh, quota->q_limit);
6079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (rc == 0) {
6089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_encode_sid(xa, sid);
6099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = smb_mbc_encodef(&xa->rep_data_mb, "#.", pad);
6109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
6119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_sid_free(sid);
6139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (rc != 0) {
6159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = NT_STATUS_INTERNAL_ERROR;
6169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
6179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
6189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		resume = sidstr;
6209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		total_bytes += next_offset;
6219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		quota = next_quota;
6229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smb_mbc_encodef(&xa->rep_param_mb, "l", total_bytes);
6259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((status == NT_STATUS_SUCCESS) &&
6279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    ((request->qq_query_op == SMB_QUOTA_QUERY_STARTSID) ||
6289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (request->qq_query_op == SMB_QUOTA_QUERY_ALL))) {
6299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smb_ofile_set_quota_resume(ofile, resume);
6309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (status);
6339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
6349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
6369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_query_user_quota
6379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Get user quota information for a single user (uid)
6399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * for the current file system.
6409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Find the user's sid, insert it in the sidlist of a
6419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_query_t request and invoke the door call
6429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_query() to obtain the quota information.
6439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
6449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns: NT_STATUS codes.
6459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
6469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States uint32_t
6479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query_user_quota(smb_request_t *sr, uid_t uid, smb_quota_t *quota)
6489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
6499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_t *sid;
6509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_sid_t qsid;
6519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_query_t request;
6529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_response_t reply;
6539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_t *sid_list;
6549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_t *q;
6559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_node_t *tnode;
6569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t status = NT_STATUS_SUCCESS;
6579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_idmap_getsid(uid, SMB_IDMAP_USER, &sid) != IDMAP_SUCCESS)
6599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NT_STATUS_INTERNAL_ERROR);
6609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_tostr(sid, qsid.qs_sidstr);
6629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_sid_free(sid);
6639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&request, sizeof (smb_quota_query_t));
6659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(&reply, sizeof (smb_quota_response_t));
6669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tnode = sr->tid_tree->t_snode;
6689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP);
6699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_node_getmntpath(tnode, request.qq_root_path, MAXPATHLEN) != 0) {
6709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		kmem_free(request.qq_root_path, MAXPATHLEN);
6719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (NT_STATUS_INTERNAL_ERROR);
6729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	sid_list = &request.qq_sid_list;
6759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_create(sid_list, sizeof (smb_quota_sid_t),
6769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    offsetof(smb_quota_sid_t, qs_list_node));
6779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_insert_tail(sid_list, &qsid);
6789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST;
6809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	request.qq_single = B_TRUE;
6819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
6829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_quota_query(&request, &reply) != 0) {
6839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		status = NT_STATUS_INTERNAL_ERROR;
6849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	} else {
6859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (reply.qr_status != NT_STATUS_SUCCESS) {
6869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			status = reply.qr_status;
6879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
6889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			q = list_head(&reply.qr_quota_list);
6899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if ((q == NULL) ||
6909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    (strcmp(qsid.qs_sidstr, q->q_sidstr) != 0)) {
6919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				/* should never happen */
6929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				status = NT_STATUS_INTERNAL_ERROR;
6939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			} else {
6949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				bcopy(q, quota, sizeof (smb_quota_t));
6959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
6969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
6979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		xdr_free(smb_quota_response_xdr, (char *)&reply);
6989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
6999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	kmem_free(request.qq_root_path, MAXPATHLEN);
7019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_remove(sid_list, &qsid);
7029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	list_destroy(sid_list);
7039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (status);
7059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_query
7099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Door call to query quotas for the provided filesystem path.
7119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns: -1 - door call (or encode/decode) failure.
7129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	     0 - success. Status set in reply.
7139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
7159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_query(smb_quota_query_t *request, smb_quota_response_t *reply)
7169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	rc;
7189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smb_kdoor_upcall(SMB_DR_QUOTA_QUERY,
7209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    request, smb_quota_query_xdr, reply, smb_quota_response_xdr);
7219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
7239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
7249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
7269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_quota_set
7279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
7289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Door call to set quotas for the provided filesystem path.
7299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns: -1 - door call (or encode/decode) failure.
7309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *	     0 - success. Status set in reply.
7319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
7329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
7339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_quota_set(smb_quota_set_t *request, uint32_t *reply)
7349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
7359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int	rc;
7369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smb_kdoor_upcall(SMB_DR_QUOTA_SET,
7389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    request, smb_quota_set_xdr, reply, xdr_uint32_t);
7399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
7409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (rc);
7419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
742