b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * This file and its contents are supplied under the terms of the
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * You may only use this file in accordance with the terms of version
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * 1.0 of the CDDL.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * A full copy of the text of the CDDL should have accompanied this
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * source. A copy of the CDDL is also available via the Internet at
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * http://www.illumos.org/license/CDDL.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/types.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/param.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/t_lock.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/errno.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/cred.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/user.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/uio.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/file.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/pathname.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/vfs.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/vnode.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/stat.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/mode.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/kmem.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/debug.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/atomic.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/acl.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/flock.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/nbmlock.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/fcntl.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/poll.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <sys/time.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <errno.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <fcntl.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include <unistd.h>
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#include "vncache.h"
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross#define O_RWMASK (O_WRONLY | O_RDWR) /* == 3 */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint fop_shrlock_enable = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint stat_to_vattr(const struct stat *, vattr_t *);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint fop__getxvattr(vnode_t *, xvattr_t *);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint fop__setxvattr(vnode_t *, xvattr_t *);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_open(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t **vpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int mode,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((*vpp)->v_type == VREG) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (mode & FREAD)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross atomic_add_32(&((*vpp)->v_rdcnt), 1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (mode & FWRITE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross atomic_add_32(&((*vpp)->v_wrcnt), 1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* call to ->vop_open was here */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_close(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int count,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t offset,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* call to ->vop_close was here */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Check passed in count to handle possible dups. Vnode counts are only
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * kept on regular files
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((vp->v_type == VREG) && (count == 1)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (flag & FREAD) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(vp->v_rdcnt > 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross atomic_add_32(&(vp->v_rdcnt), -1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (flag & FWRITE) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(vp->v_wrcnt > 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross atomic_add_32(&(vp->v_wrcnt), -1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_read(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio_t *uio,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int ioflag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct iovec *iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ssize_t resid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * If that caller asks for read beyond end of file,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * that causes the pread call to block. (Ugh!)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Get the file size and return what we can.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) fstat(vp->v_fd, &st);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross resid = uio->uio_resid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((uio->uio_loffset + resid) > st.st_size)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross resid = st.st_size - uio->uio_loffset;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross while (resid > 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(uio->uio_iovcnt > 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov = uio->uio_iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (iov->iov_len == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_iov++;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_iovcnt--;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cnt = iov->iov_len;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (cnt > resid)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cnt = resid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross n = pread(vp->v_fd, iov->iov_base, cnt, uio->uio_loffset);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (n < 0)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_base += n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_len -= n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_resid -= n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_loffset += n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross resid -= n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_write(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio_t *uio,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int ioflag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct iovec *iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross while (uio->uio_resid > 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(uio->uio_iovcnt > 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov = uio->uio_iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (iov->iov_len == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_iov++;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_iovcnt--;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross continue;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cnt = iov->iov_len;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (cnt > uio->uio_resid)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cnt = uio->uio_resid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross n = pwrite(vp->v_fd, iov->iov_base, iov->iov_len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_loffset);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (n < 0)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_base += n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_len -= n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_resid -= n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio->uio_loffset += n;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (ioflag == FSYNC) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) fsync(vp->v_fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_ioctl(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cmd,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross intptr_t arg,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int *rvalp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_setfl(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int oflags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int nflags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* allow any flags? See fs_setfl */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_getattr(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vattr_t *vap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int error;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fstat(vp->v_fd, &st) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = stat_to_vattr(&st, vap);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_XVATTR)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) fop__getxvattr(vp, (xvattr_t *)vap);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (error);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_setattr(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vattr_t *vap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross timespec_t times[2];
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_SIZE) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (ftruncate(vp->v_fd, vap->va_size) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* AT_MODE or anything else? */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_XVATTR)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) fop__setxvattr(vp, (xvattr_t *)vap);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & (AT_ATIME | AT_MTIME)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_ATIME) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[0] = vap->va_atime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[0].tv_sec = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[0].tv_nsec = UTIME_OMIT;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_MTIME) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[1] = vap->va_mtime;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[1].tv_sec = 0;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross times[1].tv_nsec = UTIME_OMIT;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) futimens(vp->v_fd, times);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_access(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int mode,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_lookup(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t **vpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross pathname_t *pnp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *rdir,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int *deflags, /* Returned per-dirent flags */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross pathname_t *ppnp) /* Returned case-preserved name in directory */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int fd;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int omode = O_RDWR | O_NOFOLLOW;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (flags & LOOKUP_XATTR)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOENT);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * If lookup is for "", just return dvp.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (name[0] == '\0') {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_hold(dvp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = dvp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fstatat(dvp->v_fd, name, &st, AT_SYMLINK_NOFOLLOW) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = vncache_lookup(&st);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp != NULL) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* lookup gave us a hold */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (S_ISDIR(st.st_mode))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode = O_RDONLY | O_NOFOLLOW;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossagain:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross fd = openat(dvp->v_fd, name, omode, 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fd < 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((omode & O_RWMASK) == O_RDWR) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode &= ~O_RWMASK;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode |= O_RDONLY;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross goto again;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fstat(fd, &st) == -1) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) close(fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = vncache_enter(&st, dvp, name, fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_create(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vattr_t *vap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vcexcl_t excl,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int mode,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t **vpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr_t *vsecp) /* ACL to set during create */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int err, fd, omode;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * If creating "", just return dvp.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (name[0] == '\0') {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_hold(dvp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = dvp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = fstatat(dvp->v_fd, name, &st, AT_SYMLINK_NOFOLLOW);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (err != 0)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = errno;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (err == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* The file already exists. */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (excl == EXCL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EEXIST);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = vncache_lookup(&st);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* vp gained a hold */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp == NULL) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Open it. (may or may not exist)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode = O_RDWR | O_CREAT | O_NOFOLLOW;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (excl == EXCL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode |= O_EXCL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross open_again:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross fd = openat(dvp->v_fd, name, omode, mode);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fd < 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((omode & O_RWMASK) == O_RDWR) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode &= ~O_RWMASK;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross omode |= O_RDONLY;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross goto open_again;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) fstat(fd, &st);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = vncache_enter(&st, dvp, name, fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* vp has its initial hold */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* Should have the vp now. */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp == NULL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EFAULT);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_type == VDIR && vap->va_type != VDIR) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_rele(vp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EISDIR);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_type != VDIR && vap->va_type == VDIR) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_rele(vp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOTDIR);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Might need to set attributes.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) fop_setattr(vp, vap, 0, cr, ct);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_remove(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (unlinkat(dvp->v_fd, name, 0))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_link(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *to_dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *fr_vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *to_name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int err;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Would prefer to specify "from" as the combination:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * (fr_vp->v_fd, NULL) but linkat does not permit it.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = linkat(AT_FDCWD, fr_vp->v_path, to_dvp->v_fd, to_name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross AT_SYMLINK_FOLLOW);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (err == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = errno;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (err);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_rename(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *from_dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *from_name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *to_dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *to_name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int err;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fstatat(from_dvp->v_fd, from_name, &st,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross AT_SYMLINK_NOFOLLOW) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp = vncache_lookup(&st);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp == NULL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOENT);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = renameat(from_dvp->v_fd, from_name, to_dvp->v_fd, to_name);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (err == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = errno;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross else
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vncache_renamed(vp, to_dvp, to_name);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vn_rele(vp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (err);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_mkdir(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vattr_t *vap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t **vpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr_t *vsecp) /* ACL to set during create */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct stat st;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int err, fd;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mode_t mode = vap->va_mode & 0777;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (mkdirat(dvp->v_fd, name, mode) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((fd = openat(dvp->v_fd, name, O_RDONLY)) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fstat(fd, &st) == -1) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross err = errno;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross (void) close(fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (err);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *vpp = vncache_enter(&st, dvp, name, fd);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Might need to set attributes.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross (void) fop_setattr(*vpp, vap, 0, cr, ct);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_rmdir(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *name,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *cdir,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (unlinkat(dvp->v_fd, name, AT_REMOVEDIR) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_readdir(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio_t *uiop,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int *eofp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct iovec *iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int error = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int fd = vp->v_fd;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (eofp) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *eofp = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = lseek(fd, uiop->uio_loffset, SEEK_SET);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (error == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(uiop->uio_iovcnt > 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov = uiop->uio_iov;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (iov->iov_len < sizeof (struct dirent))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* LINTED E_BAD_PTR_CAST_ALIGN */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cnt = getdents(fd, (struct dirent *)(uiop->uio_iov->iov_base),
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uiop->uio_resid);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (cnt == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (cnt == 0) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (eofp) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *eofp = 1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOENT);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_base += cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross iov->iov_len -= cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uiop->uio_resid -= cnt;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uiop->uio_loffset = lseek(fd, 0LL, SEEK_CUR);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_symlink(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *dvp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *linkname,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vattr_t *vap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross char *target,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_readlink(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uio_t *uiop,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_fsync(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int syncflag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fsync(vp->v_fd) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_inactive(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vncache_inactive(vp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_fid(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross fid_t *fidp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_rwlock(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int write_lock,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* See: fs_rwlock */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (-1);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_rwunlock(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int write_lock,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* See: fs_rwunlock */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_seek(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t ooff,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t *noffp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_cmp(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp1,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp2,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* See fs_cmp */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (vncache_cmp(vp1, vp2));
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_frlock(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cmd,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross flock64_t *bfp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t offset,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct flk_callback *flk_cbp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* See fs_frlock */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (cmd) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_GETLK:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SETLK_NBMAND:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SETLK:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SETLKW:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fcntl(vp->v_fd, cmd, bfp) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_space(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cmd,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross flock64_t *bfp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t offset,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross /* See fs_frlock */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (cmd) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_ALLOCSP:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_FREESP:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fcntl(vp->v_fd, cmd, bfp) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_realvp(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t **vpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_getpage(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t *protp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct page **plarr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t plsz,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct seg *seg,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caddr_t addr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross enum seg_rw rw,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_putpage(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_map(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct as *as,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caddr_t *addrp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uchar_t prot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uchar_t maxprot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_addmap(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct as *as,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caddr_t addr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uchar_t prot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uchar_t maxprot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_delmap(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct as *as,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caddr_t addr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t prot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t maxprot,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross uint_t flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_poll(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross short events,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int anyyet,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross short *reventsp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct pollhead **phpp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (events & POLLIN)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp |= POLLIN;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (events & POLLRDNORM)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp |= POLLRDNORM;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (events & POLLRDBAND)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp |= POLLRDBAND;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (events & POLLOUT)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp |= POLLOUT;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (events & POLLWRBAND)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *reventsp |= POLLWRBAND;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *phpp = NULL; /* or fake_pollhead? */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_dump(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caddr_t addr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t lbdn,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t dblks,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * See fs_pathconf
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_pathconf(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cmd,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ulong_t *valp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross register ulong_t val;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross register int error = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (cmd) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_LINK_MAX:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = MAXLINK;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_MAX_CANON:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = MAX_CANON;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_MAX_INPUT:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = MAX_INPUT;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_NAME_MAX:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = MAXNAMELEN;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_PATH_MAX:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_SYMLINK_MAX:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = MAXPATHLEN;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_PIPE_BUF:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = PIPE_BUF;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_NO_TRUNC:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = (ulong_t)-1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_VDISABLE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = _POSIX_VDISABLE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_CHOWN_RESTRICTED:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = 1; /* chown restricted enabled */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_FILESIZEBITS:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = (ulong_t)-1; /* large file support */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_ACL_ENABLED:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_CASE_BEHAVIOR:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = _CASE_SENSITIVE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_SATTR_ENABLED:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_SATTR_EXISTS:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case _PC_ACCESS_FILTERING:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross val = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross error = EINVAL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (error == 0)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *valp = val;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (error);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_pageio(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct page *pp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross u_offset_t io_off,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t io_len,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flags,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_dumpctl(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int action,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross offset_t *blkp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_dispose(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct page *pp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int dn,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_setsecattr(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr_t *vsap,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Fake up just enough of this so we can test get/set SDs.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_getsecattr(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr_t *vsecattr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclcnt = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclentsz = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclentp = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_dfaclcnt = 0; /* Default ACLs are not fabricated */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_dfaclentp = NULL;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vsecattr->vsa_mask & (VSA_ACLCNT | VSA_ACL)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclent_t *aclentp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross size_t aclsize;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclsize = sizeof (aclent_t);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclcnt = 1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclentp = kmem_zalloc(aclsize, KM_SLEEP);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclentp = vsecattr->vsa_aclentp;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclentp->a_type = OTHER_OBJ;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclentp->a_perm = 0777;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclentp->a_id = (gid_t)-1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross aclentp++;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross } else if (vsecattr->vsa_mask & (VSA_ACECNT | VSA_ACE)) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ace_t *acl;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross acl = kmem_alloc(sizeof (ace_t), KM_SLEEP);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross acl->a_who = (uint32_t)-1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross acl->a_type = ACE_ACCESS_ALLOWED_ACE_TYPE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross acl->a_flags = ACE_EVERYONE;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross acl->a_access_mask = ACE_MODIFY_PERMS;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclentp = (void *)acl;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclcnt = 1;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vsecattr->vsa_aclentsz = sizeof (ace_t);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_shrlock(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int cmd,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross struct shrlock *shr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross int flag,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (cmd) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SHARE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_SHARE_NBMAND:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case F_UNSHARE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross default:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (EINVAL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (!fop_shrlock_enable)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (fcntl(vp->v_fd, cmd, shr) == -1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (errno);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_vnevent(vnode_t *vp, vnevent_t vnevent, vnode_t *dvp, char *fnm,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_reqzcbuf(vnode_t *vp, enum uio_rw ioflag, xuio_t *uiop, cred_t *cr,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossfop_retzcbuf(vnode_t *vp, xuio_t *uiop, cred_t *cr, caller_context_t *ct)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (ENOSYS);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * ***************************************************************
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * other VOP support
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Convert stat(2) formats to vnode types and vice versa. (Knows about
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * numerical order of S_IFMT and vnode types.)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossenum vtype iftovt_tab[] = {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VNON, VFIFO, VCHR, VNON, VDIR, VNON, VBLK, VNON,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VREG, VNON, VLNK, VNON, VSOCK, VNON, VNON, VNON
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross};
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossushort_t vttoif_tab[] = {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross 0, S_IFREG, S_IFDIR, S_IFBLK, S_IFCHR, S_IFLNK, S_IFIFO,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross S_IFDOOR, 0, S_IFSOCK, S_IFPORT, 0
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross};
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * stat_to_vattr()
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Convert from a stat structure to an vattr structure
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Note: only set fields according to va_mask
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossstat_to_vattr(const struct stat *st, vattr_t *vap)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_TYPE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_type = IFTOVT(st->st_mode);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_MODE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_mode = st->st_mode;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_UID)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_uid = st->st_uid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_GID)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_gid = st->st_gid;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_FSID)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_fsid = st->st_dev;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_NODEID)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_nodeid = st->st_ino;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_NLINK)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_nlink = st->st_nlink;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_SIZE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_size = (u_offset_t)st->st_size;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_ATIME) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_atime.tv_sec = st->st_atim.tv_sec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_atime.tv_nsec = st->st_atim.tv_nsec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_MTIME) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_mtime.tv_sec = st->st_mtim.tv_sec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_mtime.tv_nsec = st->st_mtim.tv_nsec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_CTIME) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_ctime.tv_sec = st->st_ctim.tv_sec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_ctime.tv_nsec = st->st_ctim.tv_nsec;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_RDEV)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_rdev = st->st_rdev;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_BLKSIZE)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_blksize = (uint_t)st->st_blksize;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_NBLOCKS)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_nblocks = (u_longlong_t)st->st_blocks;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vap->va_mask & AT_SEQ)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vap->va_seq = 0;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossflk_init_callback(flk_callback_t *flk_cb,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross callb_cpr_t *(*cb_fcn)(flk_cb_when_t, void *), void *cbdata)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_hold(vnode_t *vp)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_enter(&vp->v_lock);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp->v_count++;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_exit(&vp->v_lock);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvoid
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_rele(vnode_t *vp)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross VERIFY3U(vp->v_count, !=, 0);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_enter(&vp->v_lock);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_count == 1) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_exit(&vp->v_lock);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vncache_inactive(vp);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross } else {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vp->v_count--;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross mutex_exit(&vp->v_lock);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_has_other_opens(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross v_mode_t mode)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (mode) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_WRITE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_wrcnt > 1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_RDORWR:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((vp->v_rdcnt > 1) || (vp->v_wrcnt > 1))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_RDANDWR:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if ((vp->v_rdcnt > 1) && (vp->v_wrcnt > 1))
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_READ:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_rdcnt > 1)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_FALSE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * vn_is_opened() checks whether a particular file is opened and
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * whether the open is for read and/or write.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * Vnode counts are only kept on regular files (v_type=VREG).
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_is_opened(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross v_mode_t mode)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross ASSERT(vp != NULL);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross switch (mode) {
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_WRITE:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_wrcnt)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_RDANDWR:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_rdcnt && vp->v_wrcnt)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_RDORWR:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_rdcnt || vp->v_wrcnt)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross case V_READ:
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (vp->v_rdcnt)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_TRUE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross break;
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross }
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_FALSE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/*
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * vn_is_mapped() checks whether a particular file is mapped and whether
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross * the file is mapped read and/or write.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross/* ARGSUSED */
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossint
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Rossvn_is_mapped(
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross vnode_t *vp,
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross v_mode_t mode)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross return (V_FALSE);
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross}