From d5446cfc528262ae3a41da31a8524c9d2e793f45 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Thu, 20 Dec 2012 09:55:47 -0800 Subject: [PATCH] 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 --- include/sys/zfs_vfsops.h | 2 ++ module/zfs/zfs_ioctl.c | 3 +++ module/zfs/zfs_log.c | 8 +++++++- module/zfs/zfs_vnops.c | 4 ++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/include/sys/zfs_vfsops.h b/include/sys/zfs_vfsops.h index 5b11c93128..4dd46710f7 100644 --- a/include/sys/zfs_vfsops.h +++ b/include/sys/zfs_vfsops.h @@ -150,6 +150,8 @@ typedef struct zfid_long { #define SHORT_FID_LEN (sizeof (zfid_short_t) - sizeof (uint16_t)) #define LONG_FID_LEN (sizeof (zfid_long_t) - sizeof (uint16_t)) +extern uint_t zfs_fsyncer_key; + extern int zfs_suspend_fs(zfs_sb_t *zsb); extern int zfs_resume_fs(zfs_sb_t *zsb, const char *osname); extern int zfs_userspace_one(zfs_sb_t *zsb, zfs_userquota_prop_t type, diff --git a/module/zfs/zfs_ioctl.c b/module/zfs/zfs_ioctl.c index d8e823427b..c609203ea4 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 4f144d553e..cbd6f1cb41 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 38f04e5c25..8ec4db26f3 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);