summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
366badd)
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
return FIO_Q_COMPLETED;
}
return FIO_Q_COMPLETED;
}
+ if (io_u->ddir == DDIR_TRIM) {
+ if (ld->iocbs_nr)
+ return FIO_Q_BUSY;
+
+ do_io_u_trim(td, io_u);
+ return FIO_Q_COMPLETED;
+ }
+
ld->iocbs[ld->iocbs_nr] = &io_u->iocb;
ld->io_us[ld->iocbs_nr] = io_u;
ld->iocbs_nr++;
ld->iocbs[ld->iocbs_nr] = &io_u->iocb;
ld->io_us[ld->iocbs_nr] = io_u;
ld->iocbs_nr++;
ret = aio_read(aiocb);
else if (io_u->ddir == DDIR_WRITE)
ret = aio_write(aiocb);
ret = aio_read(aiocb);
else if (io_u->ddir == DDIR_WRITE)
ret = aio_write(aiocb);
+ else if (io_u->ddir == DDIR_TRIM) {
+ if (pd->queued)
+ return FIO_Q_BUSY;
+
+ do_io_u_trim(td, io_u);
+ return FIO_Q_COMPLETED;
+ } else {
#ifdef FIO_HAVE_POSIXAIO_FSYNC
ret = aio_fsync(O_SYNC, aiocb);
#else
#ifdef FIO_HAVE_POSIXAIO_FSYNC
ret = aio_fsync(O_SYNC, aiocb);
#else
ret = fio_splice_read_old(td, io_u);
} else if (io_u->ddir == DDIR_WRITE)
ret = fio_splice_write(td, io_u);
ret = fio_splice_read_old(td, io_u);
} else if (io_u->ddir == DDIR_WRITE)
ret = fio_splice_write(td, io_u);
+ else if (io_u->ddir == DDIR_TRIM)
+ ret = do_io_u_trim(td, io_u);
else
ret = do_io_u_sync(td, io_u);
else
ret = do_io_u_sync(td, io_u);
ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
else if (io_u->ddir == DDIR_WRITE)
ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
ret = pread(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
else if (io_u->ddir == DDIR_WRITE)
ret = pwrite(f->fd, io_u->xfer_buf, io_u->xfer_buflen, io_u->offset);
+ else if (io_u->ddir == DDIR_TRIM)
+ ret = do_io_u_trim(td, io_u);
else
ret = do_io_u_sync(td, io_u);
else
ret = do_io_u_sync(td, io_u);
ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
else if (io_u->ddir == DDIR_WRITE)
ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
ret = read(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
else if (io_u->ddir == DDIR_WRITE)
ret = write(f->fd, io_u->xfer_buf, io_u->xfer_buflen);
+ else if (io_u->ddir == DDIR_TRIM)
+ ret = do_io_u_trim(td, io_u);
else
ret = do_io_u_sync(td, io_u);
else
ret = do_io_u_sync(td, io_u);
DDIR_DATASYNC,
DDIR_SYNC_FILE_RANGE,
DDIR_WAIT,
DDIR_DATASYNC,
DDIR_SYNC_FILE_RANGE,
DDIR_WAIT,
#ifndef FIO_IOENGINE_H
#define FIO_IOENGINE_H
#ifndef FIO_IOENGINE_H
#define FIO_IOENGINE_H
-#define FIO_IOOPS_VERSION 11
+#define FIO_IOOPS_VERSION 12
enum {
IO_U_F_FREE = 1 << 0,
enum {
IO_U_F_FREE = 1 << 0,
void io_u_mark_submit(struct thread_data *, unsigned int);
int do_io_u_sync(struct thread_data *, struct io_u *);
void io_u_mark_submit(struct thread_data *, unsigned int);
int do_io_u_sync(struct thread_data *, struct io_u *);
+int do_io_u_trim(struct thread_data *, struct io_u *);
#ifdef FIO_INC_DEBUG
static inline void dprint_io_u(struct io_u *io_u, const char *p)
#ifdef FIO_INC_DEBUG
static inline void dprint_io_u(struct io_u *io_u, const char *p)
+
+int do_io_u_trim(struct thread_data *td, struct io_u *io_u)
+{
+#ifndef FIO_HAVE_TRIM
+ io_u->error = EINVAL;
+ return io_u->xfer_buflen;
+#else
+ struct fio_file *f = io_u->file;
+ int ret;
+
+ ret = os_trim(f->fd, io_u->offset + f->file_offset, io_u->xfer_buflen);
+ if (!ret)
+ return 0;
+
+ io_u->error = errno;
+ return io_u->xfer_buflen;
+#endif
+}
#define FIO_HAVE_CGROUPS
#define FIO_HAVE_FDATASYNC
#define FIO_HAVE_FS_STAT
#define FIO_HAVE_CGROUPS
#define FIO_HAVE_FDATASYNC
#define FIO_HAVE_FS_STAT
#ifdef SYNC_FILE_RANGE_WAIT_BEFORE
#define FIO_HAVE_SYNC_FILE_RANGE
#ifdef SYNC_FILE_RANGE_WAIT_BEFORE
#define FIO_HAVE_SYNC_FILE_RANGE
#define BLKFLSBUF _IO(0x12,97)
#endif
#define BLKFLSBUF _IO(0x12,97)
#endif
+#ifndef BLKDISCARD
+#define BLKDISCARD _IO(0x12,119)
+#endif
+
static inline int blockdev_invalidate_cache(int fd)
{
return ioctl(fd, BLKFLSBUF);
static inline int blockdev_invalidate_cache(int fd)
{
return ioctl(fd, BLKFLSBUF);
+static inline int os_trim(int fd, unsigned long long start,
+ unsigned long long len)
+{
+ uint64_t range[2];
+
+ range[0] = start;
+ range[1] = len;
+
+ if (!ioctl(fd, BLKDISCARD, range))
+ return 0;
+
+ return errno;
+}
+