blob: e11d066711658eb769756609443d3fe4fc46ce52 [file] [log] [blame]
/*
* Copyright (c) International Business Machines Corp., 2001-2004
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _FILELIST_H_
#define _FILELIST_H_
#include <pthread.h>
#include "rand.h"
#include "rwlock.h"
#include "cirlist.h"
#include "rbt.h"
#define SUBDIRNAME_BASE "dir"
#define FILENAME_BASE "file"
struct ffsb_file {
char *name;
uint64_t size;
struct rwlock lock;
uint32_t num;
};
struct cirlist;
/* Tree of ffsb_file structs and associated state info struct must be
* locked during use.
*/
struct benchfiles {
/* The base directory in which all subdirs and files are
* created
*/
char *basedir;
/* The name to prepend to all directory and file names */
char *basename;
uint32_t numsubdirs;
/* Files which currently exist on the filesystem */
struct red_black_tree *files;
/* Directories which currently exist on the filesystem */
struct red_black_tree *dirs;
/* Files which have been deleted, and whose numbers should be
* reused
*/
struct cirlist *holes;
struct cirlist *dholes;
/* This lock must be held while manipulating the structure */
struct rwlock fileslock;
uint32_t listsize; /* Sum size of nodes in files and holes */
};
/* Initializes the list, user must call this before anything else it
* will create the basedir and subdirs on the filesystem automatically
* if the builddirs arg. is nonzero
*/
void init_filelist(struct benchfiles *, char *, char *, uint32_t, int);
void destroy_filelist(struct benchfiles *);
/* Allocates a new file, adds to list, (write) locks it, and returns
* it. This function also randomly selects a filename + path to
* assign to the new file.
*
* It first checks the "holes" list for any available filenames.
* Caller must ensure file is actually created on disk
*/
struct ffsb_file *add_file(struct benchfiles *b, uint64_t size, randdata_t *rd);
struct ffsb_file *add_dir(struct benchfiles *, uint64_t, randdata_t *);
/* Removes file from list, decrements listsize.
*
* File should be writer-locked before calling this function.
*
* This function does not unlock file after removal from list.
*
* Caller must ensure file is actually removed on disk.
*
* Caller must NOT free file->name and file, since oldfiles are being
* put into holes list.
*/
void remove_file(struct benchfiles *, struct ffsb_file *);
/* Picks a file at random, locks it for reading and returns it
* locked
*/
struct ffsb_file *choose_file_reader(struct benchfiles *, randdata_t *);
/* Picks a file at random, locks it for writing and returns it
* locked
*/
struct ffsb_file *choose_file_writer(struct benchfiles *, randdata_t *);
/* changes the file->name of a file, file must be write locked
* it does not free the old file->name, so caller must keep a ref to it
* and free after the call
*/
void rename_file(struct ffsb_file *);
void unlock_file_reader(struct ffsb_file *);
void unlock_file_writer(struct ffsb_file *);
/* Uses SUBDIRNAME_BASE/FILENAME_BASE + bf->basename to validate a
* name returns a negative on invalid names, and the actual file
* number if valid
*/
int validate_filename(struct benchfiles *, char *);
int validate_dirname(struct benchfiles *, char *);
/* Function type which, does some validation of existing files
* currently only used by ffsb_fs stuff, returns 0 on success
*/
typedef int (*fl_validation_func_t)(struct benchfiles *, char *, void *);
/* Provided for re-use of filesets. Also runs the validation callback
* on each file/dir that is found, after verifying the name is
* conformant. The fileset should be initialized with init_fileset()
* beforehand.
* Returns 0 on success
*/
int grab_old_fileset(struct benchfiles *, char *, fl_validation_func_t,
void *);
/* Get the number of files */
uint32_t get_listsize(struct benchfiles *);
/* Get the number of subdirectories */
uint32_t get_numsubdirs(struct benchfiles *);
#endif /* _FILELIST_H_ */