X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FModules%2FStorage%2FLVM%2Fmain.c;fp=KernelLand%2FModules%2FStorage%2FLVM%2Fmain.c;h=39ce9a921c1787d85e2866383d58813b554d38bc;hb=2188ee53c02fc249c3f6ee8a08758e940024d754;hp=587689efd9bc6899cce743a8266faf816b535dd9;hpb=9d9b16fcd26c6acf7a15e84a63e96c71577e6265;p=tpg%2Facess2.git diff --git a/KernelLand/Modules/Storage/LVM/main.c b/KernelLand/Modules/Storage/LVM/main.c index 587689ef..39ce9a92 100644 --- a/KernelLand/Modules/Storage/LVM/main.c +++ b/KernelLand/Modules/Storage/LVM/main.c @@ -21,6 +21,8 @@ char *LVM_Root_ReadDir(tVFS_Node *Node, int ID); tVFS_Node *LVM_Root_FindDir(tVFS_Node *Node, const char *Name); char *LVM_Vol_ReadDir(tVFS_Node *Node, int ID); tVFS_Node *LVM_Vol_FindDir(tVFS_Node *Node, const char *Name); +size_t LVM_Vol_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer); +size_t LVM_Vol_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer); size_t LVM_SubVol_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer); size_t LVM_SubVol_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer); @@ -35,7 +37,9 @@ tVFS_NodeType gLVM_RootNodeType = { }; tVFS_NodeType gLVM_VolNodeType = { .ReadDir = LVM_Vol_ReadDir, - .FindDir = LVM_Vol_FindDir + .FindDir = LVM_Vol_FindDir, + .Read = LVM_Vol_Read, + .Write = LVM_Vol_Write }; tVFS_NodeType gLVM_SubVolNodeType = { .Read = LVM_SubVol_Read, @@ -84,7 +88,7 @@ tVFS_Node *LVM_Root_FindDir(tVFS_Node *Node, const char *Name) { if( strcmp(vol->Name, Name) == 0 ) { - return &vol->Node; + return &vol->DirNode; } } return NULL; @@ -94,14 +98,20 @@ char *LVM_Vol_ReadDir(tVFS_Node *Node, int ID) { tLVM_Vol *vol = Node->ImplPtr; - if( ID < 0 || ID >= vol->nSubVolumes ) + if( ID < 0 || ID >= vol->nSubVolumes+1 ) return NULL; - - return strdup( vol->SubVolumes[ID]->Name ); + + if( ID == 0 ) + return strdup(".volume"); + else + return strdup( vol->SubVolumes[ID-1]->Name ); } tVFS_Node *LVM_Vol_FindDir(tVFS_Node *Node, const char *Name) { tLVM_Vol *vol = Node->ImplPtr; + + if( strcmp(".volume", Name) == 0 ) + return &vol->VolNode; for( int i = 0; i < vol->nSubVolumes; i ++ ) { @@ -114,6 +124,29 @@ tVFS_Node *LVM_Vol_FindDir(tVFS_Node *Node, const char *Name) return NULL; } +size_t LVM_Vol_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) +{ + tLVM_Vol *vol = Node->ImplPtr; + Uint64 byte_size = vol->BlockCount * vol->BlockSize; + + if( Offset > byte_size ) + return 0; + if( Length > byte_size ) + Length = byte_size; + if( Offset + Length > byte_size ) + Length = byte_size - Offset; + + return DrvUtil_ReadBlock( + Offset, Length, Buffer, + LVM_int_DrvUtil_ReadBlock, vol->BlockSize, vol + ); +} + +size_t LVM_Vol_Write(tVFS_Node *Node, off_t Offset, size_t Length, const void *Buffer) +{ + return 0; +} + size_t LVM_SubVol_Read(tVFS_Node *Node, off_t Offset, size_t Length, void *Buffer) { tLVM_SubVolume *sv = Node->ImplPtr;