aboutsummaryrefslogtreecommitdiffstats
path: root/module
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2012-12-20 09:55:47 -0800
committerBrian Behlendorf <[email protected]>2012-12-20 09:56:28 -0800
commitd5446cfc528262ae3a41da31a8524c9d2e793f45 (patch)
tree7c058bae7c377b6766b7df884cb63293cdf22238 /module
parent23e3c743f6e36768b97234c3de18f4682111e6c3 (diff)
Revert "Remove TSD zfs_fsyncer_key"
This reverts commit 31f2b5abdf95d8426d8bfd66ca7f62ec70215e3c back to the original code until the fsync(2) performance regression can be addressed. Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'module')
-rw-r--r--module/zfs/zfs_ioctl.c3
-rw-r--r--module/zfs/zfs_log.c8
-rw-r--r--module/zfs/zfs_vnops.c4
3 files changed, 14 insertions, 1 deletions
diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c
index d8e823427..c609203ea 100644
--- a/module/zfs/zfs_ioctl.c
+++ b/module/zfs/zfs_ioctl.c
@@ -5187,6 +5187,7 @@ zfs_detach(void)
list_destroy(&zfsdev_state_list);
}
+uint_t zfs_fsyncer_key;
extern uint_t rrw_tsd_key;
#ifdef DEBUG
@@ -5209,6 +5210,7 @@ _init(void)
if ((error = zfs_attach()) != 0)
goto out2;
+ tsd_create(&zfs_fsyncer_key, NULL);
tsd_create(&rrw_tsd_key, NULL);
printk(KERN_NOTICE "ZFS: Loaded module v%s-%s%s, "
@@ -5238,6 +5240,7 @@ _fini(void)
zfs_fini();
spa_fini();
+ tsd_destroy(&zfs_fsyncer_key);
tsd_destroy(&rrw_tsd_key);
printk(KERN_NOTICE "ZFS: Unloaded module v%s-%s%s\n",
diff --git a/module/zfs/zfs_log.c b/module/zfs/zfs_log.c
index 4f144d553..cbd6f1cb4 100644
--- a/module/zfs/zfs_log.c
+++ b/module/zfs/zfs_log.c
@@ -457,6 +457,7 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
{
itx_wr_state_t write_state;
boolean_t slogging;
+ uintptr_t fsync_cnt;
ssize_t immediate_write_sz;
if (zil_replaying(zilog, tx) || zp->z_unlinked)
@@ -474,6 +475,10 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
else
write_state = WR_NEED_COPY;
+ if ((fsync_cnt = (uintptr_t)tsd_get(zfs_fsyncer_key)) != 0) {
+ (void) tsd_set(zfs_fsyncer_key, (void *)(fsync_cnt - 1));
+ }
+
while (resid) {
itx_t *itx;
lr_write_t *lr;
@@ -509,7 +514,8 @@ zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
itx->itx_private = ZTOZSB(zp);
- if (!(ioflag & (FSYNC | FDSYNC)) && (zp->z_sync_cnt == 0))
+ if (!(ioflag & (FSYNC | FDSYNC)) && (zp->z_sync_cnt == 0) &&
+ (fsync_cnt == 0))
itx->itx_sync = B_FALSE;
zil_itx_assign(zilog, itx, tx);
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c
index 38f04e5c2..8ec4db26f 100644
--- a/module/zfs/zfs_vnops.c
+++ b/module/zfs/zfs_vnops.c
@@ -2070,12 +2070,16 @@ out:
}
EXPORT_SYMBOL(zfs_readdir);
+ulong_t zfs_fsync_sync_cnt = 4;
+
int
zfs_fsync(struct inode *ip, int syncflag, cred_t *cr)
{
znode_t *zp = ITOZ(ip);
zfs_sb_t *zsb = ITOZSB(ip);
+ (void) tsd_set(zfs_fsyncer_key, (void *)zfs_fsync_sync_cnt);
+
if (zsb->z_os->os_sync != ZFS_SYNC_DISABLED) {
ZFS_ENTER(zsb);
ZFS_VERIFY_ZP(zp);