Changeset 799

Show
Ignore:
Timestamp:
07/14/08 20:33:28 (3 months ago)
Author:
mwhitworth
Message:

Add to checkpoint function, return early if no checkpointing is needed.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • Whitix/branches/fs/fs/journal/checkpoint.c

    r787 r799  
    4141                 
    4242//              KePrint("transaction->id = %u, %u\n", transaction->transId, blockNo); 
     43        }else if ((transaction = journal->committingTrans) || (transaction = journal->currTransaction)) 
     44        { 
     45                firstTid=transaction->transId; 
     46                blockNo=transaction->logStart; 
    4347        }else{ 
    4448//              KePrint("JournalCleanupTail: list empty!\n"); 
     
    4953         
    5054        if (journal->tailSequence == firstTid) 
    51         { 
    5255                return 1; 
    53         } 
    5456         
    5557        freed=blockNo-journal->tail; 
    5658         
    57 //      KePrint("Journal tail from %d to %d (offset %u), freed %d\n", journal->tailSequence, firstTid, blockNo, freed); 
     59        KePrint("Journal tail from %d to %d (offset %u), freed %d\n", journal->tailSequence, firstTid, blockNo, freed); 
    5860         
    5961        journal->free+=freed; 
     
    6870        struct JournalTrans* curr, *curr2; 
    6971        struct JournalHead* currHead, *currHead2; 
     72        int ret; 
     73 
     74        JournalLock(journal); 
    7075         
    71         JournalCleanupTail(journal); 
     76        ret=JournalCleanupTail(journal); 
    7277         
    73         JournalLock(journal); 
     78        if (ret <= 0) 
     79                goto out; 
     80         
     81        ListForEachEntry(curr, &journal->checkpointTrans, next) 
     82        { 
     83                ListForEachEntry(currHead, &curr->forgetList, next) 
     84                { 
     85                        BlockWrite(currHead->buffer->device, currHead->buffer); 
     86//                      KePrint("Wrote %u\n", currHead->buffer->blockNum); 
     87                } 
     88        } 
    7489         
    7590        ListForEachEntrySafe(curr, curr2, &journal->checkpointTrans, next) 
     
    7792                ListForEachEntrySafe(currHead, currHead2, &curr->forgetList, next) 
    7893                { 
    79                         BlockWrite(currHead->buffer->device, currHead->buffer); 
    80 //                      KePrint("Wrote %u\n", currHead->buffer->blockNum); 
     94                        WaitForBuffer(currHead->buffer); 
    8195                        ListRemove(&currHead->next); 
     96                        JournalRemoveHeader(currHead); 
    8297                } 
     98                 
     99                INIT_LIST_HEAD(&curr->forgetList); 
    83100                 
    84101                ListRemove(&curr->next); 
    85102        } 
    86          
    87         JournalUnlock(journal); 
     103                 
     104        INIT_LIST_HEAD(&journal->checkpointTrans); 
    88105         
    89106        /* Clean up the tail. */ 
     
    92109        /* Update the superblock. */ 
    93110        JournalUpdateSuperBlock(journal); 
     111 
     112out: 
     113        JournalUnlock(journal); 
    94114         
    95115        return 0;