/*
 * cnode.h -- Vic Abell's definition of an nsc_cfs node - with help from
 *	      the kind folks at SCO
 */

/*
 * Copyright 2001 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Victor A. Abell
 *
 * This software is not subject to any license of the American Telephone
 * and Telegraph Company or the Regents of the University of California.
 *
 * Permission is granted to anyone to use this software for any purpose on
 * any computer system, and to alter it and redistribute it freely, subject
 * to the following restrictions:
 *
 * 1. Neither the authors nor Purdue University are responsible for any
 *    consequences of the use of this software.
 *
 * 2. The origin of this software must not be misrepresented, either by
 *    explicit claim or by omission.  Credit to the authors and Purdue
 *    University must appear in documentation and sources.
 *
 * 3. Altered versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 4. This notice may not be removed or altered.
 */

#if !defined(FS_NSC_CFS_CNODE_H)
#    define FS_NSC_CFS_CNODE_H 1

#    include <sys/nsc_synch.h>

/*
 * chandle_t definition from the kernel's <fs/nsc_cfs/cfs.h>
 */

#    define CFS_FHSIZE 44

typedef struct cfhandle {
    char fh_data[CFS_FHSIZE];
} cfhandle_t;

/*
 * CFS node structure
 */

typedef struct cnode {
    struct cnode *c_freef; /* free list forward pointer */
    struct cnode *c_freeb; /* free list back pointer */
    struct cnode *c_hash;  /* cnode hash chain */
    struct vnode c_vnode;  /* vnode for remote file */
    cfhandle_t c_fh;       /* file handle */
    void *c_hp;            /* Hash pointer */
    u_long c_flags;        /* flags, see below */
    union {
        daddr_t C_nextr;  /* next byte read offset (read-ahead) */
        int C_lastcookie; /* last readdir cookie */
    } c_c;
    long c_owner;         /* proc index for locker of cnode */
    long c_count;         /* number of cnode locks for c_owner */
    long c_lwpid;         /* lwp id of locker of cnode */
    CONDITION_T c_cxlock; /* Synch structure */
    int c_rw_excl;        /* RW locked exclusively */
    /* Credentials here are only for use by cfs-as-nfs-client. */
    struct cred *c_cred; /* current credentials */
    struct vattr c_attr; /* cached vnode attributes */
                         /*
                          * Lsof needs nothing below c_attr.
                          */
} cnode_t;
#endif /* !defined(FS_NSC_CFS_CNODE_H) */
