Commit 3428322b authored by Jinlong Chen's avatar Jinlong Chen Committed by Konrad Sztyber
Browse files

bdev_aio: only apply RWF_NOWAIT when it is supported



Older environment may not support RWF_NOWAIT, do not apply the flag if it is not supported.

Change-Id: I40e83ef52aa3842c63bc41f48c4c57eaecd48ac1
Signed-off-by: default avatarJinlong Chen <chenjinlong.cjl@alibaba-inc.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/25372


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: default avatarGangCao <gang.cao@intel.com>
Community-CI: Community CI Samsung <spdk.community.ci.samsung@gmail.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeliu@tencent.com>
parent b8c65ccf
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -64,7 +64,9 @@ struct file_disk {
	struct spdk_bdev	disk;
	char			*filename;
	int			fd;
#ifdef RWF_NOWAIT
	bool			use_nowait;
#endif
	TAILQ_ENTRY(file_disk)  link;
	bool			block_size_override;
	bool			readonly;
@@ -114,7 +116,9 @@ bdev_aio_open(struct file_disk *disk)
{
	int fd;
	int io_flag = disk->readonly ? O_RDONLY : O_RDWR;
#ifdef RWF_NOWAIT
	struct stat st;
#endif

	fd = open(disk->filename, io_flag | O_DIRECT);
	if (fd < 0) {
@@ -129,11 +133,14 @@ bdev_aio_open(struct file_disk *disk)
	}

	disk->fd = fd;

#ifdef RWF_NOWAIT
	/* Some aio operations can block, for example if number outstanding
	 * I/O exceeds number of block layer tags. But not all files can
	 * support RWF_NOWAIT flag. So use RWF_NOWAIT on block devices only.
	 */
	disk->use_nowait = fstat(fd, &st) == 0 && S_ISBLK(st.st_mode);
#endif

	return 0;
}
@@ -205,9 +212,11 @@ bdev_aio_submit_io(enum spdk_bdev_io_type type, struct file_disk *fdisk,
		io_set_eventfd(iocb, aio_ch->group_ch->efd);
	}
	iocb->data = aio_task;
#ifdef RWF_NOWAIT
	if (fdisk->use_nowait) {
		iocb->aio_rw_flags = RWF_NOWAIT;
	}
#endif
	aio_task->len = nbytes;
	aio_task->ch = aio_ch;