Kernel - Fix user handles not being cleared by Threads_Delete
[tpg/acess2.git] / KernelLand / Kernel / include / vfs.h
index f8532ed..4be24c3 100644 (file)
@@ -194,6 +194,28 @@ typedef struct sVFS_Node
         */
 } tVFS_Node;
 
+/**
+ * \name tVFS_NodeType.FindDir Flags
+ * \brief 
+ * \{
+ */
+//\! Attempt non-blocking IO
+#define VFS_IOFLAG_NOBLOCK     0x001
+/**
+ * \}
+ */
+
+/**
+ * \name tVFS_NodeType.FindDir Flags
+ * \brief 
+ * \{
+ */
+//\! Call was triggered by VFS_Stat (as opposed to open)
+#define VFS_FDIRFLAG_STAT      0x001
+/**
+ * \}
+ */
+
 /**
  * \brief Functions for a specific node type
  */
@@ -251,7 +273,7 @@ struct sVFS_NodeType
         * \param Buffer        Destination for read data
         * \return Number of bytes read
         */
-       size_t  (*Read)(struct sVFS_Node *Node, off_t Offset, size_t Length, void *Buffer);
+       size_t  (*Read)(struct sVFS_Node *Node, off_t Offset, size_t Length, void *Buffer, Uint Flags);
        /**
         * \brief Write to the file
         * \param Node  Pointer to this node
@@ -260,7 +282,7 @@ struct sVFS_NodeType
         * \param Buffer        Source of written data
         * \return Number of bytes read
         */
-       size_t  (*Write)(struct sVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer);
+       size_t  (*Write)(struct sVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer, Uint Flags);
 
        /**
         * \brief Map a region of a file into memory
@@ -286,10 +308,10 @@ struct sVFS_NodeType
         * \param Node  Pointer to this node
         * \param Name  Name of the file wanted
         * \return Pointer to the requested node or NULL if it cannot be found
-        * \note The node returned must be accessable until ::tVFS_Node.Close
+        * \note The node returned must be accessable until tVFS_NodeType::Close
         *       is called and ReferenceCount reaches zero.
         */
-       struct sVFS_Node        *(*FindDir)(struct sVFS_Node *Node, const char *Name);
+       struct sVFS_Node        *(*FindDir)(struct sVFS_Node *Node, const char *Name, Uint Flags);
        
        /**
         * \brief Read from a directory
@@ -307,7 +329,7 @@ struct sVFS_NodeType
         * \param Flags Flags to apply to the new child (directory or symlink)
         * \return Created node or NULL on error
         */
-       tVFS_Node       *(*MkNod)(struct sVFS_Node *Node, const char *Name, Uint Flags);
+       tVFS_Node       *(*MkNod)(struct sVFS_Node *Node, const char *Name, Uint Mode);
        
        /**
         * \brief Relink (Rename/Remove) a file/directory
@@ -447,7 +469,7 @@ extern tVFS_ACL     *VFS_UnixToAcessACL(Uint Mode, Uint Owner, Uint Group);
  * \param Type Type of wait
  * \param Timeout      Time to wait (NULL for infinite wait)
  * \param Name Name to show in debug output
- * \return Number of nodes that actioned (0 or 1)
+ * \return Bitset of Type flags that applied
  */
 extern int     VFS_SelectNode(tVFS_Node *Node, int Type, tTime *Timeout, const char *Name);
 
@@ -474,12 +496,17 @@ extern int        VFS_MarkError(tVFS_Node *Node, BOOL IsErrorState);
  * fast cleanup when a filesystem is unmounted.
  * \{
  */
+
+typedef struct sInodeCache     tInodeCache;
+
+typedef void   (*tInode_CleanUpNode)(tVFS_Node *Node);
+
 /**
  * \fn int Inode_GetHandle(void)
  * \brief Gets a unique handle to the Node Cache
  * \return A unique handle for use for the rest of the Inode_* functions
  */
-extern int     Inode_GetHandle(void);
+extern tInodeCache     *Inode_GetHandle(tInode_CleanUpNode CleanUpNode);
 /**
  * \fn tVFS_Node *Inode_GetCache(int Handle, Uint64 Inode)
  * \brief Gets an inode from the node cache
@@ -487,7 +514,7 @@ extern int  Inode_GetHandle(void);
  * \param Inode        Value of the Inode field of the ::tVFS_Node you want
  * \return A pointer to the cached node
  */
-extern tVFS_Node       *Inode_GetCache(int Handle, Uint64 Inode);
+extern tVFS_Node       *Inode_GetCache(tInodeCache *Handle, Uint64 Inode);
 /**
  * \fn tVFS_Node *Inode_CacheNode(int Handle, tVFS_Node *Node)
  * \brief Caches a node in the Node Cache
@@ -495,7 +522,8 @@ extern tVFS_Node    *Inode_GetCache(int Handle, Uint64 Inode);
  * \param Node A pointer to the node to be cached (a copy is taken)
  * \return A pointer to the node in the node cache
  */
-extern tVFS_Node       *Inode_CacheNode(int Handle, tVFS_Node *Node);
+extern tVFS_Node       *Inode_CacheNode(tInodeCache *Handle, tVFS_Node *Node);
+extern tVFS_Node       *Inode_CacheNodeEx(tInodeCache *Handle, tVFS_Node *Node, size_t Size);
 /**
  * \fn int Inode_UncacheNode(int Handle, Uint64 Inode)
  * \brief Dereferences (and removes if needed) a node from the cache
@@ -503,13 +531,13 @@ extern tVFS_Node  *Inode_CacheNode(int Handle, tVFS_Node *Node);
  * \param Inode        Value of the Inode field of the ::tVFS_Node you want to remove
  * \return -1: Error (not present), 0: Not freed, 1: Freed
  */
-extern int     Inode_UncacheNode(int Handle, Uint64 Inode);
+extern int     Inode_UncacheNode(tInodeCache *Handle, Uint64 Inode);
 /**
  * \fn void Inode_ClearCache(int Handle)
  * \brief Clears the cache for a handle
  * \param Handle       A handle returned by Inode_GetHandle()
  */
-extern void    Inode_ClearCache(int Handle);
+extern void    Inode_ClearCache(tInodeCache *Handle);
 
 /**
  * \}

UCC git Repository :: git.ucc.asn.au