mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2025-06-25 10:38:00 +03:00
Add explicit DMU_DIRECTIO checks
UIO_DIRECT means we can do Direct I/O, while DMU_DIRECTIO we want to do it. First does not automatically means second. Add few checks to not use Direct I/O in few cases we don't want it. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Tony Hutter <hutter2@llnl.gov> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #17342
This commit is contained in:
parent
d5616ad34a
commit
e55225be3e
@ -1383,7 +1383,7 @@ dmu_read_uio_dnode(dnode_t *dn, zfs_uio_t *uio, uint64_t size,
|
|||||||
dmu_buf_t **dbp;
|
dmu_buf_t **dbp;
|
||||||
int numbufs, i, err;
|
int numbufs, i, err;
|
||||||
|
|
||||||
if (uio->uio_extflg & UIO_DIRECT)
|
if ((flags & DMU_DIRECTIO) && (uio->uio_extflg & UIO_DIRECT))
|
||||||
return (dmu_read_uio_direct(dn, uio, size, flags));
|
return (dmu_read_uio_direct(dn, uio, size, flags));
|
||||||
flags &= ~DMU_DIRECTIO;
|
flags &= ~DMU_DIRECTIO;
|
||||||
|
|
||||||
@ -1489,7 +1489,7 @@ top:
|
|||||||
* We only allow Direct I/O writes to happen if we are block
|
* We only allow Direct I/O writes to happen if we are block
|
||||||
* sized aligned. Otherwise, we pass the write off to the ARC.
|
* sized aligned. Otherwise, we pass the write off to the ARC.
|
||||||
*/
|
*/
|
||||||
if ((uio->uio_extflg & UIO_DIRECT) &&
|
if ((flags & DMU_DIRECTIO) && (uio->uio_extflg & UIO_DIRECT) &&
|
||||||
(write_size >= dn->dn_datablksz)) {
|
(write_size >= dn->dn_datablksz)) {
|
||||||
if (zfs_dio_aligned(zfs_uio_offset(uio), write_size,
|
if (zfs_dio_aligned(zfs_uio_offset(uio), write_size,
|
||||||
dn->dn_datablksz)) {
|
dn->dn_datablksz)) {
|
||||||
@ -1564,10 +1564,12 @@ top:
|
|||||||
|
|
||||||
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
dmu_buf_rele_array(dbp, numbufs, FTAG);
|
||||||
|
|
||||||
if ((uio->uio_extflg & UIO_DIRECT) && size > 0) {
|
if ((oflags & DMU_DIRECTIO) && (uio->uio_extflg & UIO_DIRECT) &&
|
||||||
|
err == 0 && size > 0) {
|
||||||
flags = oflags;
|
flags = oflags;
|
||||||
goto top;
|
goto top;
|
||||||
}
|
}
|
||||||
|
IMPLY(err == 0, size == 0);
|
||||||
|
|
||||||
return (err);
|
return (err);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user