Changeset 800 for Whitix/branches

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

Add JournalRemoveHeader function, more locking.

Files:
1 modified

Legend:

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

    r786 r800  
    5454        struct JournalHead* ret; 
    5555 
     56        PreemptDisable(); 
     57 
    5658        if (BufferJournal(buffer)) 
    5759        { 
     
    6466                ret->buffer=buffer; 
    6567                INIT_WAITQUEUE_HEAD(&ret->wait); 
     68                INIT_LIST_HEAD(&ret->next); 
    6669                 
    6770                BufferGet(buffer); 
    6871        } 
     72         
     73        ret->refs++; 
     74         
     75        PreemptEnable(); 
     76         
     77//      KePrint("JournalAddHeader = %#X, %u\n", ret, ret->refs); 
    6978 
    7079        return ret; 
     80} 
     81 
     82void JournalRemoveHeader(struct JournalHead* header) 
     83{ 
     84        header->refs--; 
     85         
     86        if (!header->refs) 
     87        { 
     88                PreemptDisable(); 
     89                 
     90                BufferRelease(header->buffer); 
     91                header->buffer->privData=NULL; 
     92                header->buffer->flags &= ~(1 << BUFFER_JOURNAL); 
     93                WakeUp(&header->wait); 
     94                 
     95                free(header); 
     96                PreemptEnable(); 
     97        } 
    7198} 
    7299 
     
    97124        /* Set up timer. */ 
    98125        commitTimer->func=SleepWakeup; 
    99         commitTimer->expires=journal->commitInterval*100000/HZ; 
     126        commitTimer->expires=journal->commitInterval*100000; 
    100127        commitTimer->data=currThread; 
    101128 
     
    137164                ThrSuspendThread(currThread); 
    138165                ThrSchedule(); /* Will return here when the thread is scheduled again */ 
     166                TimerRemove(&commitTimer); 
     167                 
    139168                WaitRemoveFromQueue(&journal->commitWait, &commitWait); 
    140169 
     
    158187 
    159188        oldBuf=JournHeadToBuffer(old); 
    160          
    161189        newBuf=BlockBufferAlloc(oldBuf->device, blockNo); 
    162190 
    163191        /* Buffer is now locked, so copy over the data from old's buffer. */ 
    164         memcpy(newBuf->data, oldBuf->data, oldBuf->device->blockSize); 
     192        memcpy(newBuf->data, oldBuf->data, oldBuf->device->softBlockSize); 
    165193 
    166194        *new=JournalAddHeader(newBuf); 
     
    205233                return NULL; 
    206234 
    207         memset(buffer->data, 0, journal->sectorSize); 
     235        memset(buffer->data, journal->sectorSize, 0); 
    208236 
    209237        return JournalAddHeader(buffer); 
     
    212240int JournalDestroy(struct Journal* journal) 
    213241{ 
    214         /* Shutdown the committer thread. */ 
     242        /* Shut down the committer thread. */ 
    215243        journal->flags|=JOURN_UNMOUNT; 
    216244        WakeUp(&journal->commitWait); 
     
    222250        JournalLock(journal); 
    223251         
    224         JournalCheckpoint(journal); 
     252        while (!ListEmpty(&journal->checkpointTrans)) 
     253                JournalCheckpoint(journal); 
    225254         
    226255        journal->tail=0;