projects
/
fio.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Add support for compiling for ESX
[fio.git]
/
init.c
diff --git
a/init.c
b/init.c
index 21779c7b162fda0dadeb9f2238d7a334f7c7f3db..d44eb5b1eaa2fb086afe25b3a6bda335320decf7 100644
(file)
--- a/
init.c
+++ b/
init.c
@@
-238,15
+238,19
@@
static struct option l_opts[FIO_NR_OPTIONS] = {
void free_threads_shm(void)
{
void free_threads_shm(void)
{
- struct shmid_ds sbuf;
-
if (threads) {
void *tp = threads;
if (threads) {
void *tp = threads;
+#ifndef CONFIG_NO_SHM
+ struct shmid_ds sbuf;
threads = NULL;
shmdt(tp);
shmctl(shm_id, IPC_RMID, &sbuf);
shm_id = -1;
threads = NULL;
shmdt(tp);
shmctl(shm_id, IPC_RMID, &sbuf);
shm_id = -1;
+#else
+ threads = NULL;
+ free(tp);
+#endif
}
}
}
}
@@
-287,6
+291,7
@@
static int setup_thread_area(void)
size += file_hash_size;
size += sizeof(unsigned int);
size += file_hash_size;
size += sizeof(unsigned int);
+#ifndef CONFIG_NO_SHM
shm_id = shmget(0, size, IPC_CREAT | 0600);
if (shm_id != -1)
break;
shm_id = shmget(0, size, IPC_CREAT | 0600);
if (shm_id != -1)
break;
@@
-294,10
+299,16
@@
static int setup_thread_area(void)
perror("shmget");
break;
}
perror("shmget");
break;
}
+#else
+ threads = malloc(size);
+ if (threads)
+ break;
+#endif
max_jobs >>= 1;
} while (max_jobs);
max_jobs >>= 1;
} while (max_jobs);
+#ifndef CONFIG_NO_SHM
if (shm_id == -1)
return 1;
if (shm_id == -1)
return 1;
@@
-306,6
+317,7
@@
static int setup_thread_area(void)
perror("shmat");
return 1;
}
perror("shmat");
return 1;
}
+#endif
memset(threads, 0, max_jobs * sizeof(struct thread_data));
hash = (void *) threads + max_jobs * sizeof(struct thread_data);
memset(threads, 0, max_jobs * sizeof(struct thread_data));
hash = (void *) threads + max_jobs * sizeof(struct thread_data);
@@
-937,7
+949,7
@@
static struct fpre_keyword {
{ .keyword = NULL, },
};
{ .keyword = NULL, },
};
-static char *make_filename(char *buf, struct thread_options *o,
+static char *make_filename(char *buf, s
ize_t buf_size,s
truct thread_options *o,
const char *jobname, int jobnum, int filenum)
{
struct fpre_keyword *f;
const char *jobname, int jobnum, int filenum)
{
struct fpre_keyword *f;
@@
-952,7
+964,9
@@
static char *make_filename(char *buf, struct thread_options *o,
for (f = &fpre_keywords[0]; f->keyword; f++)
f->strlen = strlen(f->keyword);
for (f = &fpre_keywords[0]; f->keyword; f++)
f->strlen = strlen(f->keyword);
- strcpy(buf, o->filename_format);
+ buf[buf_size - 1] = '\0';
+ strncpy(buf, o->filename_format, buf_size - 1);
+
memset(copy, 0, sizeof(copy));
for (f = &fpre_keywords[0]; f->keyword; f++) {
do {
memset(copy, 0, sizeof(copy));
for (f = &fpre_keywords[0]; f->keyword; f++) {
do {
@@
-1012,7
+1026,7
@@
static char *make_filename(char *buf, struct thread_options *o,
if (post_start)
strncpy(dst, buf + post_start, dst_left);
if (post_start)
strncpy(dst, buf + post_start, dst_left);
- str
cpy(buf, copy
);
+ str
ncpy(buf, copy, buf_size - 1
);
} while (1);
}
} while (1);
}
@@
-1072,7
+1086,7
@@
static int add_job(struct thread_data *td, const char *jobname, int job_add_num,
add_file(td, jobname, job_add_num, 0);
else {
for (i = 0; i < o->nr_files; i++)
add_file(td, jobname, job_add_num, 0);
else {
for (i = 0; i < o->nr_files; i++)
- add_file(td, make_filename(fname, o, jobname, job_add_num, i), job_add_num, 0);
+ add_file(td, make_filename(fname,
sizeof(fname),
o, jobname, job_add_num, i), job_add_num, 0);
}
}
}
}
@@
-1714,8
+1728,6
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
optind = 1;
while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) {
optind = 1;
while ((c = getopt_long_only(argc, argv, ostr, l_opts, &lidx)) != -1) {
- did_arg = 1;
-
if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) {
parse_cmd_client(cur_client, argv[optind - 1]);
c &= ~FIO_CLIENT_FLAG;
if ((c & FIO_CLIENT_FLAG) || client_flag_set(c)) {
parse_cmd_client(cur_client, argv[optind - 1]);
c &= ~FIO_CLIENT_FLAG;
@@
-1739,7
+1751,7
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
write_bw_log = 1;
break;
case 'o':
write_bw_log = 1;
break;
case 'o':
- if (f_out)
+ if (f_out
&& f_out != stdout
)
fclose(f_out);
f_out = fopen(optarg, "w+");
fclose(f_out);
f_out = fopen(optarg, "w+");
@@
-1772,30
+1784,35
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
append_terse_output = 1;
break;
case 'h':
append_terse_output = 1;
break;
case 'h':
+ did_arg = 1;
if (!cur_client) {
usage(argv[0]);
do_exit++;
}
break;
case 'c':
if (!cur_client) {
usage(argv[0]);
do_exit++;
}
break;
case 'c':
+ did_arg = 1;
if (!cur_client) {
fio_show_option_help(optarg);
do_exit++;
}
break;
case 'i':
if (!cur_client) {
fio_show_option_help(optarg);
do_exit++;
}
break;
case 'i':
+ did_arg = 1;
if (!cur_client) {
fio_show_ioengine_help(optarg);
do_exit++;
}
break;
case 's':
if (!cur_client) {
fio_show_ioengine_help(optarg);
do_exit++;
}
break;
case 's':
+ did_arg = 1;
dump_cmdline = 1;
break;
case 'r':
read_only = 1;
break;
case 'v':
dump_cmdline = 1;
break;
case 'r':
read_only = 1;
break;
case 'v':
+ did_arg = 1;
if (!cur_client) {
log_info("%s\n", fio_version_string);
do_exit++;
if (!cur_client) {
log_info("%s\n", fio_version_string);
do_exit++;
@@
-1832,6
+1849,7
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
do_exit++;
break;
case 'P':
do_exit++;
break;
case 'P':
+ did_arg = 1;
parse_only = 1;
break;
case 'x': {
parse_only = 1;
break;
case 'x': {
@@
-1851,6
+1869,7
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
break;
}
case 'p':
break;
}
case 'p':
+ did_arg = 1;
if (exec_profile)
free(exec_profile);
exec_profile = strdup(optarg);
if (exec_profile)
free(exec_profile);
exec_profile = strdup(optarg);
@@
-1864,6
+1883,7
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
if (ret)
goto out_free;
td = NULL;
if (ret)
goto out_free;
td = NULL;
+ did_arg = 1;
}
if (!td) {
int is_section = !strncmp(opt, "name", 4);
}
if (!td) {
int is_section = !strncmp(opt, "name", 4);
@@
-1876,8
+1896,14
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
continue;
td = get_new_job(global, &def_thread, 1);
continue;
td = get_new_job(global, &def_thread, 1);
- if (!td || ioengine_load(td))
- goto out_free;
+ if (!td || ioengine_load(td)) {
+ if (td) {
+ put_job(td);
+ td = NULL;
+ }
+ do_exit++;
+ break;
+ }
fio_options_set_ioengine_opts(l_opts, td);
}
fio_options_set_ioengine_opts(l_opts, td);
}
@@
-1898,8
+1924,14
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
if (!ret && !strcmp(opt, "ioengine")) {
free_ioengine(td);
if (!ret && !strcmp(opt, "ioengine")) {
free_ioengine(td);
- if (ioengine_load(td))
- goto out_free;
+ if (ioengine_load(td)) {
+ if (td) {
+ put_job(td);
+ td = NULL;
+ }
+ do_exit++;
+ break;
+ }
fio_options_set_ioengine_opts(l_opts, td);
}
break;
fio_options_set_ioengine_opts(l_opts, td);
}
break;
@@
-1907,6
+1939,10
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
case FIO_GETOPT_IOENGINE: {
const char *opt = l_opts[lidx].name;
char *val = optarg;
case FIO_GETOPT_IOENGINE: {
const char *opt = l_opts[lidx].name;
char *val = optarg;
+
+ if (!td)
+ break;
+
ret = fio_cmd_ioengine_option_parse(td, opt, val);
break;
}
ret = fio_cmd_ioengine_option_parse(td, opt, val);
break;
}
@@
-1922,6
+1958,8
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
}
break;
case 'S':
}
break;
case 'S':
+ did_arg = 1;
+#ifndef CONFIG_NO_SHM
if (nr_clients) {
log_err("fio: can't be both client and server\n");
do_exit++;
if (nr_clients) {
log_err("fio: can't be both client and server\n");
do_exit++;
@@
-1932,19
+1970,28
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
fio_server_set_arg(optarg);
is_backend = 1;
backend = 1;
fio_server_set_arg(optarg);
is_backend = 1;
backend = 1;
+#else
+ log_err("fio: client/server requires SHM support\n");
+ do_exit++;
+ exit_val = 1;
+#endif
break;
case 'D':
break;
case 'D':
+ if (pid_file)
+ free(pid_file);
pid_file = strdup(optarg);
break;
case 'I':
if ((ret = fio_idle_prof_parse_opt(optarg))) {
/* exit on error and calibration only */
pid_file = strdup(optarg);
break;
case 'I':
if ((ret = fio_idle_prof_parse_opt(optarg))) {
/* exit on error and calibration only */
+ did_arg = 1;
do_exit++;
do_exit++;
- if (ret == -1)
+ if (ret == -1)
exit_val = 1;
}
break;
case 'C':
exit_val = 1;
}
break;
case 'C':
+ did_arg = 1;
if (is_backend) {
log_err("fio: can't be both client and server\n");
do_exit++;
if (is_backend) {
log_err("fio: can't be both client and server\n");
do_exit++;
@@
-1971,10
+2018,12
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
}
break;
case 'T':
}
break;
case 'T':
+ did_arg = 1;
do_exit++;
exit_val = fio_monotonic_clocktest();
break;
case 'G':
do_exit++;
exit_val = fio_monotonic_clocktest();
break;
case 'G':
+ did_arg = 1;
do_exit++;
exit_val = fio_crctest(optarg);
break;
do_exit++;
exit_val = fio_crctest(optarg);
break;
@@
-2014,8
+2063,11
@@
int parse_cmd_line(int argc, char *argv[], int client_type)
free(pid_file);
if (td) {
free(pid_file);
if (td) {
- if (!ret)
+ if (!ret)
{
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
ret = add_job(td, td->o.name ?: "fio", 0, 0, client_type);
+ if (ret)
+ did_arg = 1;
+ }
}
while (!ret && optind < argc) {
}
while (!ret && optind < argc) {