Revert "Remove TSD zfs_fsyncer_key"
authorBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 20 Dec 2012 17:55:47 +0000 (09:55 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 20 Dec 2012 17:56:28 +0000 (09:56 -0800)
This reverts commit 31f2b5abdf95d8426d8bfd66ca7f62ec70215e3c back
to the original code until the fsync(2) performance regression
can be addressed.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
include/sys/zfs_vfsops.h
module/zfs/zfs_ioctl.c
module/zfs/zfs_log.c
module/zfs/zfs_vnops.c

index 5b11c93..4dd4671 100644 (file)
@@ -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,
index d8e8234..c609203 100644 (file)
@@ -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",
index 4f144d5..cbd6f1c 100644 (file)
@@ -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);
index 38f04e5..8ec4db2 100644 (file)
@@ -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);