int fd, ret;
fd = open(filename, O_RDONLY);
- if (fd < 0) {
- perror("open blktrace");
+ if (fd < 0)
return 0;
- }
ret = read(fd, &t, sizeof(t));
close(fd);
return found;
}
-#define MINORBITS 20
-#define MINORMASK ((1U << MINORBITS) - 1)
-#define MAJOR(dev) ((unsigned int) ((dev) >> MINORBITS))
-#define MINOR(dev) ((unsigned int) ((dev) & MINORMASK))
+#define FMINORBITS 20
+#define FMINORMASK ((1U << FMINORBITS) - 1)
+#define FMAJOR(dev) ((unsigned int) ((dev) >> FMINORBITS))
+#define FMINOR(dev) ((unsigned int) ((dev) & FMINORMASK))
static void trace_add_file(struct thread_data *td, __u32 device)
{
static unsigned int last_maj, last_min;
- unsigned int maj = MAJOR(device);
- unsigned int min = MINOR(device);
+ unsigned int maj = FMAJOR(device);
+ unsigned int min = FMINOR(device);
struct fio_file *f;
char dev[256];
unsigned int i;
{
unsigned long long ttime, delay;
struct blk_io_trace t;
- unsigned long ios[2];
+ unsigned long ios[2], skipped_writes;
unsigned int cpu;
unsigned int rw_bs[2];
struct fifo *fifo;
ttime = 0;
ios[0] = ios[1] = 0;
rw_bs[0] = rw_bs[1] = 0;
+ skipped_writes = 0;
do {
int ret = trace_fifo_get(td, fifo, fd, &t, sizeof(t));
log_err("fio: discarded %d of %d\n", ret, t.pdu_len);
goto err;
}
+ if (t.action & BLK_TC_ACT(BLK_TC_NOTIFY))
+ continue;
if (!ttime) {
ttime = t.time;
cpu = t.cpu;
delay = 0;
if (cpu == t.cpu)
delay = t.time - ttime;
- handle_trace(td, &t, delay, ios, rw_bs);
+ if ((t.action & BLK_TC_ACT(BLK_TC_WRITE)) && read_only)
+ skipped_writes++;
+ else
+ handle_trace(td, &t, delay, ios, rw_bs);
ttime = t.time;
cpu = t.cpu;
} while (1);
fifo_free(fifo);
close(fd);
+ if (skipped_writes)
+ log_err("fio: <%s> skips replay of %lu writes due to read-only\n", td->o.name, skipped_writes);
+
if (!ios[DDIR_READ] && !ios[DDIR_WRITE]) {
log_err("fio: found no ios in blktrace data\n");
return 1;