static int ipo_special(struct thread_data *td, struct io_piece *ipo) { struct fio_file *f; int ret; /* * Not a special ipo */ if (ipo->ddir != DDIR_INVAL) return 0; f = td->files[ipo->fileno]; switch (ipo->file_action) { case FIO_LOG_OPEN_FILE: ret = td_io_open_file(td, f); if (!ret) break; td_verror(td, ret, "iolog open file"); return -1; case FIO_LOG_CLOSE_FILE: td_io_close_file(td, f); break; case FIO_LOG_UNLINK_FILE: td_io_unlink_file(td, f); break; default: log_err("fio: bad file action %d\n", ipo->file_action); break; } return 1; }
static long set_io_u_file(struct thread_data *td, struct io_u *io_u) { struct fio_file *f; do { f = get_next_file(td); if (IS_ERR_OR_NULL(f)) return PTR_ERR(f); io_u->file = f; get_file(f); if (!fill_io_u(td, io_u)) break; put_file_log(td, f); td_io_close_file(td, f); io_u->file = NULL; fio_file_set_done(f); td->nr_done_files++; dprint(FD_FILE, "%s: is done (%d of %d)\n", f->file_name, td->nr_done_files, td->o.nr_files); } while (1); return 0; }
/* * Get next file to service by choosing one at random */ static struct fio_file *get_next_file_rand(struct thread_data *td, enum fio_file_flags goodf, enum fio_file_flags badf) { struct fio_file *f; int fno; do { long r = os_random_long(&td->next_file_state); int opened = 0; fno = (unsigned int) ((double) td->o.nr_files * (r / (OS_RAND_MAX + 1.0))); f = td->files[fno]; if (fio_file_done(f)) continue; if (!fio_file_open(f)) { int err; err = td_io_open_file(td, f); if (err) continue; opened = 1; } if ((!goodf || (f->flags & goodf)) && !(f->flags & badf)) { dprint(FD_FILE, "get_next_file_rand: %p\n", f); return f; } if (opened) td_io_close_file(td, f); } while (1); }
/* * Get next file to service by doing round robin between all available ones */ static struct fio_file *get_next_file_rr(struct thread_data *td, int goodf, int badf) { unsigned int old_next_file = td->next_file; struct fio_file *f; do { int opened = 0; f = td->files[td->next_file]; td->next_file++; if (td->next_file >= td->o.nr_files) td->next_file = 0; dprint(FD_FILE, "trying file %s %x\n", f->file_name, f->flags); if (fio_file_done(f)) { f = NULL; continue; } if (!fio_file_open(f)) { int err; if (td->nr_open_files >= td->o.open_files) return ERR_PTR(-EBUSY); err = td_io_open_file(td, f); if (err) { dprint(FD_FILE, "error %d on open of %s\n", err, f->file_name); f = NULL; continue; } opened = 1; } dprint(FD_FILE, "goodf=%x, badf=%x, ff=%x\n", goodf, badf, f->flags); if ((!goodf || (f->flags & goodf)) && !(f->flags & badf)) break; if (opened) td_io_close_file(td, f); f = NULL; } while (td->next_file != old_next_file); dprint(FD_FILE, "get_next_file_rr: %p\n", f); return f; }