提交 de82b923 编写于 作者: B Brian Foster 提交者: Miklos Szeredi

fuse: allocate for_background dio requests based on io->async state

Commit 8b41e671 introduced explicit background checking for fuse_req
structures with BUG_ON() checks for the appropriate type of request in
in the associated send functions. Commit bcba24cc introduced the ability
to send dio requests as background requests but does not update the
request allocation based on the type of I/O request. As a result, a
BUG_ON() triggers in the fuse_request_send_background() background path if
an async I/O is sent.

Allocate a request based on the async state of the fuse_io_priv to avoid
the BUG.
Signed-off-by: NBrian Foster <bfoster@redhat.com>
Signed-off-by: NMiklos Szeredi <mszeredi@suse.cz>
上级 f722406f
...@@ -1278,6 +1278,9 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov, ...@@ -1278,6 +1278,9 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov,
iov_iter_init(&ii, iov, nr_segs, count, 0); iov_iter_init(&ii, iov, nr_segs, count, 0);
if (io->async)
req = fuse_get_req_for_background(fc, fuse_iter_npages(&ii));
else
req = fuse_get_req(fc, fuse_iter_npages(&ii)); req = fuse_get_req(fc, fuse_iter_npages(&ii));
if (IS_ERR(req)) if (IS_ERR(req))
return PTR_ERR(req); return PTR_ERR(req);
...@@ -1314,6 +1317,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov, ...@@ -1314,6 +1317,10 @@ ssize_t fuse_direct_io(struct fuse_io_priv *io, const struct iovec *iov,
break; break;
if (count) { if (count) {
fuse_put_request(fc, req); fuse_put_request(fc, req);
if (io->async)
req = fuse_get_req_for_background(fc,
fuse_iter_npages(&ii));
else
req = fuse_get_req(fc, fuse_iter_npages(&ii)); req = fuse_get_req(fc, fuse_iter_npages(&ii));
if (IS_ERR(req)) if (IS_ERR(req))
break; break;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册