mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-26 11:19:32 +03:00
ZFS Reads may result in unneccesary calls to zil_commit
ZFS supports O_RSYNC for read operations and when specified will ensure the same level of data integrity that O_DSYNC and O_SYNC provides for writes. O_RSYNC by itself has no effect so it must be combined with either O_DSYNC or O_SYNC. However, many platforms don't support O_RSYNC and have mapped O_SYNC to mean O_RSYNC within ZFS. This is incorrect and causes unnecessary calls to zil_commit. Only platforms which support O_RSYNC should implement the zil_commit functionality in the read code path. Reviewed-by: Matt Ahrens <mahrens@delphix.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: George Wilson <george.wilson@delphix.com> Closes #8523
This commit is contained in:
parent
060f0226e6
commit
2efea7c82c
@ -58,7 +58,6 @@
|
|||||||
#define FOFFMAX O_LARGEFILE
|
#define FOFFMAX O_LARGEFILE
|
||||||
#define FSYNC O_SYNC
|
#define FSYNC O_SYNC
|
||||||
#define FDSYNC O_DSYNC
|
#define FDSYNC O_DSYNC
|
||||||
#define FRSYNC O_SYNC
|
|
||||||
#define FEXCL O_EXCL
|
#define FEXCL O_EXCL
|
||||||
#define FDIRECT O_DIRECT
|
#define FDIRECT O_DIRECT
|
||||||
#define FAPPEND O_APPEND
|
#define FAPPEND O_APPEND
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
#define FOFFMAX O_LARGEFILE
|
#define FOFFMAX O_LARGEFILE
|
||||||
#define FSYNC O_SYNC
|
#define FSYNC O_SYNC
|
||||||
#define FDSYNC O_DSYNC
|
#define FDSYNC O_DSYNC
|
||||||
#define FRSYNC O_RSYNC
|
|
||||||
#define FEXCL O_EXCL
|
#define FEXCL O_EXCL
|
||||||
|
|
||||||
#define FNODSYNC 0x10000 /* fsync pseudo flag */
|
#define FNODSYNC 0x10000 /* fsync pseudo flag */
|
||||||
|
@ -439,6 +439,7 @@ int
|
|||||||
zfs_read(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
|
zfs_read(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
|
||||||
{
|
{
|
||||||
int error = 0;
|
int error = 0;
|
||||||
|
boolean_t frsync = B_FALSE;
|
||||||
|
|
||||||
znode_t *zp = ITOZ(ip);
|
znode_t *zp = ITOZ(ip);
|
||||||
zfsvfs_t *zfsvfs = ITOZSB(ip);
|
zfsvfs_t *zfsvfs = ITOZSB(ip);
|
||||||
@ -466,12 +467,19 @@ zfs_read(struct inode *ip, uio_t *uio, int ioflag, cred_t *cr)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef FRSYNC
|
||||||
/*
|
/*
|
||||||
* If we're in FRSYNC mode, sync out this znode before reading it.
|
* If we're in FRSYNC mode, sync out this znode before reading it.
|
||||||
* Only do this for non-snapshots.
|
* Only do this for non-snapshots.
|
||||||
|
*
|
||||||
|
* Some platforms do not support FRSYNC and instead map it
|
||||||
|
* to FSYNC, which results in unnecessary calls to zil_commit. We
|
||||||
|
* only honor FRSYNC requests on platforms which support it.
|
||||||
*/
|
*/
|
||||||
|
frsync = !!(ioflag & FRSYNC);
|
||||||
|
#endif
|
||||||
if (zfsvfs->z_log &&
|
if (zfsvfs->z_log &&
|
||||||
(ioflag & FRSYNC || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS))
|
(frsync || zfsvfs->z_os->os_sync == ZFS_SYNC_ALWAYS))
|
||||||
zil_commit(zfsvfs->z_log, zp->z_id);
|
zil_commit(zfsvfs->z_log, zp->z_id);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user