fs_subr.c revision 31ceb98b622e1a310256f4c4a1472beb92046db3
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer * CDDL HEADER START
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The contents of this file are subject to the terms of the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Common Development and Distribution License (the "License").
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * You may not use this file except in compliance with the License.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * or http://www.opensolaris.org/os/licensing.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * See the License for the specific language governing permissions
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * and limitations under the License.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * When distributing Covered Code, include this CDDL HEADER in each
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If applicable, add the following below this CDDL HEADER, with the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * fields enclosed by brackets "[]" replaced with your own identifying
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * information: Portions Copyright [yyyy] [name of copyright owner]
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * CDDL HEADER END
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* All Rights Reserved */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Use is subject to license terms.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#pragma ident "%Z%%M% %I% %E% SMI"
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Generic vnode operations.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/types.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/param.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/systm.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/errno.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/fcntl.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/flock.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/statvfs.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/vfs.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/vnode.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/proc.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/user.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/unistd.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/cred.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/poll.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/debug.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/cmn_err.h>
da14cebe459d3275048785f25bd869cb09b5307fEric Cheng#include <sys/stream.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <fs/fs_subr.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/acl.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/share.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/file.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/kmem.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/file.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx#include <sys/nbmlock.h>
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China#include <acl/acl_common.h>
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstatic callb_cpr_t *frlock_serialize_blocked(flk_cb_when_t, void *);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Tunable to limit the number of retry to recover from STALE error.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint fs_estale_retry = 5;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The associated operation is not supported by the file system.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_nosys()
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (ENOSYS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The associated operation is invalid (on this vnode).
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
43439c96b8398c01c375889c79bed72d78fb4c39hxint
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinafs_inval()
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (EINVAL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The associated operation is valid only for directories.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_notdir()
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (ENOTDIR);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Free the file system specific resources. For the file systems that
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * do not support the forced unmount, it will be a nop function.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*ARGSUSED*/
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_freevfs(vfs_t *vfsp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_nosys_map(struct vnode *vp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx offset_t off,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct as *as,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx caddr_t *addrp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx size_t len,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uchar_t prot,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uchar_t maxprot,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uint_t flags,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct cred *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (ENOSYS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_nosys_addmap(struct vnode *vp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx offset_t off,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct as *as,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx caddr_t addr,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx size_t len,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uchar_t prot,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uchar_t maxprot,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx uint_t flags,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct cred *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (ENOSYS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_nosys_poll(vnode_t *vp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register short events,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int anyyet,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register short *reventsp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct pollhead **phpp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (ENOSYS);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * The file system has nothing to sync to disk. However, the
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * VFS_SYNC operation must not fail.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_sync(struct vfs *vfspp, short flag, cred_t *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Read/write lock/unlock. Does nothing.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_rwlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (-1);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvoid
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ctp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Compare two vnodes.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_cmp(vnode_t *vp1, vnode_t *vp2)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (vp1 == vp2);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * No-op seek operation.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_seek(vnode_t *vp, offset_t ooff, offset_t *noffp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return ((*noffp < 0 || *noffp > MAXOFFSET_T) ? EINVAL : 0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * File and record locking.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_frlock(register vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx offset_t offset, flk_callback_t *flk_cbp, cred_t *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int frcmd;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int nlmid;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int error = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx flk_callback_t serialize_callback;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int serialize = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx switch (cmd) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_GETLK:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_O_GETLK:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (flag & F_REMOTELOCK) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = RCMDLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (flag & F_PXFSLOCK) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = PCMDLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bfp->l_pid = ttoproc(curthread)->p_pid;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bfp->l_sysid = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = 0;
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China break;
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China case F_SETLK_NBMAND:
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China /*
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China * Are NBMAND locks allowed on this file?
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China */
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China if (!vp->v_vfsp ||
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = EINVAL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx goto done;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vp->v_type != VREG) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = EINVAL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx goto done;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*FALLTHROUGH*/
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_SETLK:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Check whether there is an NBMAND share reservation that
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * conflicts with the lock request.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (nbl_need_check(vp)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_start_crit(vp, RW_WRITER);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx serialize = 1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (share_blocks_lock(vp, bfp)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = EAGAIN;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx goto done;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (flag & F_REMOTELOCK) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = SETFLCK|RCMDLCK;
43439c96b8398c01c375889c79bed72d78fb4c39hx break;
43439c96b8398c01c375889c79bed72d78fb4c39hx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (flag & F_PXFSLOCK) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = SETFLCK|PCMDLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bfp->l_pid = ttoproc(curthread)->p_pid;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bfp->l_sysid = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = SETFLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (cmd == F_SETLK_NBMAND &&
c533a883a71cff9ff32df1c53c31201e1cbf371fhx (bfp->l_type == F_RDLCK || bfp->l_type == F_WRLCK)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* would check here for conflict with mapped region */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd |= NBMLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_SETLKW:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If there is an NBMAND share reservation that conflicts
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * with the lock request, block until the conflicting share
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * reservation goes away.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (nbl_need_check(vp)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_start_crit(vp, RW_WRITER);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx serialize = 1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (share_blocks_lock(vp, bfp)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = wait_for_share(vp, bfp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (error != 0)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx goto done;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (flag & F_REMOTELOCK) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx frcmd = SETFLCK|SLPFLCK|RCMDLCK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
43439c96b8398c01c375889c79bed72d78fb4c39hx }
43439c96b8398c01c375889c79bed72d78fb4c39hx if (flag & F_PXFSLOCK) {
43439c96b8398c01c375889c79bed72d78fb4c39hx frcmd = SETFLCK|SLPFLCK|PCMDLCK;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China bfp->l_pid = ttoproc(curthread)->p_pid;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China bfp->l_sysid = 0;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China frcmd = SETFLCK|SLPFLCK;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China case F_HASREMOTELOCKS:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China nlmid = GETNLMID(bfp->l_sysid);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (nlmid != 0) { /* booted as a cluster */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China l_has_rmt(bfp) =
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China cl_flk_has_remote_locks_for_nlmid(vp, nlmid);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China } else { /* not booted as a cluster */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China l_has_rmt(bfp) = flk_has_remote_locks(vp);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China goto done;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China default:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China error = EINVAL;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China goto done;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * If this is a blocking lock request and we're serializing lock
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * requests, modify the callback list to leave the critical region
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * while we're waiting for the lock.
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (serialize && (frcmd & SLPFLCK) != 0) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China flk_add_callback(&serialize_callback,
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China frlock_serialize_blocked, vp, flk_cbp);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China flk_cbp = &serialize_callback;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China error = reclock(vp, bfp, frcmd, flag, offset, flk_cbp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhxdone:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (serialize)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_end_crit(vp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (error);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Callback when a lock request blocks and we are serializing requests. If
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * before sleeping, leave the critical region. If after wakeup, reenter
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * the critical region.
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan */
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhanstatic callb_cpr_t *
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyerfrlock_serialize_blocked(flk_cb_when_t when, void *infop)
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer{
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer vnode_t *vp = (vnode_t *)infop;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (when == FLK_BEFORE_SLEEP)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_end_crit(vp);
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China else {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China nbl_start_crit(vp, RW_WRITER);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China }
6f12def440a1ce798ab128210a43414d173669f0pengcheng chen - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China return (NULL);
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China}
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Allow any flags.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_setfl(vnode_t *vp, int oflags, int nflags, cred_t *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Return the answer requested to poll() for non-device files.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Only POLLIN, POLLRDNORM, and POLLOUT are recognized.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxstruct pollhead fs_pollhd;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_poll(vnode_t *vp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register short events,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int anyyet,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register short *reventsp,
d2a61391af480de12cf4264080d7254a6de96e2apengcheng chen - Sun Microsystems - Beijing China struct pollhead **phpp)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (events & POLLIN)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp |= POLLIN;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (events & POLLRDNORM)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp |= POLLRDNORM;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (events & POLLRDBAND)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp |= POLLRDBAND;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (events & POLLOUT)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp |= POLLOUT;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (events & POLLWRBAND)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *reventsp |= POLLWRBAND;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *phpp = !anyyet && !*reventsp ? &fs_pollhd : (struct pollhead *)NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * POSIX pathconf() support.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register ulong_t val;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx register int error = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct statvfs64 vfsbuf;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx switch (cmd) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_LINK_MAX:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = MAXLINK;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_MAX_CANON:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = MAX_CANON;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_MAX_INPUT:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = MAX_INPUT;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_NAME_MAX:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx bzero(&vfsbuf, sizeof (vfsbuf));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (error = VFS_STATVFS(vp->v_vfsp, &vfsbuf))
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = vfsbuf.f_namemax;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_PATH_MAX:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_SYMLINK_MAX:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = MAXPATHLEN;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_PIPE_BUF:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = PIPE_BUF;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer case _PC_NO_TRUNC:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vp->v_vfsp->vfs_flag & VFS_NOTRUNC)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = 1; /* NOTRUNC is enabled for vp */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx else
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = (ulong_t)-1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_VDISABLE:
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer val = _POSIX_VDISABLE;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan break;
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan case _PC_CHOWN_RESTRICTED:
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan if (rstchown)
bcb5c89da22515e2ccf139578bad3caebcd716adSowmini Varadhan val = rstchown; /* chown restricted enabled */
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer else
0dc2366f7b9f9f36e10909b1e95edbf2a261c2acVenugopal Iyer val = (ulong_t)-1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_FILESIZEBITS:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * If ever we come here it means that underlying file system
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * does not recognise the command and therefore this
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * configurable limit cannot be determined. We return -1
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * and don't change errno.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = (ulong_t)-1; /* large file support */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case _PC_ACL_ENABLED:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx val = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx default:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = EINVAL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (error == 0)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *valp = val;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (error);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * Dispose of a page.
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/* ARGSUSED */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinavoid
d62cb7fff63265824a8e6725a3bcef698f6134c9hxfs_dispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr)
d62cb7fff63265824a8e6725a3bcef698f6134c9hx{
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d62cb7fff63265824a8e6725a3bcef698f6134c9hx ASSERT(fl == B_FREE || fl == B_INVAL);
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d62cb7fff63265824a8e6725a3bcef698f6134c9hx if (fl == B_FREE)
d62cb7fff63265824a8e6725a3bcef698f6134c9hx page_free(pp, dn);
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China else
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China page_destroy(pp, dn);
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China}
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China
09539a3c2da6fef054f5306232ef0480de261eabpengcheng chen - Sun Microsystems - Beijing China/* ARGSUSED */
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing Chinavoid
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing Chinafs_nodispose(struct vnode *vp, page_t *pp, int fl, int dn, struct cred *cr)
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China{
d62cb7fff63265824a8e6725a3bcef698f6134c9hx cmn_err(CE_PANIC, "fs_nodispose invoked");
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China}
d62cb7fff63265824a8e6725a3bcef698f6134c9hx
d40f4da491abdcae192eb797766f5f44772a832fpengcheng chen - Sun Microsystems - Beijing China/*
d62cb7fff63265824a8e6725a3bcef698f6134c9hx * fabricate acls for file systems that do not support acls.
d62cb7fff63265824a8e6725a3bcef698f6134c9hx */
d62cb7fff63265824a8e6725a3bcef698f6134c9hx/* ARGSUSED */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_fab_acl(vp, vsecattr, flag, cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvnode_t *vp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxvsecattr_t *vsecattr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint flag;
c533a883a71cff9ff32df1c53c31201e1cbf371fhxcred_t *cr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclent_t *aclentp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ace_t *acep;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx struct vattr vattr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int error;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_aclcnt = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_aclentp = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_dfaclcnt = 0; /* Default ACLs are not fabricated */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_dfaclentp = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vattr.va_mask = AT_MODE | AT_UID | AT_GID;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (error = VOP_GETATTR(vp, &vattr, 0, cr))
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (error);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vsecattr->vsa_mask & (VSA_ACLCNT | VSA_ACL)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_aclcnt = 4; /* USER, GROUP, OTHER, and CLASS */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr->vsa_aclentp = kmem_zalloc(4 * sizeof (aclent_t),
c533a883a71cff9ff32df1c53c31201e1cbf371fhx KM_SLEEP);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp = vsecattr->vsa_aclentp;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_type = USER_OBJ; /* Owner */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0700)) >> 6;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_id = vattr.va_uid; /* Really undefined */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_type = GROUP_OBJ; /* Group */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_perm = ((ushort_t)(vattr.va_mode & 0070)) >> 3;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_id = vattr.va_gid; /* Really undefined */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_type = OTHER_OBJ; /* Other */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_perm = vattr.va_mode & 0007;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_id = (gid_t)-1; /* Really undefined */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp++;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_type = CLASS_OBJ; /* Class */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx aclentp->a_perm = (ushort_t)(0007);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China aclentp->a_id = (gid_t)-1; /* Really undefined */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China } else if (vsecattr->vsa_mask & (VSA_ACECNT | VSA_ACE)) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China vsecattr->vsa_aclcnt = 6;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China vsecattr->vsa_aclentp = kmem_zalloc(6 * sizeof (ace_t),
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China KM_SLEEP);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China acep = vsecattr->vsa_aclentp;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China (void) memcpy(acep, trivial_acl, sizeof (ace_t) * 6);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China adjust_ace_pair(acep, (vattr.va_mode & 0700) >> 6);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China adjust_ace_pair(acep + 2, (vattr.va_mode & 0070) >> 3);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China adjust_ace_pair(acep + 4, vattr.va_mode & 0007);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (0);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * Common code for implementing DOS share reservations
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China/* ARGSUSED4 */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinaint
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing Chinafs_shrlock(struct vnode *vp, int cmd, struct shrlock *shr, int flag, cred_t *cr)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China{
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China int error;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Make sure that the file was opened with permissions appropriate
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * for the request, and make sure the caller isn't trying to sneak
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * in an NBMAND request.
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (cmd == F_SHARE) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (((shr->s_access & F_RDACC) && (flag & FREAD) == 0) ||
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China ((shr->s_access & F_WRACC) && (flag & FWRITE) == 0))
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (EBADF);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (shr->s_deny & F_MANDDNY)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (EINVAL);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China }
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China if (cmd == F_SHARE_NBMAND) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China /* must have write permission to deny read access */
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China if ((shr->s_deny & F_RDDNY) && (flag & FWRITE) == 0)
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (EBADF);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* make sure nbmand is allowed on the file */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (!vp->v_vfsp ||
c533a883a71cff9ff32df1c53c31201e1cbf371fhx !(vp->v_vfsp->vfs_flag & VFS_NBMAND)) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (EINVAL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vp->v_type != VREG) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (EINVAL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_start_crit(vp, RW_WRITER);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx switch (cmd) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_SHARE_NBMAND:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China shr->s_deny |= F_MANDDNY;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*FALLTHROUGH*/
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_SHARE:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = add_share(vp, shr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx case F_UNSHARE:
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = del_share(vp, shr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China case F_HASREMOTELOCKS:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China /*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * We are overloading this command to refer to remote
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * shares as well as remote locks, despite its name.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx shr->s_access = shr_has_remote_shares(vp, shr->s_sysid);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx default:
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China error = EINVAL;
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx nbl_end_crit(vp);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (error);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*ARGSUSED1*/
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_vnevent_nosupport(vnode_t *vp, vnevent_t vnevent, vnode_t *dvp, char *cname)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
b510adae7e8895b2bf58eda3537fd56df35302e4fei feng - Sun Microsystems - Beijing China ASSERT(vp != NULL);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China return (ENOTSUP);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*ARGSUSED1*/
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_vnevent_support(vnode_t *vp, vnevent_t vnevent, vnode_t *dvp, char *cname)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ASSERT(vp != NULL);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * return 1 for non-trivial ACL.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * NB: It is not necessary for the caller to VOP_RWLOCK since
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * we only issue VOP_GETSECATTR.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx *
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * Returns 0 == trivial
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * 1 == NOT Trivial
c533a883a71cff9ff32df1c53c31201e1cbf371fhx * <0 could not determine.
c533a883a71cff9ff32df1c53c31201e1cbf371fhx */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_acl_nontrivial(vnode_t *vp, cred_t *cr)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ulong_t acl_styles;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ulong_t acl_flavor;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr_t vsecattr;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int error;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx int isnontrivial;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* determine the forms of ACLs maintained */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = VOP_PATHCONF(vp, _PC_ACL_ENABLED, &acl_styles, cr);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* clear bits we don't understand and establish default acl_style */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx acl_styles &= (_ACL_ACLENT_ENABLED | _ACL_ACE_ENABLED);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (error || (acl_styles == 0))
c533a883a71cff9ff32df1c53c31201e1cbf371fhx acl_styles = _ACL_ACLENT_ENABLED;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_aclentp = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_dfaclentp = NULL;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_aclcnt = 0;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China vsecattr.vsa_dfaclcnt = 0;
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China while (acl_styles) {
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China /* select one of the styles as current flavor */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China acl_flavor = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (acl_styles & _ACL_ACLENT_ENABLED) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx acl_flavor = _ACL_ACLENT_ENABLED;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_mask = VSA_ACLCNT | VSA_DFACLCNT;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx } else if (acl_styles & _ACL_ACE_ENABLED) {
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China acl_flavor = _ACL_ACE_ENABLED;
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China vsecattr.vsa_mask = VSA_ACECNT | VSA_ACE;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx ASSERT(vsecattr.vsa_mask && acl_flavor);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx error = VOP_GETSECATTR(vp, &vsecattr, 0, cr);
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China if (error == 0)
c50ced99bb75273dc8c4c36876d2e8f59a64f4b1pengcheng chen - Sun Microsystems - Beijing China break;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China /* that flavor failed */
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China acl_styles &= ~acl_flavor;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* if all styles fail then assume trivial */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (acl_styles == 0)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (0);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* process the flavor that worked */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx isnontrivial = 0;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (acl_flavor & _ACL_ACLENT_ENABLED) {
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vsecattr.vsa_aclcnt > MIN_ACL_ENTRIES)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx isnontrivial = 1;
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx kmem_free(vsecattr.vsa_aclentp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_aclcnt * sizeof (aclent_t));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vsecattr.vsa_dfaclcnt && vsecattr.vsa_dfaclentp != NULL)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx kmem_free(vsecattr.vsa_dfaclentp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_dfaclcnt * sizeof (aclent_t));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
f3c4902c7f91725a7b538a3d82f1993bff02944fpengcheng chen - Sun Microsystems - Beijing China if (acl_flavor & _ACL_ACE_ENABLED) {
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
19d332fefbc61327bb6187d0eb818629f3b52c6ffei feng - Sun Microsystems - Beijing China isnontrivial = ace_trivial(vsecattr.vsa_aclentp,
43439c96b8398c01c375889c79bed72d78fb4c39hx vsecattr.vsa_aclcnt);
43439c96b8398c01c375889c79bed72d78fb4c39hx
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (vsecattr.vsa_aclcnt && vsecattr.vsa_aclentp != NULL)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx kmem_free(vsecattr.vsa_aclentp,
c533a883a71cff9ff32df1c53c31201e1cbf371fhx vsecattr.vsa_aclcnt * sizeof (ace_t));
c533a883a71cff9ff32df1c53c31201e1cbf371fhx /* ACE has no vsecattr.vsa_dfaclcnt */
c533a883a71cff9ff32df1c53c31201e1cbf371fhx }
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (isnontrivial);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China
c533a883a71cff9ff32df1c53c31201e1cbf371fhx/*
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China * Check whether we need a retry to recover from STALE error.
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China */
c533a883a71cff9ff32df1c53c31201e1cbf371fhxint
c533a883a71cff9ff32df1c53c31201e1cbf371fhxfs_need_estale_retry(int retry_count)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx{
c533a883a71cff9ff32df1c53c31201e1cbf371fhx if (retry_count < fs_estale_retry)
c533a883a71cff9ff32df1c53c31201e1cbf371fhx return (1);
c533a883a71cff9ff32df1c53c31201e1cbf371fhx else
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China return (0);
cdc64593cc1046229f4ac4daf5ead688b5efe6ebxinghua wen - Sun Microsystems - Beijing China}
c533a883a71cff9ff32df1c53c31201e1cbf371fhx