1*a90cf9f2SGordon Ross /* 2*a90cf9f2SGordon Ross * CDDL HEADER START 3*a90cf9f2SGordon Ross * 4*a90cf9f2SGordon Ross * The contents of this file are subject to the terms of the 5*a90cf9f2SGordon Ross * Common Development and Distribution License (the "License"). 6*a90cf9f2SGordon Ross * You may not use this file except in compliance with the License. 7*a90cf9f2SGordon Ross * 8*a90cf9f2SGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*a90cf9f2SGordon Ross * or http://www.opensolaris.org/os/licensing. 10*a90cf9f2SGordon Ross * See the License for the specific language governing permissions 11*a90cf9f2SGordon Ross * and limitations under the License. 12*a90cf9f2SGordon Ross * 13*a90cf9f2SGordon Ross * When distributing Covered Code, include this CDDL HEADER in each 14*a90cf9f2SGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*a90cf9f2SGordon Ross * If applicable, add the following below this CDDL HEADER, with the 16*a90cf9f2SGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying 17*a90cf9f2SGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner] 18*a90cf9f2SGordon Ross * 19*a90cf9f2SGordon Ross * CDDL HEADER END 20*a90cf9f2SGordon Ross */ 21*a90cf9f2SGordon Ross 22*a90cf9f2SGordon Ross /* 23*a90cf9f2SGordon Ross * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. 24*a90cf9f2SGordon Ross * Copyright 2013 Nexenta Systems, Inc. All rights reserved. 25*a90cf9f2SGordon Ross */ 26*a90cf9f2SGordon Ross 27*a90cf9f2SGordon Ross /* 28*a90cf9f2SGordon Ross * Dispatch function for SMB2_QUERY_INFO 29*a90cf9f2SGordon Ross */ 30*a90cf9f2SGordon Ross 31*a90cf9f2SGordon Ross #include <smbsrv/smb2_kproto.h> 32*a90cf9f2SGordon Ross #include <smbsrv/smb_fsops.h> 33*a90cf9f2SGordon Ross #include <smbsrv/ntifs.h> 34*a90cf9f2SGordon Ross 35*a90cf9f2SGordon Ross uint32_t 36*a90cf9f2SGordon Ross smb2_qinfo_quota(smb_request_t *sr, smb_queryinfo_t *qi) 37*a90cf9f2SGordon Ross { 38*a90cf9f2SGordon Ross _NOTE(ARGUNUSED(qi)) 39*a90cf9f2SGordon Ross uint8_t single, restart; 40*a90cf9f2SGordon Ross uint32_t sidlistlen, startsidlen, startsidoff; 41*a90cf9f2SGordon Ross smb_node_t *tnode; 42*a90cf9f2SGordon Ross smb_ofile_t *ofile = sr->fid_ofile; 43*a90cf9f2SGordon Ross smb_quota_query_t request; 44*a90cf9f2SGordon Ross smb_quota_response_t reply; 45*a90cf9f2SGordon Ross uint32_t status = NT_STATUS_SUCCESS; 46*a90cf9f2SGordon Ross int rc; 47*a90cf9f2SGordon Ross 48*a90cf9f2SGordon Ross bzero(&request, sizeof (smb_quota_query_t)); 49*a90cf9f2SGordon Ross bzero(&reply, sizeof (smb_quota_response_t)); 50*a90cf9f2SGordon Ross 51*a90cf9f2SGordon Ross if (!smb_tree_has_feature(sr->tid_tree, SMB_TREE_QUOTA)) 52*a90cf9f2SGordon Ross return (NT_STATUS_NOT_SUPPORTED); 53*a90cf9f2SGordon Ross 54*a90cf9f2SGordon Ross if ((ofile->f_node == NULL) || 55*a90cf9f2SGordon Ross (ofile->f_ftype != SMB_FTYPE_DISK)) 56*a90cf9f2SGordon Ross return (NT_STATUS_NOT_SUPPORTED); 57*a90cf9f2SGordon Ross 58*a90cf9f2SGordon Ross rc = smb_mbc_decodef( 59*a90cf9f2SGordon Ross &sr->smb_data, "bb..lll", 60*a90cf9f2SGordon Ross &single, /* b */ 61*a90cf9f2SGordon Ross &restart, /* b */ 62*a90cf9f2SGordon Ross /* reserved .. */ 63*a90cf9f2SGordon Ross &sidlistlen, /* l */ 64*a90cf9f2SGordon Ross &startsidlen, /* l */ 65*a90cf9f2SGordon Ross &startsidoff); /* l */ 66*a90cf9f2SGordon Ross if (rc) 67*a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER); 68*a90cf9f2SGordon Ross 69*a90cf9f2SGordon Ross if ((sidlistlen != 0) && (startsidlen != 0)) 70*a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER); 71*a90cf9f2SGordon Ross 72*a90cf9f2SGordon Ross 73*a90cf9f2SGordon Ross tnode = sr->tid_tree->t_snode; 74*a90cf9f2SGordon Ross request.qq_root_path = kmem_zalloc(MAXPATHLEN, KM_SLEEP); 75*a90cf9f2SGordon Ross if (smb_node_getmntpath(tnode, request.qq_root_path, MAXPATHLEN) != 0) { 76*a90cf9f2SGordon Ross kmem_free(request.qq_root_path, MAXPATHLEN); 77*a90cf9f2SGordon Ross return (NT_STATUS_INVALID_PARAMETER); 78*a90cf9f2SGordon Ross } 79*a90cf9f2SGordon Ross 80*a90cf9f2SGordon Ross if (sidlistlen != 0) 81*a90cf9f2SGordon Ross request.qq_query_op = SMB_QUOTA_QUERY_SIDLIST; 82*a90cf9f2SGordon Ross else if (startsidlen != 0) 83*a90cf9f2SGordon Ross request.qq_query_op = SMB_QUOTA_QUERY_STARTSID; 84*a90cf9f2SGordon Ross else 85*a90cf9f2SGordon Ross request.qq_query_op = SMB_QUOTA_QUERY_ALL; 86*a90cf9f2SGordon Ross 87*a90cf9f2SGordon Ross request.qq_single = single; 88*a90cf9f2SGordon Ross request.qq_restart = restart; 89*a90cf9f2SGordon Ross smb_quota_max_quota(&sr->raw_data, &request); 90*a90cf9f2SGordon Ross 91*a90cf9f2SGordon Ross status = smb_quota_init_sids(&sr->smb_data, &request, ofile); 92*a90cf9f2SGordon Ross 93*a90cf9f2SGordon Ross if (status == NT_STATUS_SUCCESS) { 94*a90cf9f2SGordon Ross if (smb_quota_query(sr->sr_server, &request, &reply) != 0) { 95*a90cf9f2SGordon Ross status = NT_STATUS_INTERNAL_ERROR; 96*a90cf9f2SGordon Ross } else { 97*a90cf9f2SGordon Ross status = reply.qr_status; 98*a90cf9f2SGordon Ross if (status == NT_STATUS_SUCCESS) { 99*a90cf9f2SGordon Ross status = smb_quota_encode_quotas( 100*a90cf9f2SGordon Ross &sr->raw_data, 101*a90cf9f2SGordon Ross &request, &reply, ofile); 102*a90cf9f2SGordon Ross } 103*a90cf9f2SGordon Ross xdr_free(smb_quota_response_xdr, (char *)&reply); 104*a90cf9f2SGordon Ross } 105*a90cf9f2SGordon Ross } 106*a90cf9f2SGordon Ross 107*a90cf9f2SGordon Ross kmem_free(request.qq_root_path, MAXPATHLEN); 108*a90cf9f2SGordon Ross smb_quota_free_sids(&request); 109*a90cf9f2SGordon Ross 110*a90cf9f2SGordon Ross if (status != NT_STATUS_SUCCESS) { 111*a90cf9f2SGordon Ross if (status == NT_STATUS_NO_MORE_ENTRIES) { 112*a90cf9f2SGordon Ross smb_ofile_set_quota_resume(ofile, NULL); 113*a90cf9f2SGordon Ross smbsr_warn(sr, status, 0, 0); 114*a90cf9f2SGordon Ross status = NT_STATUS_SUCCESS; 115*a90cf9f2SGordon Ross } else { 116*a90cf9f2SGordon Ross smbsr_error(sr, status, 0, 0); 117*a90cf9f2SGordon Ross } 118*a90cf9f2SGordon Ross } 119*a90cf9f2SGordon Ross 120*a90cf9f2SGordon Ross return (status); 121*a90cf9f2SGordon Ross } 122