Show
Ignore:
Timestamp:
07/13/08 20:42:47 (5 months ago)
Author:
mwhitworth
Message:

Add error-checking to superblock read code, add FreeSuper function and add to structures.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/fs/fs/ext3/super.c

    r752 r784  
    2323#include <print.h> 
    2424 
     25int Ext3FreeSuper(struct VfsSuperBlock* superBlock); 
     26 
    2527struct SuperBlockOps ext3SbOps={ 
    2628        .readVNode = Ext3ReadVNode, 
    2729        .writeVNode = Ext3WriteVNode, 
    2830        .dirtyVNode = Ext3DirtyVNode, 
     31        .freeSuper = Ext3FreeSuper, 
    2932}; 
    3033 
     
    3235        .lookup = Ext3Lookup, 
    3336        .blockMap = Ext3BlockMap, 
     37        .create = Ext3Create, 
     38        .truncate = Ext3Truncate, 
    3439}; 
    3540 
     
    4045}; 
    4146 
     47int Ext3FreeSuper(struct VfsSuperBlock* superBlock) 
     48{ 
     49        struct Ext3SbInfo* sb=EXT3_SUPERINFO(superBlock); 
     50         
     51        if (sb && sb->journal) 
     52                JournalDestroy(sb->journal); 
     53         
     54        if (sb) 
     55                free(sb); 
     56                 
     57        return 0; 
     58} 
     59 
    4260int Ext3JournalSetup(struct VfsSuperBlock* superBlock, struct Ext3SuperBlock* sb, DWORD iNo) 
    4361{ 
     
    5169                return 0; 
    5270        } 
     71         
     72        if (!journal->size) 
     73        { 
     74                KePrint(KERN_ERROR "EXT3: Zero length journal present\n"); 
     75                return -EINVAL; 
     76        } 
    5377 
    5478        /* The journal node must be used (i.e. linked to somewhere). Check! */ 
     
    5882        /* Let the journal layer handle the replaying. */ 
    5983        EXT3_SUPERINFO(superBlock)->journal=JournalCreate(journal); 
     84         
     85        if (!journal) 
     86                return -EIO; 
     87         
     88        JournalSetUuid(EXT3_SUPERINFO(superBlock)->journal, sb->journalUuid); 
    6089 
    6190        return 0; 
     
    6897        if (sb->journalINum) 
    6998        { 
    70                 Ext3JournalSetup(superBlock, sb, sb->journalINum); 
     99                return Ext3JournalSetup(superBlock, sb, sb->journalINum); 
    71100        }else 
    72101                KePrint("Ext3JournalInit: get dev journal\n"); 
    73102 
    74         return 0; 
     103        return -ENOTIMPL; 
    75104} 
    76105 
     
    80109        unsigned long block; 
    81110 
    82         /* TODO: Figure out logic superblock sector. */ 
    83  
    84         return i+1; 
     111        return sb->sbSector+i+1; 
    85112 
    86113        /* Check features for meta block group */ 
     
    90117        return sb->firstDataBlock+(block*sb->blocksPerGrp); 
    91118#endif 
     119} 
     120 
     121int Ext3ReadSuperBlock(struct VfsSuperBlock* superBlock, struct Ext3SbInfo* sbInfo) 
     122{ 
     123        int sector, offset; 
     124         
     125        sector=1*1024/BYTES_PER_SECTOR(superBlock); 
     126        offset=(1*1024) % BYTES_PER_SECTOR(superBlock); 
     127         
     128        sbInfo->sbBuffer=BlockRead(superBlock->sDevice, sector); 
     129        sbInfo->super=(struct Ext3SuperBlock*)((sbInfo->sbBuffer->data)+offset); 
     130        sbInfo->sbSector=sector;         
    92131} 
    93132 
     
    138177 
    139178        sbInfo->firstDataBlock=sb.firstDataBlock; 
     179         
     180        /* Read in the superblock again. */ 
     181        Ext3ReadSuperBlock(retVal, sbInfo); 
    140182 
    141183        /* And set the Ext3-specific parts of the superblock structure. */ 
     
    158200        if (EXT3_FEATURE_COMPAT(&sb, EXT3_FEATURE_COMPAT_JOURNAL)) 
    159201        { 
    160                 Ext3JournalInit(retVal, &sb); 
     202                if (Ext3JournalInit(retVal, &sb)) 
     203                        goto descsFree; 
     204                 
     205                /* Write journal superblock. */ 
    161206        } 
    162207