* inherit the GID of the parent.
*/
#define VFS_FFLAG_SETGID 0x10
+
+/**
+ * \brief "Don't do Write-Back" Flag
+ *
+ * Stops the VFS from calling tVFS_Node.Write on dirty pages when a region
+ * is unmapped. Nice for read-only files and memory-only files (or
+ * pseudo-readonly filesystems)
+ */
+#define VFS_FFLAG_NOWRITEBACK
/**
* \}
*/
* corresponds to.
* \{
*/
- Uint64 Inode; //!< Inode ID (Essentially another ImplInt)
+ Uint64 Inode; //!< Inode ID - Must identify the node uniquely if tVFS_Driver.GetNodeFromINode is non-NULL
Uint ImplInt; //!< Implementation Usable Integer
void *ImplPtr; //!< Implementation Usable Pointer
/**
/**
* \name VFS_Select() fields
+ * \note Used by the VFS internals, drivers should use VFS_Mark*
* \{
*/
int DataAvaliable;
/**
* \}
*/
+
+ /**
+ * \name VFS_MMap() fields
+ * \{
+ */
+ void *MMapInfo;
+ /**
+ * \}
+ */
/**
* \name Common Functions
* \return Number of bytes read
*/
Uint64 (*Write)(struct sVFS_Node *Node, Uint64 Offset, Uint64 Length, void *Buffer);
+
+ /**
+ * \brief Map a region of a file into memory
+ * \param Node Pointer to this node
+ * \param Offset Start of the region (page aligned)
+ * \param Length Length of the region (page aligned)
+ * \param Dest Location to which to map
+ * \return Boolean Failure
+ * \note If NULL, the VFS implements it using .Read
+ */
+ int (*MMap)(struct sVFS_Node *Node, Uint64 Offset, int Length, void *Dest);
/**
* \}
*/
typedef struct sVFS_Driver
{
- //! \brief Unique Identifier for this filesystem type
+ /**
+ * \brief Unique Identifier for this filesystem type
+ */
const char *Name;
- //! \brief Flags applying to this driver
+ /**
+ * \brief Flags applying to this driver
+ */
Uint Flags;
- //! \brief Callback to mount a device
+ /**
+ * \brief Callback to mount a device
+ */
tVFS_Node *(*InitDevice)(const char *Device, const char **Options);
- //! \brief Callback to unmount a device
+ /**
+ * \brief Callback to unmount a device
+ */
void (*Unmount)(tVFS_Node *Node);
- //! \brief Used internally (next driver in the chain)
+ /**
+ * \brief Retrieve a VFS node from an inode
+ */
+ tVFS_Node *(*GetNodeFromINode)(tVFS_Node *RootNode, Uint64 InodeValue);
+ /**
+ * \brief Used internally (next driver in the chain)
+ */
struct sVFS_Driver *Next;
} tVFS_Driver;
* \param Name Name of filesystem driver to find
*/
extern tVFS_Driver *VFS_GetFSByName(const char *Name);
+
+
+/**
+ * \brief Prepare a node for use
+ */
+extern void VFS_InitNode(tVFS_Node *Node);
+
+/**
+ * \brief Clean up a node, ready for deletion
+ * \note This should ALWAYS be called before a node is freed, as it
+ * cleans up VFS internal structures.
+ */
+extern void VFS_CleanupNode(tVFS_Node *Node);
+
/**
* \fn tVFS_ACL *VFS_UnixToAcessACL(Uint Mode, Uint Owner, Uint Group)
* \brief Transforms Unix Permssions into Acess ACLs
extern tVFS_ACL *VFS_UnixToAcessACL(Uint Mode, Uint Owner, Uint Group);
/**
+ * \brief Flags fro \a TypeFlag of VFS_SelectNode
+ * \{
+ */
+#define VFS_SELECT_READ 0x01
+#define VFS_SELECT_WRITE 0x02
+#define VFS_SELECT_ERROR 0x04
+/**
+ * \}
*/
-enum eVFS_SelectTypes
-{
- VFS_SELECT_READ,
- VFS_SELECT_WRITE,
- VFS_SELECT_ERROR
-};
/**
* \brief Wait for an event on a node
* \param Node Node to wait on
* \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)
*/
-extern int VFS_SelectNode(tVFS_Node *Node, enum eVFS_SelectTypes Type, tTime *Timeout);
+extern int VFS_SelectNode(tVFS_Node *Node, int Type, tTime *Timeout, const char *Name);
+/**
+ * \brief Change the full flag on a node
+ */
extern int VFS_MarkFull(tVFS_Node *Node, BOOL IsBufferFull);
extern int VFS_MarkAvaliable(tVFS_Node *Node, BOOL IsDataAvaliable);
extern int VFS_MarkError(tVFS_Node *Node, BOOL IsErrorState);