• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 _FILELIST_H_
19 #define _FILELIST_H_
20 
21 #include <pthread.h>
22 #include "rand.h"
23 #include "rwlock.h"
24 #include "cirlist.h"
25 #include "rbt.h"
26 
27 #define SUBDIRNAME_BASE "dir"
28 #define FILENAME_BASE "file"
29 
30 struct ffsb_file {
31 	char *name;
32 	uint64_t size;
33 	struct rwlock lock;
34 	uint32_t num;
35 };
36 
37 struct cirlist;
38 
39 /* Tree of ffsb_file structs and associated state info struct must be
40  * locked during use.
41  */
42 struct benchfiles {
43 	/* The base directory in which all subdirs and files are
44 	 * created
45 	 */
46 	char *basedir;
47 
48 	/* The name to prepend to all directory and file names */
49 	char *basename;
50 	uint32_t numsubdirs;
51 
52 	/* Files which currently exist on the filesystem */
53 	struct red_black_tree *files;
54 
55 	/* Directories which currently exist on the filesystem */
56 	struct red_black_tree *dirs;
57 
58 	/* Files which have been deleted, and whose numbers should be
59 	 * reused
60 	 */
61 	struct cirlist *holes;
62 	struct cirlist *dholes;
63 
64 	/* This lock must be held while manipulating the structure */
65 	struct rwlock fileslock;
66 	uint32_t listsize; /* Sum size of nodes in files and holes */
67 };
68 
69 /* Initializes the list, user must call this before anything else it
70  * will create the basedir and subdirs on the filesystem automatically
71  * if the builddirs arg. is nonzero
72  */
73 void init_filelist(struct benchfiles *, char *, char *, uint32_t, int);
74 void destroy_filelist(struct benchfiles *);
75 
76 /* Allocates a new file, adds to list, (write) locks it, and returns
77  * it.  This function also randomly selects a filename + path to
78  * assign to the new file.
79  *
80  * It first checks the "holes" list for any available filenames.
81  * Caller must ensure file is actually created on disk
82  */
83 struct ffsb_file *add_file(struct benchfiles *b, uint64_t size, randdata_t *rd);
84 struct ffsb_file *add_dir(struct benchfiles *, uint64_t, randdata_t *);
85 
86 /* Removes file from list, decrements listsize.
87  *
88  * File should be writer-locked before calling this function.
89  *
90  * This function does not unlock file after removal from list.
91  *
92  * Caller must ensure file is actually removed on disk.
93  *
94  * Caller must NOT free file->name and file, since oldfiles are being
95  * put into holes list.
96  */
97 void remove_file(struct benchfiles *, struct ffsb_file *);
98 
99 /* Picks a file at random, locks it for reading and returns it
100  * locked
101  */
102 struct ffsb_file *choose_file_reader(struct benchfiles *, randdata_t *);
103 
104 /* Picks a file at random, locks it for writing and returns it
105  * locked
106  */
107 struct ffsb_file *choose_file_writer(struct benchfiles *, randdata_t *);
108 
109 /* changes the file->name of a file, file must be write locked
110  * it does not free the old file->name, so caller must keep a ref to it
111  * and free after the call
112  */
113 void rename_file(struct ffsb_file *);
114 
115 void unlock_file_reader(struct ffsb_file *);
116 void unlock_file_writer(struct ffsb_file *);
117 
118 /* Uses SUBDIRNAME_BASE/FILENAME_BASE + bf->basename to validate a
119  * name returns a negative on invalid names, and the actual file
120  * number if valid
121  */
122 int validate_filename(struct benchfiles *, char *);
123 int validate_dirname(struct benchfiles *, char *);
124 
125 /* Function type which, does some validation of existing files
126  * currently only used by ffsb_fs stuff, returns 0 on success
127  */
128 typedef int (*fl_validation_func_t)(struct benchfiles *, char *, void *);
129 
130 /* Provided for re-use of filesets.  Also runs the validation callback
131  * on each file/dir that is found, after verifying the name is
132  * conformant.  The fileset should be initialized with init_fileset()
133  * beforehand.
134  * Returns 0 on success
135  */
136 int grab_old_fileset(struct benchfiles *, char *, fl_validation_func_t,
137 		      void *);
138 
139 /* Get the number of files */
140 uint32_t get_listsize(struct benchfiles *);
141 
142 /* Get the number of subdirectories */
143 uint32_t get_numsubdirs(struct benchfiles *);
144 
145 #endif /* _FILELIST_H_ */
146