root/usr/src/uts/common/nfs/nfs4_idmap_impl.h
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
 */

#ifndef _NFS4_IDMAP_IMPL_H
#define _NFS4_IDMAP_IMPL_H

#include <sys/list.h>
#include <sys/door.h>
#include <sys/pkp_hash.h>

/*
 * This is a private header file.  Applications should not directly include
 * this file.
 */

#ifdef  __cplusplus
extern "C" {
#endif

/*
 * Cache Entry Definitions
 */
#define NFSID_CACHE_ANCHORS     PKP_HASH_SIZE

typedef struct nfsidmap {
        struct nfsidmap *id_chain[2];   /* must be first */
        time_t           id_time;       /* time stamp */
        uid_t            id_no;         /* uid/gid */
        utf8string       id_str;        /* user@domain string */
} nfsidmap_t;

#define id_forw                 id_chain[0]
#define id_back                 id_chain[1]
#define id_len                  id_str.utf8string_len
#define id_val                  id_str.utf8string_val

typedef struct nfsidhq {
        union {
                struct nfsidhq  *hq_head[2];    /* for empty queue */
                struct nfsidmap *hq_chain[2];   /* for LRU list */
        } hq_link;
        kmutex_t        hq_lock;                /* protects hash queue */
} nfsidhq_t;

#define hq_que_forw             hq_link.hq_head[0]
#define hq_que_back             hq_link.hq_head[1]
#define hq_lru_forw             hq_link.hq_chain[0]
#define hq_lru_back             hq_link.hq_chain[1]

typedef struct {
        const char      *name;          /* cache name */
        nfsidhq_t       *table;         /* hash table */
        /*
         * Since we need to know the status of nfsmapid from random functions
         * that deal with idmap caches, we keep a pointer to the relevant fields
         * in the zone's globals so we don't have to keep passing them around.
         */
        door_handle_t           *nfsidmap_daemon_dh;
} idmap_cache_info_t;

typedef enum hash_stat { HQ_HASH_HINT, HQ_HASH_FIND } hash_stat;

/*
 * Per-zone modular globals
 */
struct nfsidmap_globals {
        list_node_t             nig_link; /* linkage into global list */
        enum clnt_stat          nig_last_stat;  /* status of last RPC call */
        int                     nig_msg_done;   /* have we printed a message? */
        idmap_cache_info_t      u2s_ci; /* table mapping uid-to-string */
        idmap_cache_info_t      s2u_ci; /* table mapping string-to-uid */
        idmap_cache_info_t      g2s_ci; /* table mapping groupid-to-string */
        idmap_cache_info_t      s2g_ci; /* table mapping string-to-groupid */
        pid_t                   nfsidmap_pid;
        kmutex_t                nfsidmap_daemon_lock;
        /*
         * nfsidmap_daemon_lock protects the following:
         *      nfsidmap_daemon_dh
         */
        door_handle_t           nfsidmap_daemon_dh;
};

#ifdef  __cplusplus
}
#endif

#endif /* _NFS4_IDMAP_IMPL_H */