mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 20:37:27 +00:00
ceph: fix rsize/wsize capping in ceph_direct_read_write()
rsize/wsize cap should be applied before ceph_osdc_new_request() is
called. Otherwise, if the size is limited by the cap instead of the
stripe unit, ceph_osdc_new_request() would setup an extent op that is
bigger than what dio_get_pages_alloc() would pin and add to the page
vector, triggering asserts in the messenger.
Cc: stable@vger.kernel.org
Fixes: 95cca2b44e
("ceph: limit osd write size")
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Reviewed-by: "Yan, Zheng" <zyan@redhat.com>
This commit is contained in:
parent
75bc37fefc
commit
3a15b38fd2
@ -918,6 +918,11 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
|
||||
size_t start = 0;
|
||||
ssize_t len;
|
||||
|
||||
if (write)
|
||||
size = min_t(u64, size, fsc->mount_options->wsize);
|
||||
else
|
||||
size = min_t(u64, size, fsc->mount_options->rsize);
|
||||
|
||||
vino = ceph_vino(inode);
|
||||
req = ceph_osdc_new_request(&fsc->client->osdc, &ci->i_layout,
|
||||
vino, pos, &size, 0,
|
||||
@ -933,11 +938,6 @@ ceph_direct_read_write(struct kiocb *iocb, struct iov_iter *iter,
|
||||
break;
|
||||
}
|
||||
|
||||
if (write)
|
||||
size = min_t(u64, size, fsc->mount_options->wsize);
|
||||
else
|
||||
size = min_t(u64, size, fsc->mount_options->rsize);
|
||||
|
||||
len = size;
|
||||
pages = dio_get_pages_alloc(iter, len, &start, &num_pages);
|
||||
if (IS_ERR(pages)) {
|
||||
|
Loading…
Reference in New Issue
Block a user