xref: /illumos-gate/usr/src/uts/common/fs/smbsrv/smb_fsinfo.c (revision fd9ee8b58485b20072eeef1310a88ff348d5e7fa)
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  */
219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
22*fd9ee8b5Sjoyce mcintosh  * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_kproto.h>
269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smb_fsops.h>
279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #include <smbsrv/smbinfo.h>
289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_fssize_t
319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * volume_units and volume avail are the total allocated and
329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * available units on the volume.
339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * caller_units and caller_avail are the allocated and available
349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * units on the volume for the user associated with the calling
359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * thread.
369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States typedef struct smb_fssize {
389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	fs_volume_units;
399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	fs_volume_avail;
409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	fs_caller_units;
419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t	fs_caller_avail;
429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	fs_sectors_per_unit;
439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t	fs_bytes_per_sector;
449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States } smb_fssize_t;
459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * File System Control Flags for smb_com_trans2_query|set_fs_information
489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * level SMB_FILE_FS_CONTROL_INFORMATION
499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_QUOTA_TRACK		0x00000001
519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_QUOTA_ENFORCE		0x00000002
529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_CONTENT_INDEX_DISABLED	0x00000008
539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_LOG_QUOTA_THRESHOLD	0x00000010
549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_LOG_QUOTA_LIMIT		0x00000020
559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_LOG_VOLUME_THRESHOLD	0x00000040
569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_LOG_VOLUME_LIMIT	0x00000080
579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_QUOTAS_INCOMPLETE	0x00000100
589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States #define	FILE_VC_QUOTAS_REBUILDING	0x00000200
599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_fssize(smb_request_t *, smb_fssize_t *);
619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int smb_trans2_set_fs_ctrl_info(smb_request_t *, smb_xa_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_com_query_information_disk
659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The SMB_COM_QUERY_INFORMATION_DISK command is used to determine the
679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * capacity and remaining free space on the drive hosting the directory
689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * structure indicated by Tid in the SMB header.
699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The blocking/allocation units used in this response may be independent
719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * of the actual physical or logical blocking/allocation algorithm(s) used
729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * internally by the server.  However, they must accurately reflect the
739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * amount of space on the server.
749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This SMB only returns 16 bits of information for each field, which may
769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * not be large enough for some disk systems.  In particular TotalUnits is
779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * commonly > 64K.  Fortunately, it turns out the all the client cares
789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * about is the total disk size, in bytes, and the free space, in bytes.
799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * So,  it is reasonable for a server to adjust the relative values of
809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * BlocksPerUnit and BlockSize to accommodate.  If after all adjustment,
819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * the numbers are still too high, the largest possible values for
829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * TotalUnit or FreeUnits (i.e. 0xFFFF) should be returned.
839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_pre_query_information_disk(smb_request_t *sr)
879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	DTRACE_SMB_1(op__QueryInformationDisk__start, smb_request_t *, sr);
899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SDRC_SUCCESS);
909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States void
939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_post_query_information_disk(smb_request_t *sr)
949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	DTRACE_SMB_1(op__QueryInformationDisk__done, smb_request_t *, sr);
969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_query_information_disk(smb_request_t *sr)
1009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int			rc;
1029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fsblkcnt64_t		total_blocks, free_blocks;
1039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unsigned long		block_size, unit_size;
1049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unsigned short		blocks_per_unit, bytes_per_block;
1059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unsigned short		total_units, free_units;
1069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_fssize_t		fssize;
1079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (STYPE_ISIPC(sr->tid_tree->t_res_type)) {
1099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED, ERRDOS, ERRnoaccess);
1109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_fssize(sr, &fssize) != 0)
1149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
1159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	unit_size = fssize.fs_sectors_per_unit;
1179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	block_size = fssize.fs_bytes_per_sector;
1189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	total_blocks = fssize.fs_caller_units;
1199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free_blocks = fssize.fs_caller_avail;
1209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/*
1229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * It seems that DOS clients cannot handle block sizes
1239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * bigger than 512 KB. So we have to set the block size at
1249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 * most to 512
1259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	 */
1269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (block_size > 512) {
1279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		block_size >>= 1;
1289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		unit_size <<= 1;
1299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* adjust blocks and sizes until they fit into a word */
1329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	while (total_blocks >= 0xFFFF) {
1339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		total_blocks >>= 1;
1349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		free_blocks >>= 1;
1359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((unit_size <<= 1) > 0xFFFF) {
1369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			unit_size >>= 1;
1379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			total_blocks = 0xFFFF;
1389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			free_blocks <<= 1;
1399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			break;
1409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
1419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
1429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	total_units = (total_blocks >= 0xFFFF) ?
1449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    0xFFFF : (unsigned short)total_blocks;
1459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	free_units = (free_blocks >= 0xFFFF) ?
1469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    0xFFFF : (unsigned short)free_blocks;
1479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bytes_per_block = (unsigned short)block_size;
1489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	blocks_per_unit = (unsigned short)unit_size;
1499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smbsr_encode_result(sr, 5, 0, "bwwww2.w",
1519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    5,
1529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    total_units,	/* total_units */
1539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    blocks_per_unit,	/* blocks_per_unit */
1549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    bytes_per_block,	/* blocksize */
1559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    free_units,		/* free_units */
1569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    0);			/* bcc */
1579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return ((rc == 0) ? SDRC_SUCCESS : SDRC_ERROR);
1599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
1609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
1619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
1629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_com_trans2_query_fs_information
1639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This transaction requests information about the filesystem.
1659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The following information levels are supported:
1669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  InformationLevel               	Value
1689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ==================================  ======
1699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_INFO_ALLOCATION            	1
1709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_INFO_VOLUME                	2
1719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_QUERY_FS_VOLUME_INFO       	0x102
1729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_QUERY_FS_SIZE_INFO         	0x103
1739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_QUERY_FS_DEVICE_INFO       	0x104
1749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_QUERY_FS_ATTRIBUTE_INFO    	0x105
1759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_VOLUME_INFORMATION	1001
1769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_SIZE_INFORMATION	1003
1779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_DEVICE_INFORMATION	1004
1789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_ATTRIBUTE_INFORMATION	1005
1799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_CONTROL_INFORMATION	1006
1809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_FULLSIZE_INFORMATION	1007
1819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
1829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The fsid provides a system-wide unique file system ID.
1839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * fsid.val[0] is the 32-bit dev for the file system of the share root
1849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_node.
1859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * fsid.val[1] is the file system type.
1869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
1879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
1889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_trans2_query_fs_information(smb_request_t *sr, smb_xa_t *xa)
1899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
1909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t		flags;
1919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char			*encode_str, *tmpbuf;
1929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t		max_int;
1939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint16_t		infolev;
1949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int			rc, length, buflen;
1959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_tree_t		*tree;
1969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_node_t		*snode;
1979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	char 			*fsname = "NTFS";
1989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fsid_t			fsid;
1999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_fssize_t		fssize;
2009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_msgbuf_t		mb;
2019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tree = sr->tid_tree;
2039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!STYPE_ISDSK(tree->t_res_type)) {
2059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
2069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_ACCESS_DENIED);
2079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
2099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_mbc_decodef(&xa->req_param_mb, "w", &infolev) != 0)
2119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
2129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	snode = tree->t_snode;
2149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fsid = SMB_NODE_FSID(snode);
2159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (infolev) {
2179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_INFO_ALLOCATION:
2189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_fssize(sr, &fssize) != 0)
2199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
2209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		max_int = (uint64_t)UINT_MAX;
2229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (fssize.fs_caller_units > max_int)
2239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			fssize.fs_caller_units = max_int;
2249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (fssize.fs_caller_avail > max_int)
2259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			fssize.fs_caller_avail = max_int;
2269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "llllw",
2289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0,
2299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_sectors_per_unit,
2309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_units,
2319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_avail,
2329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_bytes_per_sector);
2339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_INFO_VOLUME:
2369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
2379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * In this response, the unicode volume label is NOT
2389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * expected to be aligned. Encode ('U') into a temporary
2399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * buffer, then encode buffer as a byte stream ('#c').
2409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
2419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) ||
2429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_WIN95)) {
2439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = smb_wcequiv_strlen(tree->t_volume);
2449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			buflen = length + sizeof (smb_wchar_t);
2459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			tmpbuf = smb_srm_zalloc(sr, buflen);
2469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_msgbuf_init(&mb, (uint8_t *)tmpbuf, buflen,
2479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    SMB_MSGBUF_UNICODE);
2489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = smb_msgbuf_encode(&mb, "U", tree->t_volume);
2499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			if (rc >= 0) {
2509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				rc = smb_mbc_encodef(&xa->rep_data_mb,
2519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				    "%lb#c", sr, fsid.val[0],
2529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 				    length, length, tmpbuf);
2539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			}
2549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smb_msgbuf_term(&mb);
2559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
2569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = strlen(tree->t_volume);
2579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			rc = smb_mbc_encodef(&xa->rep_data_mb, "%lbs", sr,
2589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    fsid.val[0], length, tree->t_volume);
2599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (rc < 0)
2629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
2639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUERY_FS_VOLUME_INFO:
2669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_VOLUME_INFORMATION:
2679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) ||
2689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_WIN95)) {
2699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = smb_wcequiv_strlen(tree->t_volume);
2709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			encode_str = "%qllb.U";
2719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
2729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = strlen(tree->t_volume);
2739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			encode_str = "%qllb.s";
2749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
2759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		/*
2779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 * NT has the "supports objects" flag set to 1.
2789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		 */
2799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, encode_str, sr,
2809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0ll,			/* Volume creation time */
2819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fsid.val[0],		/* Volume serial number */
2829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    length,			/* label length */
2839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0,				/* Supports objects */
2849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    tree->t_volume);
2859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUERY_FS_SIZE_INFO:
2889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_SIZE_INFORMATION:
2899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_fssize(sr, &fssize) != 0)
2909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
2919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "qqll",
2939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_units,
2949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_avail,
2959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_sectors_per_unit,
2969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_bytes_per_sector);
2979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
2989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
2999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUERY_FS_DEVICE_INFO:
3009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_DEVICE_INFORMATION:
3019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "ll",
3029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    FILE_DEVICE_FILE_SYSTEM,
3039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    FILE_DEVICE_IS_MOUNTED);
3049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_QUERY_FS_ATTRIBUTE_INFO:
3079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_ATTRIBUTE_INFORMATION:
3089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((sr->smb_flg2 & SMB_FLAGS2_UNICODE) ||
3099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_WINNT) ||
3109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_WIN2000) ||
3119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_WIN95) ||
3129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    (sr->session->native_os == NATIVE_OS_MACOS)) {
3139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = smb_wcequiv_strlen(fsname);
3149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			encode_str = "%lllU";
3159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			sr->smb_flg2 |= SMB_FLAGS2_UNICODE;
3169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		} else {
3179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			length = strlen(fsname);
3189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			encode_str = "%llls";
3199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		flags = FILE_CASE_PRESERVED_NAMES;
3229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (tree->t_flags & SMB_TREE_UNICODE_ON_DISK)
3249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			flags |= FILE_UNICODE_ON_DISK;
3259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (tree->t_flags & SMB_TREE_SUPPORTS_ACLS)
3279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			flags |= FILE_PERSISTENT_ACLS;
3289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if ((tree->t_flags & SMB_TREE_CASEINSENSITIVE) == 0)
3309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			flags |= FILE_CASE_SENSITIVE_SEARCH;
3319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (tree->t_flags & SMB_TREE_STREAMS)
3339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			flags |= FILE_NAMED_STREAMS;
3349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (tree->t_flags & SMB_TREE_QUOTA)
3369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			flags |= FILE_VOLUME_QUOTAS;
3379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
338*fd9ee8b5Sjoyce mcintosh 		if (tree->t_flags & SMB_TREE_SPARSE)
339*fd9ee8b5Sjoyce mcintosh 			flags |= FILE_SUPPORTS_SPARSE_FILES;
340*fd9ee8b5Sjoyce mcintosh 
3419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, encode_str, sr,
3429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    flags,
3439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    MAXNAMELEN,	/* max name */
3449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    length,	/* label length */
3459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fsname);
3469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_CONTROL_INFORMATION:
3499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) {
3509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
3519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    ERRDOS, ERROR_NOT_SUPPORTED);
3529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
3539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		}
3549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "qqqqqll",
3569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0,		/* free space start filtering - MUST be 0 */
3579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0,		/* free space threshold - MUST be 0 */
3589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0,		/* free space stop filtering - MUST be 0 */
3599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    SMB_QUOTA_UNLIMITED,	/* default quota threshold */
3609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    SMB_QUOTA_UNLIMITED,	/* default quota limit */
3619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    FILE_VC_QUOTA_ENFORCE,	/* fs control flag */
3629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    0);				/* pad bytes */
3639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_FULLSIZE_INFORMATION:
3669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_fssize(sr, &fssize) != 0)
3679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
3689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		(void) smb_mbc_encodef(&xa->rep_data_mb, "qqqll",
3709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_units,
3719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_caller_avail,
3729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_volume_avail,
3739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_sectors_per_unit,
3749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    fssize.fs_bytes_per_sector);
3759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
3769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_LABEL_INFORMATION:
3789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_OBJECTID_INFORMATION:
3799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_DRIVERPATH_INFORMATION:
3809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
3819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_NOT_SUPPORTED);
3829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
3839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
3859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_LEVEL,
3869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_INVALID_LEVEL);
3879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
3889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
3899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SDRC_SUCCESS);
3919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
3929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
3939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
3949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_fssize
3959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * File system size information, for the volume and for the user
3979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * initiating the request.
3989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
3999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If there's no quota entry for the user initiating the request,
4009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * caller_units and caller_avail are the total and available units
4019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * for the volume (volume_units, volume_avail).
4029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * If there is a quota entry for the user initiating the request,
4039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * and it is not SMB_QUOTA_UNLIMITED, calculate caller_units and
4049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * caller_avail as follows:
4059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *   caller_units = quota limit / bytes_per_unit
4069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *   caller_avail = remaining quota / bytes_per_unit
4079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * A quota limit of SMB_QUOTA_UNLIMITED means that the user's quota
4099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * is specfied as unlimited. A quota limit of 0 means there is no
4109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * quota specified for the user.
4119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Returns: 0 - success
4139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *         -1 - error. Error status set in sr.
4149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
4169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_fssize(smb_request_t *sr, smb_fssize_t *fssize)
4179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_node_t *node;
4199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	struct statvfs64 df;
4209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uid_t uid;
4219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_quota_t quota;
4229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc, bytes_per_unit;
4239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bzero(fssize, sizeof (smb_fssize_t));
4259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	node = sr->tid_tree->t_snode;
4269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc = smb_fsop_statfs(sr->user_cr, node, &df)) != 0) {
4279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_errno(sr, rc);
4289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
4299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_bytes_per_sector = 512;
4329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_sectors_per_unit = df.f_frsize >> 9;
4339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (df.f_bavail > df.f_blocks)
4349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		df.f_bavail = 0;
4359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_volume_units = df.f_blocks;
4379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_volume_avail = df.f_bavail;
4389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_caller_units = df.f_blocks;
4399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	fssize->fs_caller_avail = df.f_bavail;
4409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	bytes_per_unit =
4419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    fssize->fs_bytes_per_sector * fssize->fs_sectors_per_unit;
4429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA))
4449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
4459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uid = crgetuid(sr->uid_user->u_cred);
4479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_quota_query_user_quota(sr, uid, &quota) != NT_STATUS_SUCCESS)
4489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (0);
4499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((quota.q_limit != SMB_QUOTA_UNLIMITED) && (quota.q_limit != 0)) {
4519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		fssize->fs_caller_units = quota.q_limit / bytes_per_unit;
4529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (quota.q_limit <= quota.q_used)
4539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			fssize->fs_caller_avail = 0;
4549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		else
4559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			fssize->fs_caller_avail =
4569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			    (quota.q_limit - quota.q_used) / bytes_per_unit;
4579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
4609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
4619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
4639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_com_trans2_set_fs_information
4649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4659fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * This transaction sets filesystem information.
4669fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * The following information levels are supported:
4679fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
4689fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  InformationLevel               	Value
4699fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  ==================================  ======
4709fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *  SMB_FILE_FS_CONTROL_INFORMATION	1006
4719fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
4729fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_sdrc_t
4739fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_com_trans2_set_fs_information(smb_request_t *sr, smb_xa_t *xa)
4749fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
4759fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	smb_tree_t		*tree;
4769fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint16_t		infolev;
4779fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4789fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	tree = sr->tid_tree;
4799fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!STYPE_ISDSK(tree->t_res_type)) {
4809fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
4819fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_ACCESS_DENIED);
4829fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
4839fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
4849fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4859fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (smb_mbc_decodef(&xa->req_param_mb, "ww",
4869fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &sr->smb_fid, &infolev) != 0)
4879fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
4889fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4899fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	switch (infolev) {
4909fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_CONTROL_INFORMATION:
4919fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		if (smb_trans2_set_fs_ctrl_info(sr, xa) != 0)
4929fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 			return (SDRC_ERROR);
4939fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		break;
4949fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
4959fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_VOLUME_INFORMATION:
4969fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_LABEL_INFORMATION:
4979fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_SIZE_INFORMATION:
4989fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_DEVICE_INFORMATION:
4999fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_ATTRIBUTE_INFORMATION:
5009fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_FULLSIZE_INFORMATION:
5019fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_OBJECTID_INFORMATION:
5029fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	case SMB_FILE_FS_DRIVERPATH_INFORMATION:
5039fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
5049fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_NOT_SUPPORTED);
5059fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
5069fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5079fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	default:
5089fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_LEVEL,
5099fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_INVALID_LEVEL);
5109fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (SDRC_ERROR);
5119fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5129fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5139fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (SDRC_SUCCESS);
5149fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
5159fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5169fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States /*
5179fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * smb_trans2_set_fs_ctrl_info
5189fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5199fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Only users with Admin privileges (i.e. of the BUILTIN/Administrators
5209fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * group) will be allowed to set quotas.
5219fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  *
5229fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * Currently QUOTAS are always ENFORCED and the default values
5239fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * are always SMB_QUOTA_UNLIMITED (none). Any attempt to set
5249fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  * values other than these will result in NT_STATUS_NOT_SUPPORTED.
5259fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States  */
5269fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States static int
5279fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States smb_trans2_set_fs_ctrl_info(smb_request_t *sr, smb_xa_t *xa)
5289fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States {
5299fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	int rc;
5309fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint64_t fstart, fthresh, fstop, qthresh, qlimit;
5319fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	uint32_t qctrl, qpad;
5329fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5339fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) {
5349fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
5359fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_NOT_SUPPORTED);
5369fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
5379fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5389fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5399fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if (!smb_user_is_admin(sr->uid_user)) {
5409fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_ACCESS_DENIED,
5419fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_ACCESS_DENIED);
5429fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
5439fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5449fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5459fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	rc = smb_mbc_decodef(&xa->req_data_mb, "qqqqqll", &fstart,
5469fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    &fthresh, &fstop, &qthresh, &qlimit, &qctrl, &qpad);
5479fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5489fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((rc != 0) || (fstart != 0) || (fthresh != 0) || (fstop != 0)) {
5499fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_INVALID_PARAMETER,
5509fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_INVALID_PARAMETER);
5519fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
5529fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5539fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5549fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	/* Only support ENFORCED quotas with UNLIMITED default */
5559fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	if ((qctrl != FILE_VC_QUOTA_ENFORCE) ||
5569fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (qlimit != SMB_QUOTA_UNLIMITED) ||
5579fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	    (qthresh != SMB_QUOTA_UNLIMITED)) {
5589fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		smbsr_error(sr, NT_STATUS_NOT_SUPPORTED,
5599fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		    ERRDOS, ERROR_NOT_SUPPORTED);
5609fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 		return (-1);
5619fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	}
5629fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 
5639fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States 	return (0);
5649fb67ea3Safshin salek ardakani - Sun Microsystems - Irvine United States }
565