tmpfs - Move dnode lock to improve unlink performance
authorMatthew Dillon <dillon@apollo.backplane.com>
Sun, 22 Apr 2018 18:57:07 +0000 (11:57 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 23 Apr 2018 02:31:27 +0000 (19:31 -0700)
* Unlock the directory node a little earlier in tmpfs_vop_nremove().

sys/vfs/tmpfs/tmpfs_vnops.c

index 80e5b28..ffcfc85 100644 (file)
@@ -977,6 +977,7 @@ tmpfs_nremove(struct vop_nremove_args *ap)
        de = tmpfs_dir_lookup(dnode, node, ncp);
        if (de == NULL) {
                error = ENOENT;
+               TMPFS_NODE_UNLOCK(dnode);
                goto out;
        }
 
@@ -984,12 +985,14 @@ tmpfs_nremove(struct vop_nremove_args *ap)
        if ((node->tn_flags & (IMMUTABLE | APPEND | NOUNLINK)) ||
            (dnode->tn_flags & APPEND)) {
                error = EPERM;
+               TMPFS_NODE_UNLOCK(dnode);
                goto out;
        }
 
        /* Remove the entry from the directory; as it is a file, we do not
         * have to change the number of hard links of the directory. */
        tmpfs_dir_detach(dnode, de);
+       TMPFS_NODE_UNLOCK(dnode);
 
        /* Free the directory entry we just deleted.  Note that the node
         * referred by it will not be removed until the vnode is really
@@ -1007,7 +1010,6 @@ tmpfs_nremove(struct vop_nremove_args *ap)
        error = 0;
 
 out:
-       TMPFS_NODE_UNLOCK(dnode);
        if (error == 0)
                tmpfs_knote(dvp, NOTE_WRITE);
 out2: