155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* 255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Copyright (c) International Business Machines Corp., 2001-2004 355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is free software; you can redistribute it and/or modify 555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * it under the terms of the GNU General Public License as published by 655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the Free Software Foundation; either version 2 of the License, or 755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * (at your option) any later version. 855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * This program is distributed in the hope that it will be useful, 1055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * but WITHOUT ANY WARRANTY; without even the implied warranty of 1155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the GNU General Public License for more details. 1355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 1455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * You should have received a copy of the GNU General Public License 1555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * along with this program; if not, write to the Free Software 164548c6cf9bcdd96d8303caa4130ab638b61f8a30Wanlong Gao * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 1755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 1855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#ifndef _FFSB_TG_H_ 1955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#define _FFSB_TG_H_ 2055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <inttypes.h> 2155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <stdlib.h> 2255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <sys/types.h> 2355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include <pthread.h> 2555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 2655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb.h" 2755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_op.h" 2855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_thread.h" 2955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_fs.h" 3055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "ffsb_stats.h" 3155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#include "util.h" /* for barrier obj */ 3355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 3455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* "Thread Group" object defs. 3555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 3655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * A thread group contains configuration information and can run its 3755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * "gang" of threads performing a particular mix of operations. 3855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 3955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * The thread group is responsible for creating the ffsb_thread 4055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * objects which must ask the thread group object to select an 4155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * operation and a filesystem to run that operation on. The thread 4255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * objects don't contain any of the configuration information. 4355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 4455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * Thread groups are also abstracted so they can be "run" arbitrarily 4555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * which is useful because we can reuse them for aging. The running 4655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * is a bit complex, the thread group has to have a callback function 4755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * which is runs at a specified interval to determine when to 4855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * terminate. 4955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * 5055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * To synchronize starting across many thread groups there are two 5155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * barriers used, the first one "tg_barrier" in the run_params is to 5255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * synchronize multiple thread-groups being ready to start, meaning 5355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * that all their threads have been spawned The second one 5455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * "thread_barrier" synchronizes all threads across multiple thread 5555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * groups, so that they all start at once. 5655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak*/ 5755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 5855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct ffsb_thread; 5955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakstruct ffsb_config; 6055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct ffsb_tg { 6255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned tg_num; 6355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned num_threads; 6455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned op_weights[FFSB_NUMOPS]; 6555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct ffsb_thread *threads; 6655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 6755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* A threadgroup can be bound to just one filesystem. 6855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * A value * < 0 , means we aren't bound to any. 6955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 7055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int bindfs; 7155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 7255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int read_random; /* boolean */ 7355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint64_t read_size; 7455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t read_blocksize; 7555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 7655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int read_skip; /* boolean */ 7755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t read_skipsize; 7855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 7955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int write_random; /* boolean */ 8055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint64_t write_size; 8155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t write_blocksize; 8255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 8355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int fsync_file; /* boolean */ 8455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 8555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Should be max(write_blocksize, read_blocksize) */ 8655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak uint32_t thread_bufsize; 8755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 8855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* these fields are calculated/set by tg_run() */ 8955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned sum_weights; 9055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct ffsb_config *fc; 9155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_barrier_t *start_barrier; 9255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 9355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Used for stopping the threads */ 9455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int flagval; 9555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int stopval; 9655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 9755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Delay between every operation, in milliseconds*/ 9855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned wait_time; 9955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 10055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* stats configuration */ 10155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int need_stats; 10255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_statsc_t fsc; 10355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} ffsb_tg_t; 10455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 10555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Init should be the very first thing called on the tg. After that, 10655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * the user can call the set methods and finally run. 10755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 10855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid init_ffsb_tg(ffsb_tg_t *tg, unsigned num_threads, unsigned tg_num); 10955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid destroy_ffsb_tg(ffsb_tg_t *tg); 11055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 11155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Parameters needed to fire off a thread group. The main thread will 11255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * evaluate poll_fn(poll_data) until it gets a nonzero return value. 11355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * It will sleep for wait_time secs between calls The ffsb_config 11455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * struct is needed for fs selection. Barriers are to synchronize 11555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * multiple tgs and all threads pt is for pthread_create() 11655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 11755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct tg_run_params { 11855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_tg_t *tg; 11955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak int (*poll_fn)(void *); 12055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak void *poll_data; 12155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned wait_time; /* in sec */ 12255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct ffsb_config *fc; 12355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_barrier_t *tg_barrier; 12455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 12555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak /* Should be initialized by caller to tg_run() */ 12655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak ffsb_barrier_t *thread_barrier; 12755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak pthread_t pt; 12855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} tg_run_params_t; 12955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 13055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* This function is meant to be called as a parameter to 13155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * pthread_create() 13255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 13355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid *tg_run(void *); 13455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 13555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_print_config(ffsb_tg_t *tg); 13655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_print_config_aging(ffsb_tg_t *tg, char *fsname); 13755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 13855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Adds all of this tg's results to res */ 13955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_collect_results(ffsb_tg_t *tg, ffsb_op_results_t *res); 14055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* Adds up all this tg's stats to totals */ 14255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_collect_stats(ffsb_tg_t *tg, ffsb_statsd_t *totals); 14355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* getters/setters, setters should not be called after a run has begun */ 14555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_statsc(ffsb_tg_t *tg, ffsb_statsc_t *fsc); 14755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 14855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_bindfs(ffsb_tg_t *tg, int fsnum); 14955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_bindfs(ffsb_tg_t *tg); 15055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 15155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakunsigned tg_get_numthreads(ffsb_tg_t *tg); 15255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 15355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_op_weight(ffsb_tg_t *tg, char *opname, unsigned weight); 15455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakunsigned tg_get_op_weight(ffsb_tg_t *tg, char *opname); 15555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 15655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_read_random(ffsb_tg_t *tg, int rr); 15755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_write_random(ffsb_tg_t *tg, int wr); 15855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_fsync_file(ffsb_tg_t *tg, int fsync); 15955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 16055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_read_random(ffsb_tg_t *tg); 16155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_write_random(ffsb_tg_t *tg); 16255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_fsync_file(ffsb_tg_t *tg); 16355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 16455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_read_size(ffsb_tg_t *tg, uint64_t rs); 16555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_read_blocksize(ffsb_tg_t *tg, uint32_t rs); 16655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 16755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_read_skipsize(ffsb_tg_t *tg, uint32_t rs); 16855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_read_skip(ffsb_tg_t *tg, int rs); 16955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 17055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_write_size(ffsb_tg_t *tg, uint64_t ws); 17155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_write_blocksize(ffsb_tg_t *tg, uint32_t ws); 17255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 17355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t tg_get_read_size(ffsb_tg_t *tg); 17455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t tg_get_read_blocksize(ffsb_tg_t *tg); 17555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 17655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_read_skip(ffsb_tg_t *tg); 17755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t tg_get_read_skipsize(ffsb_tg_t *tg); 17855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 17955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint64_t tg_get_write_size(ffsb_tg_t *tg); 18055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakuint32_t tg_get_write_blocksize(ffsb_tg_t *tg); 18155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 18255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_set_waittime(ffsb_tg_t *tg, unsigned time); 18355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakunsigned tg_get_waittime(ffsb_tg_t *tg); 18455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 18555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* The threads in the tg should be the only ones using these (below) 18655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * funcs. 18755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 18855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakffsb_barrier_t *tg_get_start_barrier(ffsb_tg_t *tg); 18955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_stopval(ffsb_tg_t *tg); 19055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_get_flagval(ffsb_tg_t *tg); 19155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 19255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* The threads in this tg will use this function to get an op to run, 19355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak * so all configuration specific information is kept in this object. 19455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak */ 19555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modaktypedef struct tg_op_params { 19655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak struct ffsb_fs *fs; /* out parameter */ 19755d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak unsigned opnum; /* out parameter */ 19855d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak} tg_op_params_t; 19955d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 20055d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* tg and rd and in parameters, everything in params is out */ 20155d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakvoid tg_get_op(ffsb_tg_t *tg, randdata_t *rd, tg_op_params_t *params); 20255d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 20355d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak/* want stats for this tg ? */ 20455d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modakint tg_needs_stats(ffsb_tg_t *tg); 20555d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak 20655d04e4a11434fcdb0435b7fd0f8b1daf38bf3c4subrata_modak#endif /* _FFSB_TG_H_ */ 207