1 /* 2 * Copyright (c) International Business Machines Corp., 2001-2004 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 12 * the GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #ifndef _PARSER_H_ 19 #define _PARSER_H_ 20 21 #include "ffsb.h" 22 #include "list.h" 23 24 #define COMMENT_CHAR '#' 25 26 #define STORE_SINGLE 0x0001 27 #define STORE_LIST 0x0002 28 29 #define TYPE_U32 0x0001 30 #define TYPE_U64 0x0002 31 #define TYPE_STRING 0x0004 32 #define TYPE_BOOLEAN 0x0008 33 #define TYPE_DOUBLE 0x0010 34 #define TYPE_RANGE 0x0020 35 #define TYPE_SIZEWEIGHT 0x0040 36 #define TYPE_DEPRECATED 0x0080 37 #define TYPE_WEIGHT 0x0100 38 #define TYPE_SIZE32 0x0200 39 #define TYPE_SIZE64 0x0400 40 41 #define ROOT 0x0001 42 #define THREAD_GROUP 0x0002 43 #define FILESYSTEM 0x0004 44 #define END 0x0008 45 #define STATS 0x0010 46 47 #define GLOBAL_OPTIONS { \ 48 {"num_filesystems", NULL, TYPE_DEPRECATED, STORE_SINGLE}, \ 49 {"num_threadgroups", NULL, TYPE_DEPRECATED, STORE_SINGLE}, \ 50 {"verbose", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 51 {"time", NULL, TYPE_U32, STORE_SINGLE}, \ 52 {"directio", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 53 {"bufferio", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 54 {"alignio", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 55 {"callout", NULL, TYPE_STRING, STORE_SINGLE}, \ 56 {NULL, NULL, 0, 0} } 57 58 #define THREADGROUP_OPTIONS { \ 59 {"bindfs", NULL, TYPE_STRING, STORE_SINGLE}, \ 60 {"num_threads", NULL, TYPE_U32, STORE_SINGLE}, \ 61 {"read_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 62 {"readall_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 63 {"read_random", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 64 {"read_skip", NULL, TYPE_U32, STORE_SINGLE}, \ 65 {"read_size", NULL, TYPE_SIZE64, STORE_SINGLE}, \ 66 {"read_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE}, \ 67 {"read_skipsize", NULL, TYPE_SIZE32, STORE_SINGLE}, \ 68 {"write_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 69 {"write_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 70 {"write_random", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 71 {"fsync_file", NULL, TYPE_DEPRECATED, STORE_SINGLE}, \ 72 {"write_size", NULL, TYPE_SIZE64, STORE_SINGLE}, \ 73 {"write_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE}, \ 74 {"create_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 75 {"create_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 76 {"delete_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 77 {"append_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 78 {"append_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 79 {"metaop_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 80 {"createdir_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 81 {"op_delay", NULL, TYPE_U32, STORE_SINGLE}, \ 82 {"stat_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 83 {"writeall_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 84 {"writeall_fsync_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 85 {"open_close_weight", NULL, TYPE_WEIGHT, STORE_SINGLE}, \ 86 {NULL, NULL, 0} } 87 88 #define FILESYSTEM_OPTIONS { \ 89 {"location", NULL, TYPE_STRING, STORE_SINGLE}, \ 90 {"num_files", NULL, TYPE_U32, STORE_SINGLE}, \ 91 {"num_dirs", NULL, TYPE_U32, STORE_SINGLE}, \ 92 {"reuse", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 93 {"min_filesize", NULL, TYPE_SIZE64, STORE_SINGLE}, \ 94 {"max_filesize", NULL, TYPE_SIZE64, STORE_SINGLE}, \ 95 {"create_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE}, \ 96 {"age_blocksize", NULL, TYPE_SIZE32, STORE_SINGLE}, \ 97 {"desired_util", NULL, TYPE_DOUBLE, STORE_SINGLE}, \ 98 {"agefs", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 99 {"size_weight", NULL, TYPE_SIZEWEIGHT, STORE_LIST}, \ 100 {"init_util", NULL, TYPE_DOUBLE, STORE_SINGLE}, \ 101 {"init_size", NULL, TYPE_SIZE64, STORE_SINGLE}, \ 102 {"clone", NULL, TYPE_STRING, STORE_SINGLE}, \ 103 {NULL, NULL, 0} } 104 105 #define STATS_OPTIONS { \ 106 {"enable_stats", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 107 {"enable_range", NULL, TYPE_BOOLEAN, STORE_SINGLE}, \ 108 {"ignore", NULL, TYPE_STRING, STORE_LIST}, \ 109 {"msec_range", NULL, TYPE_RANGE, STORE_LIST}, \ 110 {NULL, NULL, 0} } 111 112 #define CONTAINER_DESC { \ 113 {"filesystem", FILESYSTEM, 10}, \ 114 {"threadgroup", THREAD_GROUP, 11}, \ 115 {"end", END, 3}, \ 116 {"stats", STATS, 5}, \ 117 {NULL, 0, 0} } 118 119 typedef struct container { 120 struct config_options *config; 121 uint32_t type; 122 struct container *child; 123 struct container *next; 124 } container_t; 125 126 typedef struct config_options { 127 char *name; 128 void *value; 129 int type; 130 int storage_type; 131 } config_options_t; 132 133 typedef struct container_desc { 134 char *name; 135 uint16_t type; 136 uint16_t size; 137 } container_desc_t; 138 139 typedef struct range { 140 double a; 141 double b; 142 } range_t; 143 144 typedef struct value_list { 145 void *value; 146 struct list_head list; 147 } value_list_t; 148 149 void ffsb_parse_newconfig(ffsb_config_t *fc, char *filename); 150 151 #endif 152