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