]> git.saurik.com Git - apple/xnu.git/blobdiff - bsd/miscfs/devfs/devfsdefs.h
xnu-792.6.56.tar.gz
[apple/xnu.git] / bsd / miscfs / devfs / devfsdefs.h
index 118576cdc7e9257c3cb23684fd6e608785444f91..ef7fa7218246bb9999d6a6d210e6527c1786010c 100644 (file)
@@ -3,8 +3,6 @@
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
- * 
  * This file contains Original Code and/or Modifications of Original Code
  * as defined in and that are subject to the Apple Public Source License
  * Version 2.0 (the 'License'). You may not use this file except in
@@ -71,7 +69,7 @@ typedef enum {
     DEV_DIR,
     DEV_BDEV,
     DEV_CDEV,
-    DEV_SLNK,
+    DEV_SLNK
 } devfstype_t;
 
 extern int (**devfs_vnodeop_p)(void *);        /* our own vector array for dirs */
@@ -104,12 +102,6 @@ union devnode_type {
     }Slnk;
 };
 
-#define        DN_ACCESS       0x0001          /* Access time update request. */
-#define        DN_CHANGE       0x0002          /* Inode change time update request. */
-#define        DN_UPDATE       0x0004          /* Modification time update request. */
-#define        DN_MODIFIED     0x0008          /* Inode has been modified. */
-#define        DN_RENAME       0x0010          /* Inode is being renamed. */
-
 struct devnode
 {
     devfstype_t                dn_type;
@@ -126,13 +118,22 @@ struct devnode
     struct vnode *     dn_vn;  /* address of last vnode that represented us */
     int                        dn_len;   /* of any associated info (e.g. dir data) */
     devdirent_t *      dn_linklist;/* circular list of hardlinks to this node */
-    devdirent_t *      dn_last_lookup; /* name I was last looked up from */
     devnode_t *                dn_nextsibling; /* the list of equivalent nodes */
     devnode_t * *      dn_prevsiblingp;/* backpointer for the above */
     devnode_type_t     dn_typeinfo;
     int                        dn_delete;      /* mark for deletion */
+    int                        dn_change;
+    int                        dn_update;
+    int                        dn_access;
+  int                  dn_lflags;
 };
 
+#define        DN_BUSY                 0x01
+#define        DN_DELETE               0x02
+#define        DN_CREATE               0x04
+#define        DN_CREATEWAIT   0x08
+
+
 struct devdirent
 {
     /*-----------------------directory entry fields-------------*/
@@ -146,8 +147,8 @@ struct devdirent
 };
 
 extern devdirent_t *           dev_root;
-extern struct lock__bsd__      devfs_lock;
 extern struct devfs_stats      devfs_stats;
+extern lck_mtx_t               devfs_mutex;
 
 /*
  * Rules for front nodes:
@@ -180,104 +181,82 @@ struct devfsmount
 #define M_DEVFSNODE    M_DEVFS
 #define M_DEVFSMNT     M_DEVFS
 
-static __inline__ void
-getnanotime(struct timespec * t_p)
-{
-    struct timeval tv;
+#define VTODN(vp)      ((devnode_t *)(vp)->v_data)
 
-    microtime(&tv);
-    t_p->tv_sec = tv.tv_sec;
-    t_p->tv_nsec = tv.tv_usec * 1000;
-    return;
-}
+#define DEVFS_LOCK()   lck_mtx_lock(&devfs_mutex)
 
-#define VTODN(vp)      ((devnode_t *)(vp)->v_data)
-extern void cache_purge(struct vnode *vp); /* vfs_cache.c */
+#define DEVFS_UNLOCK() lck_mtx_unlock(&devfs_mutex)
 
-static __inline__ int
-DEVFS_LOCK(struct proc * p)
-{
-    return (lockmgr(&devfs_lock, LK_EXCLUSIVE, NULL, p));
-}
 
-static __inline__ int
-DEVFS_UNLOCK(struct proc * p)
-{
-    return (lockmgr(&devfs_lock, LK_RELEASE, NULL, p));
-}
 
 static __inline__ void
 DEVFS_INCR_ENTRIES()
 {
-    devfs_stats.entries++;
+    OSAddAtomic(1, &devfs_stats.entries);
 }
 
 static __inline__ void
 DEVFS_DECR_ENTRIES()
 {
-    devfs_stats.entries--;
+    OSAddAtomic(-1, &devfs_stats.entries);
 }
 
 static __inline__ void
 DEVFS_INCR_NODES()
 {
-    devfs_stats.nodes++;
+    OSAddAtomic(1, &devfs_stats.nodes);
 }
 
 static __inline__ void
 DEVFS_DECR_NODES()
 {
-    devfs_stats.nodes--;
+    OSAddAtomic(-1, &devfs_stats.nodes);
 }
 
 static __inline__ void
 DEVFS_INCR_MOUNTS()
 {
-    devfs_stats.mounts++;
+    OSAddAtomic(1, &devfs_stats.mounts);
 }
 
 static __inline__ void
 DEVFS_DECR_MOUNTS()
 {
-    devfs_stats.mounts--;
+    OSAddAtomic(-1, &devfs_stats.mounts);
 }
 
 static __inline__ void
 DEVFS_INCR_STRINGSPACE(int space)
 {
-    devfs_stats.stringspace += space;
+    OSAddAtomic(space, &devfs_stats.stringspace);
 }
 
 static __inline__ void
 DEVFS_DECR_STRINGSPACE(int space)
 {
-    devfs_stats.stringspace -= space;
-    if (devfs_stats.stringspace < 0) {
-       printf("DEVFS_DECR_STRINGSPACE: (%d - %d < 0)\n",
-              devfs_stats.stringspace + space, space);
-       devfs_stats.stringspace = 0;
-    }
+    OSAddAtomic(-space, &devfs_stats.stringspace);
 }
 
 static __inline__ void
-dn_times(devnode_t * dnp, struct timeval t1, struct timeval t2
+dn_times(devnode_t * dnp, struct timeval *t1, struct timeval *t2, struct timeval *t3
 {
-    if (dnp->dn_flags & (DN_ACCESS | DN_CHANGE | DN_UPDATE)) {
-       if (dnp->dn_flags & DN_ACCESS) {
-           dnp->dn_atime.tv_sec = t1.tv_sec;
-           dnp->dn_atime.tv_nsec = t1.tv_usec * 1000;
+       if (dnp->dn_access) {
+           dnp->dn_atime.tv_sec = t1->tv_sec;
+           dnp->dn_atime.tv_nsec = t1->tv_usec * 1000;
+           dnp->dn_access = 0;
        }
-       if (dnp->dn_flags & DN_UPDATE) {
-           dnp->dn_mtime.tv_sec = t2.tv_sec;
-           dnp->dn_mtime.tv_nsec = t2.tv_usec * 1000;
+       if (dnp->dn_update) {
+           dnp->dn_mtime.tv_sec = t2->tv_sec;
+           dnp->dn_mtime.tv_nsec = t2->tv_usec * 1000;
+           dnp->dn_update = 0;
        }
-       if (dnp->dn_flags & DN_CHANGE) {
-           dnp->dn_ctime.tv_sec = time.tv_sec;
-           dnp->dn_ctime.tv_nsec = time.tv_usec * 1000;
+       if (dnp->dn_change) {
+           dnp->dn_ctime.tv_sec = t3->tv_sec;
+           dnp->dn_ctime.tv_nsec = t3->tv_usec * 1000;
+           dnp->dn_change = 0;
        }
-       dnp->dn_flags &= ~(DN_ACCESS | DN_CHANGE | DN_UPDATE);
-    }
-    return;
+
+       return;
 }
 
 static __inline__ void