Reverting series of commits (1/2 and 2/2) since they introduce
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Tue, 12 May 2015 00:57:44 +0000 (09:57 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Tue, 12 May 2015 00:58:34 +0000 (09:58 +0900)
performance degrade.
'if ((node->tn_status & TMPFS_NODE_ACCESSED) == 0) {'
can be done without inode lock and helps performance.

Spotted-by: dillon
Revert "sys/vfs/tmpfs: Make flag handling consistent [1/2]"

This reverts commit e6db94b29aacbd288774574b1967828c8c07c013.

sys/vfs/tmpfs/tmpfs_subr.c
sys/vfs/tmpfs/tmpfs_vnops.c

index 59eadb1..c13cdcc 100644 (file)
@@ -1300,7 +1300,6 @@ tmpfs_itimes(struct vnode *vp, const struct timespec *acc,
                node->tn_ctime = now.tv_sec;
                node->tn_ctimensec = now.tv_nsec;
        }
-       /* This is the only place that clears the tn_status */
        node->tn_status &=
            ~(TMPFS_NODE_ACCESSED | TMPFS_NODE_MODIFIED | TMPFS_NODE_CHANGED);
        TMPFS_NODE_UNLOCK(node);
index 7e5a5b8..4a43281 100644 (file)
@@ -110,9 +110,11 @@ tmpfs_nresolve(struct vop_nresolve_args *v)
        }
        TMPFS_NODE_UNLOCK(dnode);
 
-       TMPFS_NODE_LOCK(dnode);
-       dnode->tn_status |= TMPFS_NODE_ACCESSED;
-       TMPFS_NODE_UNLOCK(dnode);
+       if ((dnode->tn_status & TMPFS_NODE_ACCESSED) == 0) {
+               TMPFS_NODE_LOCK(dnode);
+               dnode->tn_status |= TMPFS_NODE_ACCESSED;
+               TMPFS_NODE_UNLOCK(dnode);
+       }
 
        /*
         * Store the result of this lookup in the cache.  Avoid this if the
@@ -529,9 +531,11 @@ tmpfs_read (struct vop_read_args *ap)
        }
 
 finished:
-       TMPFS_NODE_LOCK(node);
-       node->tn_status |= TMPFS_NODE_ACCESSED;
-       TMPFS_NODE_UNLOCK(node);
+       if ((node->tn_status & TMPFS_NODE_ACCESSED) == 0) {
+               TMPFS_NODE_LOCK(node);
+               node->tn_status |= TMPFS_NODE_ACCESSED;
+               TMPFS_NODE_UNLOCK(node);
+       }
        return (error);
 }
 
@@ -1517,9 +1521,11 @@ outok:
        }
        TMPFS_NODE_UNLOCK(node);
 
-       TMPFS_NODE_LOCK(node);
-       node->tn_status |= TMPFS_NODE_ACCESSED;
-       TMPFS_NODE_UNLOCK(node);
+       if ((node->tn_status & TMPFS_NODE_ACCESSED) == 0) {
+               TMPFS_NODE_LOCK(node);
+               node->tn_status |= TMPFS_NODE_ACCESSED;
+               TMPFS_NODE_UNLOCK(node);
+       }
        return error;
 }
 
@@ -1541,9 +1547,11 @@ tmpfs_readlink(struct vop_readlink_args *v)
        error = uiomove(node->tn_link,
                        MIN(node->tn_size, uio->uio_resid), uio);
        TMPFS_NODE_UNLOCK(node);
-       TMPFS_NODE_LOCK(node);
-       node->tn_status |= TMPFS_NODE_ACCESSED;
-       TMPFS_NODE_UNLOCK(node);
+       if ((node->tn_status & TMPFS_NODE_ACCESSED) == 0) {
+               TMPFS_NODE_LOCK(node);
+               node->tn_status |= TMPFS_NODE_ACCESSED;
+               TMPFS_NODE_UNLOCK(node);
+       }
        return error;
 }