1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2014 Joyent, Inc.  All rights reserved.
  14  * Copyright (c) 2014, Tegile Systems Inc. All rights reserved.
  15  */
  16 
  17 #ifndef _SYS_SCSI_ADAPTERS_MPTSAS3_HASH_H
  18 #define _SYS_SCSI_ADAPTERS_MPTSAS3_HASH_H
  19 
  20 #include <sys/types.h>
  21 #include <sys/list.h>
  22 
  23 #define RHL_F_DEAD      0x01
  24 
  25 typedef struct refhash_link {
  26         list_node_t rhl_chain_link;
  27         list_node_t rhl_global_link;
  28         uint_t rhl_flags;
  29         uint_t rhl_refcnt;
  30 } refhash_link_t;
  31 
  32 typedef uint64_t (*refhash_hash_f)(const void *);
  33 typedef int (*refhash_cmp_f)(const void *, const void *);
  34 typedef void (*refhash_dtor_f)(void *);
  35 typedef int (*refhash_eval_f)(const void *, void *);
  36 
  37 typedef struct refhash {
  38         list_t *rh_buckets;
  39         uint_t rh_bucket_count;
  40         list_t rh_objs;
  41         size_t rh_obj_size;     /* used by mdb */
  42         size_t rh_link_off;
  43         size_t rh_tag_off;
  44         refhash_hash_f rh_hash;
  45         refhash_cmp_f rh_cmp;
  46         refhash_dtor_f rh_dtor;
  47 } refhash_t;
  48 
  49 extern refhash_t *refhash_create(uint_t, refhash_hash_f, refhash_cmp_f,
  50     refhash_dtor_f, size_t, size_t, size_t, int);
  51 extern void refhash_destroy(refhash_t *);
  52 extern void refhash_insert(refhash_t *, void *);
  53 extern void refhash_remove(refhash_t *, void *);
  54 extern void *refhash_lookup(refhash_t *, const void *);
  55 extern void *refhash_linear_search(refhash_t *, refhash_eval_f, void *);
  56 extern void refhash_hold(refhash_t *, void *);
  57 extern void refhash_rele(refhash_t *, void *);
  58 extern void *refhash_first(refhash_t *);
  59 extern void *refhash_next(refhash_t *, void *);
  60 extern boolean_t refhash_obj_valid(refhash_t *hp, const void *);
  61 
  62 #endif  /* _SYS_SCSI_ADAPTERS_MPTSAS3_HASH_H */