b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * CDDL HEADER START
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * The contents of this file are subject to the terms of the
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Common Development and Distribution License (the "License").
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You may not use this file except in compliance with the License.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * or http://www.opensolaris.org/os/licensing.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * See the License for the specific language governing permissions
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * and limitations under the License.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * When distributing Covered Code, include this CDDL HEADER in each
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * If applicable, add the following below this CDDL HEADER, with the
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * fields enclosed by brackets "[]" replaced with your own identifying
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * information: Portions Copyright [yyyy] [name of copyright owner]
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * CDDL HEADER END
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/types.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/vnode.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/debug.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <attr.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <libnvpair.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic uint64_t zero_times[2];
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic int
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossgetxva_parse_nvl(xvattr_t *xvap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoptattr_t *xoap, nvlist_t *nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * See similar code to parse the nvlist in:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * uts/common/fs/xattr.c : xattr_file_write()
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop__getxvattr(vnode_t *vp, xvattr_t *xvap)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvlist_t *nvl = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoptattr_t *xoap = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int error;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((xoap = xva_getxoptattr(xvap)) == NULL) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = fgetattr(vp->v_fd, XATTR_VIEW_READWRITE, &nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (error == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = getxva_parse_nvl(xvap, xoap, nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvlist_free(nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvl = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Also get the readonly attrs, but don't fail.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fgetattr(vp->v_fd, XATTR_VIEW_READONLY, &nvl) == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) getxva_parse_nvl(xvap, xoap, nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvlist_free(nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (error);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstatic int
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossgetxva_parse_nvl(xvattr_t *xvap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoptattr_t *xoap, nvlist_t *nvl)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvpair_t *pair = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int error;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross while (pair = nvlist_next_nvpair(nvl, pair)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross data_type_t type;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross f_attr_t attr;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross boolean_t value = B_FALSE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint64_t *times = zero_times;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t nelems = 2;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Validate the name and type of each attribute.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Log any unknown names and continue. This will
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * help if additional attributes are added later.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross type = nvpair_type(pair);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr = name_to_attr(nvpair_name(pair));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (attr == F_ATTR_INVAL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Verify nvlist type matches required type and view is OK
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (type != attr_to_data_type(attr) ||
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (attr_to_xattr_view(attr) == XATTR_VIEW_READONLY))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * For OWNERSID/GROUPSID, just skip.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((attr == F_OWNERSID || attr == F_GROUPSID))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Retrieve data from nvpair
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (type) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case DATA_TYPE_BOOLEAN_VALUE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (nvpair_value_boolean_value(pair, &value)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = EINVAL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross goto out;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case DATA_TYPE_UINT64_ARRAY:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (nvpair_value_uint64_array(pair, &times, &nelems)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = EINVAL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross goto out;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (nelems < 2)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case DATA_TYPE_NVLIST:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case DATA_TYPE_UINT8_ARRAY:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = EINVAL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross goto out;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (attr) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * If we have several similar optional attributes to
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * process then we should do it all together here so that
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * xoap and the requested bitmap can be set in one place.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_READONLY:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_READONLY);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_readonly = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_HIDDEN:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_HIDDEN);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_hidden = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SYSTEM:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_SYSTEM);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_system = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_ARCHIVE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_ARCHIVE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_archive = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_CRTIME:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_CREATETIME);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_createtime.tv_sec = times[0];
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_createtime.tv_nsec = times[1];
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_REPARSE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_REPARSE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_reparse = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_OFFLINE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_OFFLINE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_offline = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SPARSE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross XVA_SET_RTN(xvap, XAT_SPARSE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_sparse = value;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossout:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (error);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * See similar code to build the nvlist in:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * uts/common/fs/xattr.c : xattr_fill_nvlist()
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop__setxvattr(vnode_t *vp, xvattr_t *xvap)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint64_t times[2];
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvlist_t *nvl;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int error;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoptattr_t *xoap; /* Pointer to optional attributes */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((xoap = xva_getxoptattr(xvap)) == NULL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, KM_SLEEP))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOMEM);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_READONLY)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_READONLY),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_readonly) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_HIDDEN)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_HIDDEN),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_hidden) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_SYSTEM)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_SYSTEM),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_system) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_ARCHIVE)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_ARCHIVE),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_archive) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_CREATETIME)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross times[0] = xoap->xoa_createtime.tv_sec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross times[1] = xoap->xoa_createtime.tv_nsec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_uint64_array(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_CRTIME),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross times, 2) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_REPARSE)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_REPARSE),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_reparse) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_OFFLINE)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_OFFLINE),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_offline) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (XVA_ISSET_REQ(xvap, XAT_SPARSE)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY(nvlist_add_boolean_value(nvl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross attr_to_name(F_SPARSE),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross xoap->xoa_sparse) == 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = fsetattr(vp->v_fd, XATTR_VIEW_READWRITE, nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross nvlist_free(nvl);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (error);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}