4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Copyright (c) 2000-2001, Boris Popov
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Redistribution and use in source and binary forms, with or without
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * modification, are permitted provided that the following conditions
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are met:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 1. Redistributions of source code must retain the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 2. Redistributions in binary form must reproduce the above copyright
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * notice, this list of conditions and the following disclaimer in the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * documentation and/or other materials provided with the distribution.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 3. All advertising materials mentioning features or use of this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * must display the following acknowledgement:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * This product includes software developed by Boris Popov.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 4. Neither the name of the author nor the names of any co-contributors
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * may be used to endorse or promote products derived from this software
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * without specific prior written permission.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * SUCH DAMAGE.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * $Id: smbfs_node.h,v 1.31.52.1 2005/05/27 02:35:28 lindak Exp $
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross * Copyright 2011 Nexenta Systems, Inc. All rights reserved.
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Use is subject to license terms.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifndef _FS_SMBFS_NODE_H_
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define _FS_SMBFS_NODE_H_
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Much code copied into here from Sun NFS.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Compare with nfs_clnt.h
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/avl.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#include <sys/list.h>
430b4c467020edf2445feb0c21db01c88b86243aGordon Ross#include <netsmb/smb_subr.h>
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef __cplusplus
4bff34e37def8a90f9194d81bc345c52ba20086athurlowextern "C" {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Cache whole directories (not yet)
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct rddir_cache {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow lloff_t _cookie; /* cookie used to find this cache entry */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow lloff_t _ncookie; /* cookie used to find the next cache entry */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow char *entries; /* buffer containing dirent entries */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int eof; /* EOF reached after this request */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int entlen; /* size of dirent entries in buf */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int buflen; /* size of the buffer used to store entries */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int flags; /* control flags, see below */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kcondvar_t cv; /* cv for blocking */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int error; /* error from RPC operation */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kmutex_t lock;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uint_t count; /* reference count */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow avl_node_t tree; /* AVL tree links */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} rddir_cache;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define smbfs_cookie _cookie._p._l
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define smbfs_ncookie _ncookie._p._l
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define smbfs3_cookie _cookie._f
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define smbfs3_ncookie _ncookie._f
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDDIR 0x1 /* readdir operation in progress */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDDIRWAIT 0x2 /* waiting on readdir in progress */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDDIRREQ 0x4 /* a new readdir is required */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDDIRCACHED 0x8 /* entry is in the cache */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define HAVE_RDDIR_CACHE(rp) (avl_numnodes(&(rp)->r_dir) > 0)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * A homegrown reader/writer lock implementation. It addresses
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * two requirements not addressed by the system primitives. They
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * are that the `enter" operation is optionally interruptible and
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * that that they can be re`enter'ed by writers without deadlock.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smbfs_rwlock {
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int count;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow int waiters;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kthread_t *owner;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kmutex_t lock;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kcondvar_t cv;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} smbfs_rwlock_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * The format of the smbfs node header, which contains the
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * fields used to link nodes in the AVL tree, and those
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * fields needed by the AVL node comparison functions.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * It's a separate struct so we can call avl_find with
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * this relatively small struct as a stack local.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * The AVL tree is mntinfo.smi_hash_avl,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and its lock is mntinfo.smi_hash_lk.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Rosstypedef struct smbfs_node_hdr {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Our linkage in the node cache AVL tree.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross avl_node_t hdr_avl_node;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Identity of this node: The full path name,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * in server form, relative to the share root.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross char *hdr_n_rpath;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int hdr_n_rplen;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross} smbfs_node_hdr_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Below is the SMBFS-specific representation of a "node".
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * This struct is a mixture of Sun NFS and Darwin code.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Fields starting with "r_" came from NFS struct "rnode"
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and fields starting with "n_" came from Darwin, or
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * were added during the Solaris port. We have avoided
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * renaming fields so we would not cause excessive
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * changes in the code using this struct.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Now using an AVL tree instead of hash lists, but kept the
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * "hash" in some member names and functions to reduce churn.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * One AVL tree per mount replaces the global hash buckets.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Notes carried over from the NFS code:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * The smbnode is the "inode" for remote files. It contains all the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * information necessary to handle remote file on the client side.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Note on file sizes: we keep two file sizes in the smbnode: the size
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * according to the client (r_size) and the size according to the server
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * (r_attr.fa_size). They can differ because we modify r_size during a
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * write system call (smbfs_rdwr), before the write request goes over the
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * wire (before the file is actually modified on the server). If an OTW
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * request occurs before the cached data is written to the server the file
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * size returned from the server (r_attr.fa_size) may not match r_size.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * r_size is the one we use, in general. r_attr.fa_size is only used to
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * determine whether or not our cached data is valid.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Each smbnode has 3 locks associated with it (not including the smbnode
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * "hash" AVL tree and free list locks):
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_rwlock: Serializes smbfs_write and smbfs_setattr requests
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * and allows smbfs_read requests to proceed in parallel.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Serializes reads/updates to directories.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_lkserlock: Serializes lock requests with map, write, and
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * readahead operations.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_statelock: Protects all fields in the smbnode except for
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * those listed below. This lock is intented
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * to be held for relatively short periods of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * time (not accross entire putpage operations,
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * for example).
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * The following members are protected by the mutex smbfreelist_lock:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_freef
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_freeb
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * The following members are protected by the AVL tree rwlock:
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * r_avl_node (r__hdr.hdr_avl_node)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Note: r_modaddr is only accessed when the r_statelock mutex is held.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Its value is also controlled via r_rwlock. It is assumed that
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * there will be only 1 writer active at a time, so it safe to
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * set r_modaddr and release r_statelock as long as the r_rwlock
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * writer lock is held.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * 64-bit offsets: the code formerly assumed that atomic reads of
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_size were safe and reliable; on 32-bit architectures, this is
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * not true since an intervening bus cycle from another processor
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * could update half of the size field. The r_statelock must now
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * be held whenever any kind of access of r_size is made.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow *
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Lock ordering:
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * r_rwlock > r_lkserlock > r_statelock
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlowtypedef struct smbnode {
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* Our linkage in the node cache AVL tree (see above). */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_node_hdr_t r__hdr;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /* short-hand names for r__hdr members */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define r_avl_node r__hdr.hdr_avl_node
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define n_rpath r__hdr.hdr_n_rpath
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define n_rplen r__hdr.hdr_n_rplen
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbmntinfo_t *n_mount; /* VFS data */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross vnode_t *r_vnode; /* associated vnode */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Linkage in smbfreelist, for reclaiming nodes.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Lock for the free list is: smbfreelist_lock
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct smbnode *r_freef; /* free list forward pointer */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow struct smbnode *r_freeb; /* free list back pointer */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfs_rwlock_t r_rwlock; /* serialize write/setattr requests */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow smbfs_rwlock_t r_lkserlock; /* serialize lock with other ops */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross kmutex_t r_statelock; /* protect (most) smbnode fields */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * File handle, directory search handle,
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * and reference counts for them, etc.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Lock for these is: r_lkserlock
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int n_dirrefs;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross struct smbfs_fctx *n_dirseq; /* ff context */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int n_dirofs; /* last ff offset */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int n_fidrefs;
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross uint16_t n_fid; /* file handle */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross enum vtype n_ovtype; /* vnode type opened */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross uint32_t n_rights; /* granted rights */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross int n_vcgenid; /* gereration no. (reconnect) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Misc. bookkeeping
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow cred_t *r_cred; /* current credentials */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross u_offset_t r_nextr; /* next read offset (read-ahead) */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow long r_mapcnt; /* count of mmapped pages */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uint_t r_count; /* # of refs not reflect in v_count */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uint_t r_awcount; /* # of outstanding async write */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uint_t r_gcount; /* getattrs waiting to flush pages */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross uint_t r_flags; /* flags, see below */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross uint32_t n_flag; /* NXXX flags below */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross uint_t r_error; /* async write error */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kcondvar_t r_cv; /* condvar for blocked threads */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow avl_tree_t r_dir; /* cache of readdir responses */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow rddir_cache *r_direof; /* pointer to the EOF entry */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow kthread_t *r_serial; /* id of purging thread */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow list_t r_indelmap; /* list of delmap callers */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
4bff34e37def8a90f9194d81bc345c52ba20086athurlow /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Attributes: local, and as last seen on the server.
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * See notes above re: r_size vs r_attr.fa_size, etc.
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross smbfattr_t r_attr; /* attributes from the server */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross hrtime_t r_attrtime; /* time attributes become invalid */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross hrtime_t r_mtime; /* client time file last modified */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross len_t r_size; /* client's view of file size */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross /*
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross * Security attributes.
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross */
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross vsecattr_t r_secattr;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross hrtime_t r_sectime;
bd7c6f51f14365fc31d408903b38c02177384d3dGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross /*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Other attributes, not carried in smbfattr_t
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross u_longlong_t n_ino;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow uid_t n_uid;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow gid_t n_gid;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow mode_t n_mode;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow} smbnode_t;
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Flag bits in: smbnode_t .n_flag
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NFLUSHINPROG 0x00001
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NFLUSHWANT 0x00002 /* they should gone ... */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NMODIFIED 0x00004 /* bogus, until async IO implemented */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NREFPARENT 0x00010 /* node holds parent from recycling */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NGOTIDS 0x00020
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NRDIRSERIAL 0x00080 /* serialize readdir operation */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NISMAPPED 0x00800
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NFLUSHWIRE 0x01000
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NATTRCHANGED 0x02000 /* kill cached attributes at close */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NALLOC 0x04000 /* being created */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define NWALLOC 0x08000 /* awaiting creation */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define N_XATTR 0x10000 /* extended attribute (dir or file) */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * Flag bits in: smbnode_t .r_flags
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RREADDIRPLUS 0x1 /* issue a READDIRPLUS instead of READDIR */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDIRTY 0x2 /* dirty pages from write operation */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RSTALE 0x4 /* file handle is stale */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RMODINPROGRESS 0x8 /* page modification happening */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RTRUNCATE 0x10 /* truncating, don't commit */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RHAVEVERF 0x20 /* have a write verifier to compare against */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RCOMMIT 0x40 /* commit in progress */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RCOMMITWAIT 0x80 /* someone is waiting to do a commit */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define RHASHED 0x100 /* smbnode is in the "hash" AVL tree */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define ROUTOFSPACE 0x200 /* an out of space error has happened */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDIRECTIO 0x400 /* bypass the buffer cache */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RLOOKUP 0x800 /* a lookup has been performed */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RWRITEATTR 0x1000 /* attributes came from WRITE */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RINDNLCPURGE 0x2000 /* in the process of purging DNLC references */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define RDELMAPLIST 0x4000 /* delmap callers tracking for as callback */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
4bff34e37def8a90f9194d81bc345c52ba20086athurlow * Convert between vnode and smbnode
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define VTOSMB(vp) ((smbnode_t *)((vp)->v_data))
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#define SMBTOV(np) ((np)->r_vnode)
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow/*
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * A macro to compute the separator that should be used for
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross * names under some directory. See smbfs_fullpath().
4bff34e37def8a90f9194d81bc345c52ba20086athurlow */
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross#define SMBFS_DNP_SEP(dnp) \
02d09e03eb27f3a2dc299de704e45dae5173f43fGordon Ross (((dnp->n_flag & N_XATTR) == 0 && dnp->n_rplen > 1) ? '\\' : '\0')
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#ifdef __cplusplus
4bff34e37def8a90f9194d81bc345c52ba20086athurlow}
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif
4bff34e37def8a90f9194d81bc345c52ba20086athurlow
4bff34e37def8a90f9194d81bc345c52ba20086athurlow#endif /* _FS_SMBFS_NODE_H_ */