1 /*
   2  * CDDL HEADER START
   3  *
   4  * The contents of this file are subject to the terms of the
   5  * Common Development and Distribution License (the "License").
   6  * You may not use this file except in compliance with the License.
   7  *
   8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
   9  * or http://www.opensolaris.org/os/licensing.
  10  * See the License for the specific language governing permissions
  11  * and limitations under the License.
  12  *
  13  * When distributing Covered Code, include this CDDL HEADER in each
  14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  15  * If applicable, add the following below this CDDL HEADER, with the
  16  * fields enclosed by brackets "[]" replaced with your own identifying
  17  * information: Portions Copyright [yyyy] [name of copyright owner]
  18  *
  19  * CDDL HEADER END
  20  */
  21 
  22 /*
  23  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 /*
  28  * Copyright 2018 Nexenta Systems, Inc.
  29  */
  30 
  31 #ifndef _SHAREFS_SHAREFS_H
  32 #define _SHAREFS_SHAREFS_H
  33 
  34 /*
  35  * This header provides service for the sharefs module.
  36  */
  37 
  38 #include <sys/modctl.h>
  39 #include <sys/vfs.h>
  40 #include <sys/vnode.h>
  41 #include <sys/gfs.h>
  42 #include <sharefs/share.h>
  43 #include <sharefs/sharetab.h>
  44 
  45 #ifdef __cplusplus
  46 extern "C" {
  47 #endif
  48 
  49 #define SHAREFS_ROOT    "/etc/dfs"
  50 #define SHAREFS_BASE    "sharetab"
  51 
  52 /*
  53  * Lengths of strings.
  54  */
  55 typedef struct sharefs_lens {
  56         int     shl_path;
  57         int     shl_res;
  58         int     shl_fstype;
  59         int     shl_opts;
  60         int     shl_descr;
  61 } sharefs_lens_t;
  62 
  63 /*
  64  * VFS data object
  65  */
  66 typedef struct sharefs_vfs {
  67         vnode_t *sharefs_vfs_root;
  68 } sharefs_vfs_t;
  69 
  70 #define SHAREFS_NAME_MAX        MAXNAMELEN
  71 
  72 typedef struct sharetab_globals {
  73         /*
  74          * The lock ordering whenever sharefs_lock and sharetab_lock both
  75          * need to be held is: sharefs_lock and then sharetab_lock.
  76          */
  77         krwlock_t       sharefs_lock;   /* lock for the vnode ops */
  78         sharetab_t      *sharefs_sharetab;      /* The sharetab. */
  79 
  80         uint_t          sharetab_count; /* How many shares? */
  81         krwlock_t       sharetab_lock;  /* lock for the cached sharetab */
  82         size_t          sharetab_size;  /* How big is the sharetab file? */
  83 
  84         timestruc_t     sharetab_mtime; /* Last mod to sharetab */
  85         timestruc_t     sharetab_snap_time;     /* Last snap */
  86         uint_t          sharetab_generation;    /* Which copy is it? */
  87 } sharetab_globals_t;
  88 
  89 #define SHAREFS_INO_FILE        0x80
  90 
  91 extern vnode_t *sharefs_create_root_file(vfs_t *);
  92 extern sharetab_globals_t *sharetab_get_globals(zone_t *zone);
  93 
  94 /*
  95  * Sharetab file
  96  *
  97  * Note that even though the sharetab code does not explictly
  98  * use 'sharefs_file', it is required by GFS that the first
  99  * field of the private data be a gfs_file_t.
 100  */
 101 typedef struct shnode_t {
 102         gfs_file_t      sharefs_file;           /* gfs file */
 103         char            *sharefs_snap;          /* snapshot of the share */
 104         size_t          sharefs_size;           /* size of the snapshot */
 105         uint_t          sharefs_count;          /* number of shares */
 106         uint_t          sharefs_refs;           /* reference count */
 107         uint_t          sharefs_real_vp;        /* Are we a real or snap */
 108         uint_t          sharefs_generation;     /* Which copy are we? */
 109         timestruc_t     sharefs_snap_time;      /* When were we modded? */
 110 } shnode_t;
 111 
 112 /*
 113  * Some conversion macros:
 114  */
 115 #define VTOSH(vp)       ((shnode_t *)((vp)->v_data))
 116 
 117 extern const fs_operation_def_t sharefs_tops_data[];
 118 extern vnodeops_t               *sharefs_ops_data;
 119 
 120 extern void sharefs_data_init(void);
 121 
 122 extern void sharefs_sharetab_init(void);
 123 
 124 #ifdef __cplusplus
 125 }
 126 #endif
 127 
 128 #endif /* !_SHAREFS_SHAREFS_H */