a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * CDDL HEADER START
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * The contents of this file are subject to the terms of the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Common Development and Distribution License (the "License").
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * You may not use this file except in compliance with the License.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * or http://www.opensolaris.org/os/licensing.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * See the License for the specific language governing permissions
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * and limitations under the License.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * When distributing Covered Code, include this CDDL HEADER in each
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * If applicable, add the following below this CDDL HEADER, with the
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * CDDL HEADER END
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Dispatch function for SMB2_QUERY_INFO
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * [MS-FSCC 2.5] If a file system does not implement ...
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * an Information Classs, NT_STATUS_INVALID_PARAMETER...
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/smb2_kproto.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/smb_fsops.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross#include <smbsrv/ntifs.h>
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_volume(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_size(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_device(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_attr(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_control(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_fullsize(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t smb2_qfs_obj_id(smb_request_t *);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qinfo_fs(smb_request_t *sr, smb_queryinfo_t *qi)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t status;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (qi->qi_InfoClass) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* pg 153 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsVolumeInformation: /* 1 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_volume(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsSizeInformation: /* 3 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_size(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsDeviceInformation: /* 4 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_device(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsAttributeInformation: /* 5 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_attr(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsControlInformation: /* 6 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_control(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsFullSizeInformation: /* 7 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_fullsize(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case FileFsObjectIdInformation: /* 8 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = smb2_qfs_obj_id(sr);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross status = NT_STATUS_INVALID_INFO_CLASS;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (status);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsVolumeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_volume(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_node_t *snode;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsid_t fsid;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t LabelLength;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!STYPE_ISDSK(tree->t_res_type))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross snode = tree->t_snode;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsid = SMB_NODE_FSID(snode);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross LabelLength = smb_wcequiv_strlen(tree->t_volume);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * NT has the "supports objects" flag set to 1.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qllb.U",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0LL, /* Volume creation time (q) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsid.val[0], /* serial no. (l) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross LabelLength, /* (l) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0, /* Supports objects (b) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* reserved (.) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross tree->t_volume); /* (U) */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsSizeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_size(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_fssize_t fssize;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!STYPE_ISDSK(tree->t_res_type))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_fssize(sr, &fssize);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (smb_errno2status(rc));
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qqll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_caller_units,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_caller_avail,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_sectors_per_unit,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_bytes_per_sector);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsFullSizeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_fullsize(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_fssize_t fssize;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!STYPE_ISDSK(tree->t_res_type))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = smb_fssize(sr, &fssize);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (smb_errno2status(rc));
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qqqll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_caller_units,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_caller_avail,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_volume_avail,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_sectors_per_unit,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fssize.fs_bytes_per_sector);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsDeviceInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_device(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t DeviceType;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t Characteristics;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!STYPE_ISDSK(tree->t_res_type))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross DeviceType = FILE_DEVICE_DISK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross Characteristics = FILE_DEVICE_IS_MOUNTED;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "ll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross DeviceType,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross Characteristics);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsAttributeInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_attr(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross char *fsname;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t namelen;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross uint32_t FsAttr;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* This call is OK on all tree types. */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (tree->t_res_type & STYPE_MASK) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case STYPE_IPC:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsname = "PIPE";
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case STYPE_DISKTREE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsname = "NTFS"; /* A lie, but compatible... */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross break;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case STYPE_PRINTQ:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case STYPE_DEVICE:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default: /* gcc -Wuninitialized */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross namelen = smb_wcequiv_strlen(fsname);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Todo: Store the FsAttributes in the tree object,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * then just return that directly here.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr = FILE_CASE_PRESERVED_NAMES;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_flags & SMB_TREE_UNICODE_ON_DISK)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_UNICODE_ON_DISK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_flags & SMB_TREE_SUPPORTS_ACLS)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_PERSISTENT_ACLS;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if ((tree->t_flags & SMB_TREE_CASEINSENSITIVE) == 0)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_CASE_SENSITIVE_SEARCH;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_flags & SMB_TREE_STREAMS)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_NAMED_STREAMS;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_flags & SMB_TREE_QUOTA)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_VOLUME_QUOTAS;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (tree->t_flags & SMB_TREE_SPARSE)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr |= FILE_SUPPORTS_SPARSE_FILES;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "lllU",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FsAttr,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross MAXNAMELEN-1,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross namelen,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross fsname);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsControlInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_control(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_tree_t *tree = sr->tid_tree;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!STYPE_ISDSK(tree->t_res_type))
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Strange error per. [MS-FSCC 2.5.2]
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * which means quotas not supported.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_VOLUME_NOT_UPGRADED);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) smb_mbc_encodef(
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross &sr->raw_data, "qqqqqll",
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0, /* free space start filtering - MUST be 0 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0, /* free space threshold - MUST be 0 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0, /* free space stop filtering - MUST be 0 */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_QUOTA_UNLIMITED, /* default quota threshold */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross SMB_QUOTA_UNLIMITED, /* default quota limit */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross FILE_VC_QUOTA_ENFORCE, /* fs control flag */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross 0); /* pad bytes */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (0);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * FileFsObjectIdInformation
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/* ARGSUSED */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossuint32_t
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb2_qfs_obj_id(smb_request_t *sr)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (NT_STATUS_INVALID_PARAMETER);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}