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  * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  *
  25  * Copyright 2017 Nexenta Systems, Inc.  All rights reserved.
  26  */
  27 
  28 #ifndef _SYS_VFS_OPREG_H
  29 #define _SYS_VFS_OPREG_H
  30 
  31 #include <sys/vfs.h>
  32 #include <sys/fem.h>
  33 
  34 #ifdef  __cplusplus
  35 extern "C" {
  36 #endif
  37 
  38 #if defined(_KERNEL) || defined(_FAKE_KERNEL)
  39 
  40 /*
  41  * The following union allows us to use C99's "designated initializer"
  42  * feature so that we can have strong typechecking for the operations
  43  * used in the the fs_operation_def structures.
  44  */
  45 
  46 typedef union fs_func {
  47         fs_generic_func_p fs_generic;   /* Generic function signature */
  48         int (*error)();                 /* Signature of error function */
  49         VFS_OPS;                /* Signatures of all vfs operations (vfsops) */
  50         VNODE_OPS;              /* Signatures of all vnode operations (vops) */
  51         FEM_OPS;                /* Signatures of all FEM operations (femops) */
  52         FSEM_OPS;               /* Signatures of all FSEM ops (fsemops) */
  53 } fs_func_p;
  54 
  55 /*
  56  * File systems use arrays of fs_operation_def structures to form
  57  * name/value pairs of operations.  These arrays get passed to:
  58  *
  59  *      - vn_make_ops() to create vnodeops
  60  *      - vfs_makefsops()/vfs_setfsops() to create vfsops.
  61  */
  62 typedef struct fs_operation_def {
  63         char *name;                     /* name of operation (NULL at end) */
  64         fs_func_p func;                 /* function implementing operation */
  65 } fs_operation_def_t;
  66 
  67 /*
  68  * The operation registration mechanism uses two master tables of operations:
  69  * one for vnode operations (vn_ops_table[]) and one for vfs operations
  70  * (vfs_ops_table[]).  These tables are arrays of fs_operation_trans_def
  71  * structures.  They contain all of the information necessary for the system
  72  * to populate an operations structure (e.g., vnodeops, vfsops).
  73  *
  74  * File systems call registration routines (vfs_setfsops(), vfs_makefsops(),
  75  * and vn_make_ops()) and pass in their operations specification tables
  76  * (arrays of fs_operation_def structures).  These routines use the master
  77  * table(s) of operations to build a vnodeops or vfsops structure.
  78  */
  79 typedef struct fs_operation_trans_def {
  80         char *name;                     /* name of operation (NULL at end) */
  81         int offset;                     /* byte offset within ops vector */
  82         fs_generic_func_p defaultFunc;  /* default function */
  83         fs_generic_func_p errorFunc;    /* error function */
  84 } fs_operation_trans_def_t;
  85 
  86 /*
  87  * Generic operations vector types (used for vfs/vnode ops registration).
  88  */
  89 
  90 extern int fs_default();                /* "default" function placeholder */
  91 extern int fs_error();                  /* "error" function placeholder */
  92 
  93 int fs_build_vector(void *vector, int *unused_ops,
  94     const fs_operation_trans_def_t *translation,
  95     const fs_operation_def_t *operations);
  96 
  97 /*
  98  * Public operations.
  99  */
 100 
 101 int     vn_make_ops(const char *, const struct fs_operation_def *,
 102                 vnodeops_t **);
 103 void    vn_freevnodeops(vnodeops_t *);
 104 
 105 int     vfs_setfsops(int, const fs_operation_def_t *, vfsops_t **);
 106 int     vfs_makefsops(const fs_operation_def_t *, vfsops_t **);
 107 void    vfs_freevfsops(vfsops_t *);
 108 int     vfs_freevfsops_by_type(int);
 109 
 110 #endif /* _KERNEL */
 111 
 112 #ifdef  __cplusplus
 113 }
 114 #endif
 115 
 116 #endif  /* _SYS_VFS_OPREG_H */