diff options
Diffstat (limited to 'fs/iomap.c')
-rw-r--r-- | fs/iomap.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/fs/iomap.c b/fs/iomap.c index 8194d30bdca0..be61cf742b5e 100644 --- a/fs/iomap.c +++ b/fs/iomap.c | |||
@@ -1009,6 +1009,13 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
1009 | WARN_ON_ONCE(ret); | 1009 | WARN_ON_ONCE(ret); |
1010 | ret = 0; | 1010 | ret = 0; |
1011 | 1011 | ||
1012 | if (iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) && | ||
1013 | !inode->i_sb->s_dio_done_wq) { | ||
1014 | ret = sb_init_dio_done_wq(inode->i_sb); | ||
1015 | if (ret < 0) | ||
1016 | goto out_free_dio; | ||
1017 | } | ||
1018 | |||
1012 | inode_dio_begin(inode); | 1019 | inode_dio_begin(inode); |
1013 | 1020 | ||
1014 | blk_start_plug(&plug); | 1021 | blk_start_plug(&plug); |
@@ -1031,13 +1038,6 @@ iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, | |||
1031 | if (ret < 0) | 1038 | if (ret < 0) |
1032 | iomap_dio_set_error(dio, ret); | 1039 | iomap_dio_set_error(dio, ret); |
1033 | 1040 | ||
1034 | if (ret >= 0 && iov_iter_rw(iter) == WRITE && !is_sync_kiocb(iocb) && | ||
1035 | !inode->i_sb->s_dio_done_wq) { | ||
1036 | ret = sb_init_dio_done_wq(inode->i_sb); | ||
1037 | if (ret < 0) | ||
1038 | iomap_dio_set_error(dio, ret); | ||
1039 | } | ||
1040 | |||
1041 | if (!atomic_dec_and_test(&dio->ref)) { | 1041 | if (!atomic_dec_and_test(&dio->ref)) { |
1042 | if (!is_sync_kiocb(iocb)) | 1042 | if (!is_sync_kiocb(iocb)) |
1043 | return -EIOCBQUEUED; | 1043 | return -EIOCBQUEUED; |