sys/vfs/tmpfs: Make flag handling consistent [1/2]
authorTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Fri, 8 May 2015 11:19:09 +0000 (20:19 +0900)
committerTomohiro Kusumi <kusumi.tomohiro@gmail.com>
Fri, 8 May 2015 18:59:18 +0000 (03:59 +0900)
- Not taking inode lock on if-test for inode status introduces
  a potential race.

- Above race is basically harmless though since if-test itself
  was redundant and basically results the same with or without it.
  So get rid of it and keep the |= part with inode lock.

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

index c13cdcc..59eadb1 100644 (file)
@@ -1300,6 +1300,7 @@ 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 4a43281..7e5a5b8 100644 (file)
@@ -110,11 +110,9 @@ tmpfs_nresolve(struct vop_nresolve_args *v)
        }
        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);
-       }
+       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
@@ -531,11 +529,9 @@ tmpfs_read (struct vop_read_args *ap)
        }
 
 finished:
-       if ((node->tn_status & TMPFS_NODE_ACCESSED) == 0) {
-               TMPFS_NODE_LOCK(node);
-               node->tn_status |= TMPFS_NODE_ACCESSED;
-               TMPFS_NODE_UNLOCK(node);
-       }
+       TMPFS_NODE_LOCK(node);
+       node->tn_status |= TMPFS_NODE_ACCESSED;
+       TMPFS_NODE_UNLOCK(node);
        return (error);
 }
 
@@ -1521,11 +1517,9 @@ outok:
        }
        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);
-       }
+       TMPFS_NODE_LOCK(node);
+       node->tn_status |= TMPFS_NODE_ACCESSED;
+       TMPFS_NODE_UNLOCK(node);
        return error;
 }
 
@@ -1547,11 +1541,9 @@ tmpfs_readlink(struct vop_readlink_args *v)
        error = uiomove(node->tn_link,
                        MIN(node->tn_size, uio->uio_resid), uio);
        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);
-       }
+       TMPFS_NODE_LOCK(node);
+       node->tn_status |= TMPFS_NODE_ACCESSED;
+       TMPFS_NODE_UNLOCK(node);
        return error;
 }