engines/io_uring: fix crash with registerfiles=1
authorJens Axboe <axboe@kernel.dk>
Thu, 12 Sep 2019 16:15:42 +0000 (10:15 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 12 Sep 2019 16:15:42 +0000 (10:15 -0600)
If used with a raw bdev, we're crashing in attempting to open a
registered file before we have actually registered them.

If we're called before files are registered, just open the file
normally. This is done to query sizes etc, and we'll get the file
closed after that anyway. The job open/close will use the right
registered fd.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
engines/io_uring.c

index 10cfe9f23e2476ffed8500ce13e46d2ad2e8ed90..65f8e2361cbda824b8efe97aae009e6dae169f4d 100644 (file)
@@ -555,6 +555,7 @@ static int fio_ioring_post_init(struct thread_data *td)
                return 1;
        }
 
                return 1;
        }
 
+       printf("files=%d\n", o->registerfiles);
        if (o->registerfiles) {
                err = fio_ioring_register_files(td);
                if (err) {
        if (o->registerfiles) {
                err = fio_ioring_register_files(td);
                if (err) {
@@ -613,7 +614,7 @@ static int fio_ioring_open_file(struct thread_data *td, struct fio_file *f)
        struct ioring_data *ld = td->io_ops_data;
        struct ioring_options *o = td->eo;
 
        struct ioring_data *ld = td->io_ops_data;
        struct ioring_options *o = td->eo;
 
-       if (!o->registerfiles)
+       if (!ld || !o->registerfiles)
                return generic_open_file(td, f);
 
        f->fd = ld->fds[f->engine_pos];
                return generic_open_file(td, f);
 
        f->fd = ld->fds[f->engine_pos];
@@ -622,9 +623,10 @@ static int fio_ioring_open_file(struct thread_data *td, struct fio_file *f)
 
 static int fio_ioring_close_file(struct thread_data *td, struct fio_file *f)
 {
 
 static int fio_ioring_close_file(struct thread_data *td, struct fio_file *f)
 {
+       struct ioring_data *ld = td->io_ops_data;
        struct ioring_options *o = td->eo;
 
        struct ioring_options *o = td->eo;
 
-       if (!o->registerfiles)
+       if (!ld || !o->registerfiles)
                return generic_close_file(td, f);
 
        f->fd = -1;
                return generic_close_file(td, f);
 
        f->fd = -1;